11

我一直在尝试使用 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

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

点 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。

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

在此处输入图像描述

编辑:

我已经使用 shapely 版本 1.12 和 3.3.1、3.3.5、3.3.6、3.3.7 的 geos 进行了测试。

如果有人对我如何在 Windows 上更新 geos 版本感到好奇:

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

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

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

于 2013-01-22T00:11:30.977 回答