我正面临着处理澳大利亚人口普查收集形状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%'
没有(我之前尝试过小缓冲技巧,但没有把它推到这个级别)。
对于修复来说,这似乎有点太多了。
答案 0 :(得分:2)
尝试在这些无效的几何图形上运行st_buffer
(首先是半径0,然后是0.000000001等)或st_snaptogrid
来“修复”它们(链接到文档here和{{3} })。
我在使用ogr2ogr2
从Mapinfo或其他来源导入时出现了这些错误(主要是由更高的精度和/或舍入问题引起)。我认为Postgis开发人员计划包括一个特定的精确减速器功能,但如果我没记错,1.4中没有。
如果这没有用,请发布您当前的postgis版本和多边形和投影的wkt版本。多边形无效还有其他可能的原因。
答案 1 :(得分:1)