我已经有一百多个shapefile格式的数据层,我想上传到PostGIS数据库中。它们都在同一投影中,但是代表不同的数据层,因此它们没有相同的架构。

将所有这些文件批量转换为我的PostGIS数据库(在Windows 7 OS上)的最省时的方法是什么?

更新:批量导入pgAdmin3“ PostGIS shapefile uploader”(如下所述)现在默认情况下可用于PostGIS 2.0。

评论

我正在寻找类似的答案。但是我想使它每晚运行一次批处理作业。实际上,我想使PostGIS成为ArcSDE的从属设备(暂时)。作为PostGIS和SQL的新手,我得到了cmd.exe脚本会做的事情,但是不知何故它不在我的脑海。我想要做的是获取一系列从ArcSDE导出为批处理作业的shp文件,然后将它们上传到我的PostGIS中,这将覆盖已经存在的现有gis /表。

我将以“如何从ArcSDE到PostGIS批量同步数据的方式”作为一个新问题提出这个问题。可能会有一些有趣的想法。

#1 楼

如果要坚持使用GUI,则较新版本的pgAdmin具有Shapefile Loader,可以用作批量加载



#2 楼

如果您使用的是Windows计算机,则可以使用带有一些深奥的for循环的优质'ol CMD.EXE。确保在仅包含需要加载的shp / sql文件的“包含”目录中执行此操作。

第一步,创建SQL加载器文件(我还假定您有Lat / Long WGS84 4326 ..将数据更新到您的SRS):

for %f in (*shp) do shp2pgsql -s 4326 %f public.%~nf > %~nf.sql


然后检查您的SQL文件以确保它们看起来不错,然后执行类似的循环:

for %f in (*sql) do psql -h myserver -d mydb -U myuser -f %f > nul



POSIX民谣(Linux,Mac OS X等)的bash等效项如下:

for f in *.shp
do
    shp2pgsql -s 4326 %f public.`basename $f .shp` > `basename $f .shp`.sql
done


然后

for f in *.sql
do
    psql -h myserver -d mydb -U myuser -f $f > /dev/null
done


,或者将两个部分都管道成一个循环,如果不需要保留临时.sql文件:

for f in *.shp
do
    shp2pgsql -s 4326 %f public.`basename $f .shp` | psql -d mydb > /dev/null
done


评论


在* .shp中的f可以在单个循环中更好地工作吗?shp2pgsql -s 4326%f public.'basename $ f .shp'>'basename $ f .shp'.sql | psql -h myserver -d mydb -U myuser完成

– Sam007
2012年11月21日23:47



是的,只要您确定传递给psql的SQL是正确的,就可以在一个命令中完成(但没有>重定向部分,因为这会破坏|管道部分)。我认为这不是更好,因为没有SQL格式的数据记录。

– Mike T
2012年11月22日0:37



#3 楼

您还可以使用此单个命令来帮助简化循环,也不需要单独创建.sql。

for f in *.shp
    do shp2pgsql -c -D -s 4326 -I $f public.${f%.*} | psql -h hostname -d dbname -U usrname
done


#4 楼

您可能还想看看SPIT,它是QGIS的PostGIS加载器插件。

评论


以为我可能会因为您的链接已死而重新发布该链接:docs.qgis.org/1.8/html/en/docs/user_manual/plugins/…

–阿赫洛耶斯
13年8月20日在21:19