多边形交叉线| Python身材匀称

Lis*_*isa 9 python intersection polygon line shapely

我一直试图使用shapely来找到一条直线和一个多边形的交集,但是我遇到了一些浮点数的问题.

示例代码:

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
Run Code Online (Sandbox Code Playgroud)

我期望的是两个顶点的列表.

第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)]
Run Code Online (Sandbox Code Playgroud)

我还检查了我正在看的边缘是否有一个交叉点:

>>> edge = shapely.geometry.LineString([(3.0, -3.0), (4.0, -2.0)])
>>> edge.intersects(shapely_line)
False
Run Code Online (Sandbox Code Playgroud)

如果我用(4.0,-2.000000000000000)替换(4.0,-2.0000000000000004),则边缘交点将评估为True.

有没有人对正在发生的事情或我错过的事情有任何想法?谢谢!

在此输入图像描述

编辑:

我使用了匀称版本1.12和3.3.1,3.3.5,3.3.6,3.3.7的地理位置进行了测试.

如果有人对我如何更新Windows上的地理版本感到好奇:

从GEOS网站下载了geos- [version] .tar.bz2.使用Visual Studio 10 Win64生成器提取文件并在其上运行CMake.打开.sln文件并构建它然后移动生成的geos_c.dll并将其粘贴到Python目录中已经安装好geos_c.dll的地方.

flu*_*lup 5

Shapely 构建在 C++ GEOS 库的 C 包装之上。在这个 C++ 库深处的某个地方,有处理舍入误差的 Precision 类。我认为我们可以得出结论,您的 Shapely 版本和 geos 库以不同的方式处理这种情况。不幸的是,访问精度模型的代码在 C api 中不可用,因此在 Shapely 中也不可用。请参阅http://lists.gispython.org/pipermail/community/2011-February/002898.html

不过,更改为更高版本的 geos 可能会解决您的问题。它在我的机器上运行良好,具有 shapely 1.2.16 和 libgeos 3.3.5-CAPI-1.7.5。