Geospatial 如何在将MapInfo数据导入PostGIS时避免几何图形问题?

Geospatial 如何在将MapInfo数据导入PostGIS时避免几何图形问题?,geospatial,postgis,mapinfo,Geospatial,Postgis,Mapinfo,我在处理澳大利亚人口普查收集表格时遇到了一个问题。我正在使用将其加载到PostGIS数据库中,这适用于大多数形状,但不是所有形状 我面临的问题的一个简单示例是这样的查询(需要加载NSW数据集): 此查询的结果不是预期的形状,而是NULL 表中没有空值,但存在无效的几何图形。比如说 SELECT cd_code_2006 FROM cd06answ WHERE cd_code_2006 LIKE '1291%' AND NOT st_isvalid(wkb_geometry) 检索值“1291

我在处理澳大利亚人口普查收集表格时遇到了一个问题。我正在使用将其加载到PostGIS数据库中,这适用于大多数形状,但不是所有形状

我面临的问题的一个简单示例是这样的查询(需要加载NSW数据集):

此查询的结果不是预期的形状,而是NULL

表中没有空值,但存在无效的几何图形。比如说

SELECT cd_code_2006 FROM cd06answ 
WHERE cd_code_2006 LIKE '1291%' AND NOT st_isvalid(wkb_geometry)
检索值“1291301”和“1291321”。如果排除无效几何体,则st_联合成功

连接到数据库允许渲染两个有问题的形状。它们应该是几何并集的一部分,所以我需要以某种方式解决这个问题

是否有更好的方法将MapInfo数据加载到PostGIS中?或者某种修复PostGIS内部数据的方法?因为数据库数据呈现正常,所以应该可以保存它,不是吗

编辑:根据Christophe的反馈,我对st_buffer和st_snaptogrid进行了更多的实验。此查询的结果:

SELECT 
    cd_code_2006, 
    st_isvalid(st_buffer(wkb_geometry,0)), 
    st_isvalid(st_snaptogrid(wkb_geometry, 0.00000001)),
    st_isvalid(st_snaptogrid(wkb_geometry, 0.0000001)) 
FROM
    cd06answ 
WHERE 
    cd_code_2006 LIKE '1291%' 
AND
    NOT st_isvalid(wkb_geometry)
对于这两种受影响的几何体,三个st_isvalids中的第一个和最后一个是正确的,中间的一个不是

不幸的是,这两种方法都不能解决工会问题,只能解决一个问题

SELECT st_union(st_buffer(wkb_geometry,0.4)) FROM cd06answ 
WHERE cd_code_2006 LIKE '1291%'
生成几何图形,但

SELECT st_union(st_buffer(wkb_geometry,0.3)) FROM cd06answ 
WHERE cd_code_2006 LIKE '1291%'
没有(我之前尝试过小缓冲区技巧,但没有将其提升到这个级别)


这对于修复来说似乎有点太多了。

尝试在这些无效几何体上运行
st_buffer
(首先使用半径0,然后使用半径0.000000001等)或
st_snaptogrid
,以“修复”它们(链接到文档和)

我看到,当使用
ogr2ogr2
从Mapinfo或其他源导入时,会弹出这些错误(主要是由于精度较高和/或舍入问题)。我认为Postgis开发人员计划包括一个特定的精度减速机功能,但如果我没记错的话,1.4中没有

如果没有帮助,请发布您当前的postgis版本和多边形和投影的wkt版本。多边形无效还有其他可能的原因。

你有没有试着找出什么地方出了问题


/尼古拉斯

谢谢你,克里斯托夫。请参见编辑条目。一个形状的WKT有数千个字符长,我不认为我可以轻易发布。PostGIS是1.5.2,当前的稳定版本。我在使用Postgres 9.0.x的32位Windows堆栈和使用Postgres 8.4.x的64位Ubuntu堆栈上遇到了问题。@Peter Becker:今晚晚些时候(欧洲时间;-)我会发布更多建议。我再次尝试了,我想我也做了同样的事情,但这次成功了。我不知道为什么在我尝试的前几次它不起作用,它可能是PEBKAC的一个案例。@Peter Becker:很高兴它对你起作用了!我发现我忘了添加其他建议…作为noob,我甚至不知道这个函数。这两种几何体都是自交的,奇怪的是,它们位于完全相同的点上。这导致了以下问题:ABS还以ESRI shapefile格式提供这些边界。不确定使用它们是否会获得更好的结果(毕竟,PostGIS附带了一个加载ShapeFile的实用工具)。
SELECT st_union(st_buffer(wkb_geometry,0.3)) FROM cd06answ 
WHERE cd_code_2006 LIKE '1291%'