web-dev-qa-db-ja.com

Shapelyの無効なポリゴンを修正する

Shapelyは、同一線上にあるセグメントを含め、そのセグメントのいずれかが交差する場合、Polygonを無効として定義します。多くのソフトウェアパッケージは、ここに示すように、同一直線上のセグメントを持つ「カットアウト」を持つ領域または領域を作成します。

enter image description here

>>> pp = Polygon([(0,0), (0,3), (3,3), (3,0), (2,0), 
                  (2,2), (1,2), (1,1), (2,1), (2,0), (0,0)])
>>> pp.is_valid
WARNING:shapely.geos:Self-intersection at or near point 2 0
False

当然、カットアウトはShapelyでネイティブに実装できます。または、この同じジオメトリを2つの有効なポリゴンとして実装できますが、上記のポイントのリストしかない場合、これを簡単に「修正」できます(これから有効なジオメトリを作成します)ポイントのリスト)?

31
jpcgt

私は与えられた特定のケースで機能する解決策を見つけました:

>>> pp2 = pp.buffer(0)
>>> pp2.is_valid
True
>>> pp2.exterior.coords[:]
[(0.0, 0.0), (0.0, 3.0), (3.0, 3.0), (3.0, 0.0), (2.0, 0.0), (0.0, 0.0)]
>>> pp2.interiors[0].coords[:]
[(2.0, 1.0), (2.0, 2.0), (1.0, 2.0), (1.0, 1.0), (2.0, 1.0)]
37
jpcgt