私はOpenStreetMapsデータを使って遊んでいます。 Postgis 2.2でPostgres 9.4に浸透され、ways
テーブル用に構築された線ストリングのジオメトリが付いています。無効な線ストリングから領域を作成する(またはエラーを防ぐ)方法
私はポリゴンを特定したいと思っています(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ジオメトリ)、このような無効な関係のため、結果のない最初のエラーでは死ぬことはありません。
EDIT:元の例はOSMデータで修正されています。ここに新しい例があります:関係ID 5636774は自己交差する多角形です
無効なgeomにはST_MakeValid(geom)関数を使用できます。 –