【发布时间】:2016-08-06 02:46:57
【问题描述】:
我正在使用 OpenStreetMaps 数据。由 Osmosis 加载到带有 Postgis 2.2 的 Postgres 9.4 中,并为 ways 表构建了线串几何图形。
我想从某些relations 制作多边形(在 OSM 中,关系是一组方式(线串) - 一些标记为外部,一些标记为内部,并非所有方式都必须关闭 - 多种方式一起可以代表外环)。但 OSM 数据并不完美 - 存在不良关系,内部“孔”与外环相交。例如:http://www.openstreetmap.org/relation/6095901#map=17/48.93209/19.14858
我正在尝试这个查询
SELECT ST_BuildArea(ST_Collect(w.linestring)) AS geom
FROM relations r
JOIN relation_members rm ON r.id = rm.relation_id AND rm.member_type = 'W'
JOIN ways w ON w.id = rm.member_id
WHERE r.id = 6095901 -- in reality here is broad condition on relation
GROUP BY r.id
结果是错误:
ERROR: LWGEOM_GEOS_buildArea: TopologyException: Input geom 1 is invalid: Self-intersection at or near point 19.149718131981164 48.934732947538478 at 19.149718131981164 48.934732947538478
那么,我在这里有哪些选择?理想情况下,我想以某种方式“解决这个问题”——也许忽略有问题的“洞”,或者将它们“夹”到外环边界等。
如果不可能,至少我希望查询“跳过”(返回 NULL 几何)以获取这样的无效关系,并且不会因第一个错误而没有结果而死。
编辑:原始示例案例已在 OSM 数据中修复。这是新示例:关系 ID 5636774 是自相交多面体
【问题讨论】:
-
您可以使用 ST_MakeValid(geom) 函数来处理无效的几何图形。
标签: postgresql openstreetmap postgis