我在处理澳大利亚统计局以 MapInfo 格式提供的澳大利亚人口普查集合形状时遇到了问题。我正在使用ogr2ogr 工具将这些加载到 PostGIS 数据库中,该工具适用于大多数形状,但不是全部。
我面临的问题的一个简单示例是这样的查询(需要加载 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 成功。
将Quantum GIS连接到数据库可以渲染两个有问题的形状。它们应该是几何联合的一部分,所以我需要以某种方式解决问题。
有没有更好的方法将 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%'
没有(我之前尝试过小缓冲技巧,但没有将它推到这个水平)。
这对于修复来说似乎有点太多了。