QGIS,Postgis:几何类型与列类型不匹配


30

我正在尝试通过SPIT将一些多边形shapefile导入QGIS中的Postgis。其中之一无法导入并返回此错误:

ERROR: Geometry type (Polygon) does not match column type (MultiPolygon)

我试图将SPIT widnow中该表中的属性“功能类”从MULTIPOLYGON更改为POLYGON,但没有任何反应。

有什么方法可以使Postgis接受两种类型(多边形和多面体)?或者,也许我能以某种方式将shapefile的几何形状从多边形转换为多多边形?有任何想法吗?

我在Windows中尝试过Qgis 2.0.1,在ArchLinux中尝试过Qgis 2.3。

Answers:


14

无需维护吐痰,因此不再建议使用。我建议使用处理工具箱并选择“导入PostGIS”算法。使用该例程,我还有更多的运气。注意事项:

  • 数据库(连接名称)参数必须与您在“添加PostGIS图层”对话框中为数据库连接命名的名称匹配。
  • 模式必须已经存在-不会自动创建

它运作完美。谢谢。我也用DB Manager加载了这个shapefile。首先,我通过SPIT向其他层加载了Multipolygon,然后在DBM(导入层/文件)中用POLYGON层覆盖了它。它也可以。
dmh126 2014年

该数据库不会显示(即使在Windows上的QGIS 2.10中具有相同的名称)
Menelaos Kotsollaris 2015年

19

这似乎是一个无法解决的已知问题:请参阅http://hub.qgis.org/issues/5328

如果需要解决方法,请尝试将表格的“几何”列类型更改为通用的“几何”:

ALTER TABLE my_table ALTER COLUMN geom SET DATA TYPE geometry;

导入完成后,您可以返回到MultiPolygon

ALTER TABLE my_table ALTER COLUMN geom 
    SET DATA TYPE geometry(MultiPolygon) USING ST_Multi(geom);

或者,尝试使用ogr2ogr加载数据。


支持您的答案@dbaston。比我的好 :)
sfletche 2014年

19

我使用ogr2​​ogr自动将shapefile提取到PostGIS数据库中。特别是对于问题,请使用以下选项:

-nlt PROMOTE_TO_MULTI

这将迫使ogr2ogr将POLYGON几何形状提升为MULTIPOLYGON,从而避免了该错误。一个非常简单的例子:

ogr2ogr -f "PostgreSQL" PG:"dbname='<my_db>'" -nlt PROMOTE_TO_MULTI <shapefile>

我省略了pgsql主机/身份验证的详细信息。要批处理多个shapefile,您可以执行以下操作:

find ./ -name *.shp | xargs -n1 ogr2ogr <ogr2ogr args omitting the shapefile>

这有效并且比其他答案容易。它值得投票。
Joe Germuska

5

尽管我确实尝试使用“导入PostGis”算法来解决该问题,但并没有成功(我的数据库未出现在列表中-我使用的是QGIS 2.10)。

相反,我使用了shp2pgsql,它是一个简单的命令提示符任务,如下所述:

  • 打开命令提示符(以管理员身份
  • 转到PostgreSQL / bin文件夹,该文件夹应如下所示: C:\Program Files\PostgreSQL\9.4\bin>
  • 只需将.shp文件复制并粘贴到此目录即可。(我复制了整个文件夹和.shp文件。
  • 在命令提示符处键入以下:shp2pgsql -s 4326 MyShpDir/MySHPFile.shp> MYSQLFile.sql其中,MyShpDir目录,4326是WGS84的SRID这样的变化,如果你使用的是不同的SSID,MySHPFile.shp您的特定文件(MYSQLFile将自动创建)。显然,对要转换的所有文件都执行此操作。文件将保存在您的当前目录中(C:\Program Files\PostgreSQL\9.4\bin以我为例)

然后,只需将SQL文件复制并粘贴到PLSQL数据库中即可。

此外,还有一个很酷的事情,shp2pgsql就是您可以通过在命令中添加参数来立即在表中创建索引I,如下所示:

shp2pgsql -s 4326 -I MyShpDir/MySHPFile.shp> MYSQLFile.sql

利润!:)


3

是的,您可以通过向表中添加以下约束来告诉PostGIS接受任何几何类型(多边形,多边形,点,线串等)。

对于PostGIS 2.x(使用通用Geometry typemod)

ALTER TABLE my_table ALTER COLUMN geom TYPE geometry(Geometry,4326);

先前的答案(对于使用约束的PostGIS 1.x)

CONSTRAINT enforce_geometry_type CHECK (geometrytype(geom) = 'MULTIPOLYGON'::text OR geometrytype(geom) = 'POLYGON'::text OR geom IS NULL)

CONSTRAINT或附近的语法错误。我已经尝试过SET CONSTRAINTS,但是在CHECK附近却遇到了相同的错误。
dmh126 2014年

您使用的是哪个版本的Postgis?
sfletche 2014年

Postgis 2.1 for PostgreSQL 9.3
dmh126'4

尝试使用enforce_geotype_geom而不是enforce_geometry_type。让我知道是否可行,如果可行,我会对其进行编辑。
sfletche 2014年

没用 同样的错误。
dmh126 2014年

2

我尝试了“导入PostGIS”算法解决方案,但发现该方法也不起作用。我找到的最简单的解决方案是转到“ 数据库” >“ 数据库管理器”,导航到数据库,然后单击“ 导入层/文件”(向下箭头)按钮。

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.