python - 匀称的 LineString 交集是否错误?

标签 python polygon intersection shapely

在使用 shapely 时,我遇到了一个奇怪的问题。有 2 个点 p1 和 p2,第一个属于多边形,第二个不属于。当我试图找到包含这 2 个点的 LineString 与多边形边界线的端点之间的交点时,我收到消息说没有找到交点。我想知道,这怎么可能?

from shapely.geometry import Polygon as SPolygon, Point, LineString

p1 = Point(5.414213562373095, 2.585786437626905)
p2 = Point(15.17279752753168, -7.172797527531679)

l = LineString([p1, p2])

l1 = LineString([(2, 2), (2, 6)])
l2 = LineString([(2, 6), (6, 6)])
l3 = LineString([(6, 6), (6, 2)])
l4 = LineString([(6, 2), (2, 2)])


sp = SPolygon([(2, 2), (2, 6), (6, 6), (6, 2)])

print "Polygon contains p1:", sp.contains(p1)
print "Polygon contains p2:", sp.contains(p2)

for i, line in enumerate((l1, l2, l3, l4)):
    res = l.intersects(line)
    print "Line {0} intersects l1: {1}".format(i, res) 

这里是输出:

Polygon contains p1: True
Polygon contains p2: False
Line 0 intersects l1: False
Line 1 intersects l1: False
Line 2 intersects l1: False
Line 3 intersects l1: False

最佳答案

我将 l.intersects(line) 更改为 l.intersection(line) 并且我在

处得到了一个交叉点
LINESTRING (6 6, 6 2) at Point (6, 2) 

不确定为什么 .instersects() 表现不同。

然后我四舍五入p1和p2

p1 = Point(round(5.414213562373095, 2), round(2.585786437626905, 2))
p2 = Point(round(15.17279752753168, 2), round(-7.172797527531679, 2))

我在

有 2 个路口
LINESTRING (6 6, 6 2) at POINT (6 2)
LINESTRING (6 2, 2 2) at POINT (6 2)

此修复也适用于 .intersects()(2 个正确)

Shapely 对浮点精度有点敏感,我通常可以通过舍入来解决问题。尽管这对您来说可能无法接受。

关于python - 匀称的 LineString 交集是否错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55805121/

相关文章:

python - 在二维 numpy 数组中查找公共(public)元素

java - 仅渲染与主圆相交的圆的段/区域

python - Fedora 22 : ERROR: No module named '_rpmb' while building docker

python - 使用列表中的值替换列中的值

java - 如何在Java中绘制像素完美的旋转矩形?

JavaFX 修改多边形

java - 创建顶部和底部有点的六边形

python - Conda:当前 osx-64 channel 中缺少依赖项

python - Flask 登录和注销

Java Android Rectangle.intersects 在循环中无法正常工作