Shapelyは、同一線上にあるセグメントを含め、そのセグメントのいずれかが交差する場合、Polygonを無効として定義します。多くのソフトウェアパッケージは、ここに示すように、同一直線上のセグメントを持つ「カットアウト」を持つ領域または領域を作成します。
>>> 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つの有効なポリゴンとして実装できますが、上記のポイントのリストしかない場合、これを簡単に「修正」できます(これから有効なジオメトリを作成します)ポイントのリスト)?
私は与えられた特定のケースで機能する解決策を見つけました:
>>> 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)]