使用ogr2​​ogr将shapefile导入postgis会给出:无法打开数据源


12

我想使用ogr2​​ogr以便在postgis数据库中导入shapefile。我已经成功安装了ogr2ogr,并且从pgsql运行了以下命令:

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=user_1 password=***** dbname=imports" world_boundaries.shp

我得到的是一条错误消息:

Unable to open datasource `world_boundaries.shp' with the following drivers: --a list of drivers follows (ESRI Shape File etc.)

我也尝试定义了shapefile的完整路径,但得到了相同的消息。

我也尝试运行:

ogrinfo world_boundaries.shp

一样。


解决文件权限问题后,出现以下错误:

  ERROR 1: AddGeometryColumn failed for layer world_boundaries, layer creation has failed.
  ERROR 1: Terminating translation prematurely after failed
  translation of layer world_boundaries (use -skipfailures to skip errors)

我也尝试通过GUI shp2pgsql导入它,并且出现以下错误:

ALTER TABLE "public".""
Failed in pgui_exec(): ERROR:  permission denied for relation spatial_ref_sys
 CONTEXT:  SQL statement "SELECT SRID         FROM spatial_ref_sys WHERE SRID = new_srid"
PL/pgSQL function addgeometrycolumn(character varying,character   varying,character varying,character varying,integer,character varying,integer,boolean) line 50 at SQL statement
 SQL statement "SELECT AddGeometryColumn('',$1,$2,$3,$4,$5,$6,$7)"
 PL/pgSQL function addgeometrycolumn(character varying,character  varying,character varying,integer,character varying,integer,boolean) line 5 at     SQL statement

Shapefile import failed.

这次的问题是该数据库用户没有足够的权限。这修复了它:

GRANT ALL ON TABLE spatial_ref_sys TO my_user_name;

下一条错误消息是:

  Warning 1: Geometry to be inserted is of type 3D Multi Polygon, whereas the layer geometry type is 3D Polygon.
 Insertion is likely to fail
 ERROR 1: INSERT command for new feature failed.
 ERROR:  Geometry type (MultiPolygon) does not match column type (Polygon)

所以看来我需要使用参数:-nlt MULTIPOLYGON但是,当我这样做时,我又遇到了另一个错误,这对我来说没有任何意义:

ERROR 1: PostgreSQL driver doesn't currently support database creation.
Please create database with the `createdb' command.
PostgreSQL driver failed to create PG:host=localhost user=my_user_name dbname=my_database password=password -nlt POLYGON

但是它是使用shp2pgsql GUI加载的。


@elrobis的评论使此方法最终得以工作。数据已正确加载到db中!

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=geonode dbname=geonode_imports password=geonode" -nlt GEOMETRY wld_bnd_adm0_gaul_2015.shp

听起来您的shapefile无效。它可以在其他软件中工作吗?
Evil Genius

1
是。将其正确加载到QGIS中。
user1919

1
另外,假设您的数据库已经存在并且在您的ogr2ogr指令中正确拼写了该命令,并且该命令中的postgres用户具有必要特权的完整补充(SELECT,INSERT,UPDATE,CREATE等),请尝试添加-nln layername参数,也许一起-overwrite看看是否涉及到生活。另外,如果我是你,我会sudo与我的postgres超级用户一起运行ogr2ogr,以便超级确定排除权限和特权。一旦您的脚本是可靠的,那么您就可以查看讨厌的权限。:)
elrobis

3
谢谢。添加-nlt GEOMETRY而不是-nlt POLYGON可以解决问题。
user1919

1
很高兴它起作用。我将继续进行回答,并给出正确的回答,该回答还说明了我认为它起作用的原因。
elrobis '16

Answers:


17

正如您通过反复试验发现的那样,几乎没有需要解决的棘手问题,而最后一个问题是使用ogr2​​ogr的-nlt GEOMETRY*参数解决的。

*请注意@LeeHachadoorian的注释中的建议,该建议-nlt PROMOTE_TO_MULTI将用作默认解决方案,而不是nlt GEOMETRY,因为前者在促进附带好处的同时还促进了最佳实践。

用户权限和错误消息

首先,ogr2ogr无法打开您的shapefile,您意识到权限问题实际上影响了OS用户访问shapefile。但是对于其他人来说,这里有一个重要的教训,特别是在这一点上ogr2ogr的错误消息具有误导性!确实,第一批评论者中的一个认为您的shapefile是无效的,并且坦率地说,我的第一个猜测是路径/文件名中可能存在错误/错字,或者文件路径中可能存在非常规字符,例如空间-破坏了ogr2ogr指向shapefile的能力。正如您所发现的,这实际上只是用户权限的问题。由于错误消息会产生红色鲱鱼,因此这是其他人需要牢记在心的可能性。:)

SQL用户权限和神秘故障

我会被第二个错误困扰很久,但是通过使用另一种聪明的导入实用程序(shp2pgsql)测试您的SQL用户,您得到了一条更精确的错误消息,并为您的SQL用户赋予了spatial_ref_sys表必要的特权。因此,如果某人无法顺利执行其ogr2ogr导入指令,则应确保其SQL用户在数据库本身 “ spatial_ref_sys”表上均具有足够的特权。

混合几何类型和最佳做法

您遇到的最后一个障碍似乎与shapefile允许单部分和多部分几何图形共存于同一数据集/文件中有关。在同一表中混合几何类型被认为是不好的做法,即使对于同一要素类型的单个/多个部分也是如此,默认情况下,工具链中的开源播放器将尝试保护您避免混合几何类型。幸运的是,它们为您提供了一些选择。最初,我建议在ogr2ogr指令上设置-nlt GEOMETRY*参数,尽管ESRI的约定较为宽松,但该参数允许您导入面数据集。但请注意,这意味着您的表中可能同时具有单部分和多部分的几何形状,这可能会给以后的工作带来麻烦!

值得一提的是,-nlt您应该考虑使用ogr2ogr另一个选择PROMOTE_TO_MULTI。引用文档 ..

从GDAL 1.10开始,PROMOTE_TO_MULTI可用于自动升级将多边形或多面体混合为多面体的层,以及将线串或多线串混合为多线串的层。将shapefile转换为实现对几何类型的严格检查的PostGIS和其他目标驱动程序时,可能会很有用。

换句话说,如果使用该PROMOTE_TO_MULTI标志,那么即使您的所有功能都由一个零件组成,也将全部转换为多部分的功能。正如@LeeHachadoorian在评论中指出的(我敢肯定,大多数人都会同意),建议您优先选择PROMOTE_TO_MULTI宽松的GEOMETRY标志,因为它符合最佳实践,可以统一表中的要素几何。基本上,您编写的任何代码都应该具有多部分的几何形状。诚然,这可以更清洁并简化某些开发。

某人对SHP有麻烦的一般建议以进行POST导入

  1. 确保您的路径中没有任何时髦的字符,并且路径或文件名中没有错别字或拼写错误
  2. 正如@ user1919发现的,请确保您的OS用户具有足够的特权来访问shapefile!正如他们演示的那样,尝试在其他软件(例如QGIS)中打开shapefile可能会有所帮助-如果它在一个软件中工作,则表示它没有损坏,并且在其他软件中也可以工作。

首先,考虑sudo对排除权限问题执行ogr2ogr命令,直到确定脚本可以按预期工作为止。

  1. 同样,正如@ user1919所意识到的那样,请确保您的SQL用户对脚本所针对的数据库以及spatial_ref_sys表都具有足够的特权。

同样,首先,请考虑在此处使用PostGRESql超级用户来排除SQL特权问题,直到脚本可以正常工作为止。如果您的脚本与超级用户一起使用,然后对于首选的自动化用户失败,则您知道问题与SQL用户有关,与您的数据或环境(gdal / ogr安装等)无关。

  1. 尝试将-nlt标志设置为PROMOTE_TO_MULTIGEOMETRY。由于shapefile允许使用较宽松的要素类型约定,因此有时您必须指示开源实用程序更加适应:)

  2. 如果您要导入PostGRESql或MySQL,请尝试设置-lco PRECISION=no..fair warning,我不完全理解此参数的作用,但这是我的经验。.如您所知,shapefile通常包含SHAPE_LENGTHand SHAPE_AREA字段,而我有时,我在遇到神秘故障时会注意到,如果删除这些字段,则可以使数据正确导入。但是,如果使用-lco PRECISION=no,则无需删除这些字段就可以导入数据。我的建议是将此参数用作故障排除步骤,但要在您接受生产解决方案中的导入之前了解它真正解决了什么问题。

  3. 最后,如果您使用的是MySQL,请注意某些非常大的特征几何可能会违反MySQL的max_allowed_packet参数。您可以在MySQL驱动程序的文档中阅读有关此内容的更多信息。但是解决方案是更改MySQL配置以允许使用比默认值大的值。

示例SHP到ogr2ogr的PostGIS导入命令

为了让任何新手都在这里徘徊,这就是我使用ogr2​​ogr导入SHP的大部分内容。请注意,我将文件路径/名称用引号引起来,这可以防止空格,怪异字符和在终端上的换行。 FID字段和图层名称:

ogr2ogr -f "PostgreSQL" "PG:host=127.0.0.1 user=myuser dbname=mydb password=mypassw0rd" "C:/path/to/some_shapefile.shp" -lco GEOMETRY_NAME=the_geom -lco FID=gid -lco PRECISION=no -nlt PROMOTE_TO_MULTI -nln new_layername -overwrite


3
关于-nlt PROMOTE_TO_MULTI,这确实是多边形几何的最佳实践。我建议更改您的答案以建议您将其作为强力的默认选择,只有在经过仔细考虑后才能违反。我也强烈建议不要使用通用geometry类型来处理混合的多边形/多多边形,除非用户/开发人员真正知道他们在做什么,并且需要混合使用多边形,线和点类型。
李·哈查多里安(Le Hachadoorian),2016年

1
@LeeHachadoorian,表示同意。我按照建议编辑了答案。在我的辩护中,PROMOTE_TO_MULTI是足够新的内容(GDAL 1.10),我仍然默认使用在开始所有这些操作时可以使用的原始解决方案。:) ..为了公平起见,shapefile只将单个和多部分类型组合在一起,因此永远不会出现ogr2ogr推入shp -nlt GEOMETRY并构建包含点,线多边形的表格的情况:))))))但是,我完全同意你在此问题上的立场。
elrobis '16

1
Shapefile允许使用其Polygon类型的多个多边形。他们甚至没有MultiPolygon类型。因此,即使只是遇到这种形状文件,也需要使用它-nlt PROMOTE_TO_MULTI来完成这项工作。
CMCDragonkai
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.