【问题标题】:How do I avoid geometry issues when importing MapInfo data into PostGIS?将 MapInfo 数据导入 PostGIS 时如何避免几何问题?
【发布时间】:2011-01-26 23:11:02
【问题描述】:

我在处理澳大利亚人口普查集合形状provided in MapInfo format by the Australian Bureau of Statistics 时遇到问题。我正在使用 ogr2ogr tool 将这些加载到 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%'

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

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

【问题讨论】:

  • ABS 还以 ESRI shapefile 格式提供这些边界。不确定使用它们是否会得到更好的结果(毕竟 PostGIS 捆绑了一个加载 shapefile 的实用程序)。

标签: geospatial postgis mapinfo


【解决方案1】:

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

我看到从 Mapinfo 或其他来源导入 ogr2ogr2 时弹出这些错误(基本上是由更高的精度和/或舍入问题引起的)。我认为 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:很高兴它对你有用!我发现我也忘了添加其他建议...
【解决方案2】:

你好

您是否尝试过ST_IsValidReason(geometry) 来了解问题所在?

/尼克拉斯

【讨论】:

猜你喜欢
  • 2017-09-05
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多