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

时间:2011-01-26 23:11:03

标签: geospatial postgis mapinfo

我正面临着处理澳大利亚人口普查收集形状provided in MapInfo format by the Australian Bureau of Statistics的问题。我使用ogr2ogr tool将它们加载到PostGIS数据库中,Quantum GIS适用于大多数形状,但不适用于所有形状。

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

SELECT st_union(wkb_geometry) FROM cd06answ WHERE cd_code_2006 LIKE '1291%'

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

表中没有空值,但存在无效的几何。例如

SELECT cd_code_2006 FROM cd06answ 
WHERE cd_code_2006 LIKE '1291%' AND NOT st_isvalid(wkb_geometry)

检索值'1291301'和'1291321'。如果我排除无效的几何,则st_union会成功。

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

有更好的方法将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%'

没有(我之前尝试过小缓冲技巧,但没有把它推到这个级别)。

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

2 个答案:

答案 0 :(得分:2)

尝试在这些无效的几何图形上运行st_buffer(首先是半径0,然后是0.000000001等)或st_snaptogrid来“修复”它们(链接到文档here和{{3} })。

我在使用ogr2ogr2从Mapinfo或其他来源导入时出现了这些错误(主要是由更高的精度和/或舍入问题引起)。我认为Postgis开发人员计划包括一个特定的精确减速器功能,但如果我没记错,1.4中没有。

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

答案 1 :(得分:1)

你有没有尝试ST_IsValidReason(geometry)来弄清楚出了什么问题?

/尼克拉斯