将多个shapefile批量加载到PostGIS中


33

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

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

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


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

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

Answers:


22

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

在此处输入图片说明


32

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

第一步,创建SQL加载器文件(我还假定您具有4326 ..的纬度/经度WGS84数据。将其更新为您的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

bashPOSIX用户(Linux,Mac OS X等)的等效项是这样的:

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

会在一个循环中更好地工作for f in *.shp do shp2pgsql -s 4326 %f public.'basename $f .shp' > 'basename $f .shp'.sql | psql -h myserver -d mydb -U myuser done
吗?

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

4

您还可以使用此单个命令,这有助于简化循环,并且不需要单独创建.sql,

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.