11

ラインとポリゴンの交点を見つけるためにシェイプリーを使用しようとしていますが、いくつかの浮動小数点数に問題があります。

コード例:

polygon = [(4.0, -2.0), (5.0, -2.0), (4.0, -3.0), (3.0, -3.0), (4.0, -2.0)]
shapely_poly = shapely.geometry.Polygon(polygon)

line = [(4.0, -2.0000000000000004), (2.0, -1.1102230246251565e-15)]
shapely_line = shapely.geometry.LineString(line)

intersection_line = list(shapely_poly.intersection(shapely_line).coords)
print intersection_line

私が期待するのは、2 つの頂点のリストです。

ポイント 1: ポリゴンの内側にあるポイント、またはこの場合は (4.0, -2.0000000000000004)。

ポイント 2: [(4.0, -2.0000000000000004), (2.0, -1.1102230246251565e-15)] と [(3.0, -3.0), (4.0, -2.0)] の交点。

ただし、私が受け取る結果は次のとおりです。

[(4.0, -2.0000000000000004)]

また、見ているエッジとの交差があるかどうかも確認しました。

>>> edge = shapely.geometry.LineString([(3.0, -3.0), (4.0, -2.0)])
>>> edge.intersects(shapely_line)
False

(4.0, -2.0000000000000004) を (4.0, -2.000000000000000) に置き換えると、エッジの交差は True と評価されます。

何が起こっているのか、何が欠けているのか、誰にもアイデアがありますか? ありがとう!

ここに画像の説明を入力

編集:

私は格好の良いバージョン 1.12 と 3.3.1、3.3.5、3.3.6、3.3.7 の geo を使用してテストしました。

Windowsでgeosバージョンをどのように更新したかについて誰かが興味を持っている場合:

GEOS Web サイトから geos-[バージョン].tar.bz2 をダウンロードしました。ファイルを抽出し、Visual Studio 10 Win64 ジェネレーターを使用して CMake を実行しました。.sln ファイルを開いてビルドし、生成された geos_c.dll を移動して、geos_c.dll が Python ディレクトリに適切にインストールされた場所に貼り付けました。

4

1 に答える 1

4

Shapely は、C++ GEOS ライブラリの C ラッパーの上に構築されています。この C++ ライブラリのどこかに、丸め誤差を処理す​​る Precision クラスがあります。お使いのバージョンの Shapely と geos ライブラリでは、このケースを別の方法で処理すると結論付けることができると思います。残念ながら、精度モデルにアクセスするコードは C API では使用できないため、Shapely でも使用できません。http://lists.gispython.org/pipermail/community/2011-February/002898.htmlを参照してください。

ただし、ジオの上位バージョンに変更すると、問題が解決する場合があります。私のマシンでは、格好の良い 1.2.16 と libgeos 3.3.5-CAPI-1.7.5 で問題なく動作します。

于 2013-01-22T00:11:30.977 に答える