多边形与线的交集 | Python 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
我期待的结果是两个顶点的列表。
第一个点:应该在多边形内部的点,或者说在这个例子中是(4.0, -2.0000000000000004)。
第二个点:是[(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和geos的3.3.1、3.3.5、3.3.6、3.3.7版本。
如果有人好奇我是怎么在Windows上更新geos版本的:
我从GEOS网站下载了geos-[版本].tar.bz2,解压文件后用CMake运行它,使用的是Visual Studio 10 Win64生成器。然后打开.sln文件进行构建,最后把生成的geos_c.dll移动并覆盖掉shapely在Python目录中安装的geos_c.dll。
1 个回答
Shapely是建立在一个C语言的包装器之上,这个包装器是为了使用C++的GEOS库。这个C++库里面有一些叫做Precision的类,专门用来处理计算中的舍入误差。我觉得可以得出结论,你使用的Shapely版本和geos库在处理这个问题上可能是有区别的。不幸的是,访问这个精度模型的代码在C语言的接口中是不可用的,所以在Shapely中也找不到。
不过,升级到更高版本的geos可能会解决你的问题。在我的电脑上,使用shapely 1.2.16和libgeos 3.3.5-CAPI-1.7.5时,一切运行得很好。