1

地球上の自己交差 (複雑) ポリゴンの領域を見つけようとしています。そのようなジオメトリの面積計算を正しく実装するライブラリはありますか?

これまでのところ、 geographiclibPolygon2 ( gpcに基づく) を試しましたが、複雑なポリゴンに対して間違った結果が得られます。

別の方法として、単純なジオメトリのアルゴリズムを使用してすべてのポリゴンを合計できるように、自己交差ポリゴンを一連の単純なポリゴンに変換する簡単な方法はありますか? Bentley-Ottman アルゴリズムを実装して交点を見つけ、ポリゴンを単純なポリゴンのセットに分割することが解決策になることはわかっていますが、使用できるライブラリがあれば、車輪の再発明は喜んで避けたいと思います (そして、おそらくバグ)。

更新:私が使用している座標には、交点が明示的に含まれていません。そのため、クリッピング ライブラリはそれらを適切に処理していないようです。たとえば、次のコードcoords_1coords_2は、同じポリゴンを定義します。Polygon2 クリッピング ライブラリを使用します。

>>> coords_1 = [(0,0), (1,1), (1,0), (0,1)]
>>> coords_2 = [(0,0), (0.5, 0.5), (1,0), (1,1), (0.5,0.5), (0,1)]
>>> Polygon(coords_1).area()
0
>>> Polygon(coords_2).area()
0.5

coords_1 を使用して、2 番目の結果を取得したいと思います。他のクリッピング ライブラリも試しましたが、今のところうまくいきません。

4

2 に答える 2

3

おおよその解決策は、ポリゴンを平面にマッピングし、平面ジオメトリ ライブラリを使用して計算ジオメトリを実行することです。この近似は、球体全体に比べて小さいポリゴンに対して非常にうまく機能するはずです。ただし、大きなポリゴンの場合でも、ポリゴンを十分に改良することで、任意の精度にすることができます。

残念ながら、本質的に球形の操作のためのライブラリ機能はあまりないと思います。

編集:これは、あなたが望むことをすると思う格好の良い解決策です:

from shapely.geometry.polygon import  LinearRing, Polygon

coords_1 = [(0,0), (1,1), (1,0), (0,1)]
##coords_1 = [(0,0), (0,1), (1,1), (1,0)]

lr = LinearRing(coords_1)

if lr.is_valid:
    print Polygon(lr).area
else:
    print Polygon(coords_1).buffer(0).area + Polygon(coords_1[::-1]).buffer(0).area
于 2014-01-13T14:29:21.347 に答える
1

緯度/経度のポリゴンを変換して、ユークリッド平面でうまく機能させます。次に、http://sourceforge.net/projects/polyclipping/のようなものを使用します。

于 2014-01-13T15:35:55.350 に答える