5

私は間違った方法で考えているのか、それともバグなのか疑問に思っています:

ラインストリングとポリゴンがあり、ラインとポリゴンの境界の交点を作成します

ここに画像の説明を入力

これらの交点は、ポリゴンの境界と交差する (少なくとも接触する) 必要がありますよね?

from shapely import geometry,wkt
line = geometry.LineString([(13.51039642756912, 52.598912814414675), (13.525173800277184, 52.60620240344557)])
poly = geometry.Polygon ([(13.52072838433517, 52.61735554606274), (13.52233276805985, 52.59511541819082), (13.51312087418833, 52.59394589806786),( 13.51526963068252, 52.60338701649216),( 13.51836560008325 ,52.6009395669487), (13.52072838433517, 52.61735554606274)])

ips = line.intersection(poly.boundary)
for i in ips:
    print i.touches(poly.boundary)  # should touch but it doesnt!!!!

>>>False
4

1 に答える 1

7

これはバグではありませんが、よくある質問です。

精度モデルがない場合、すべての浮動小数点計算はマシンの epsilonによって制限されます。交点は各ジオメトリから補間され、正確である可能性はほとんどありません (直角でない限り)。現在、'touches' などのDE-9IM述語はすべて正確なノードを必要とします (精度モデルがない限り、いつか発生する可能性があります。更新: JTS Topology Suiteでテストすると、DE-9IM 述語は精度モデルを使用しないため、 GEOS クローンが異なる動作をする可能性はほとんどありません)。

より堅牢な戦略は、2 つの間の距離をテストすることです。交差する場合、マシンのイプシロンよりも小さいはずです。例えば:

EPS = 1e-15
for i in ips:
    print(i.distance(poly) < EPS)
于 2015-11-24T17:26:30.687 に答える