[英]Polygon Intersection with Line | Python 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。
有人對發生的事情或我缺少的事情有任何想法嗎? 謝謝!
編輯:
我已經測試了使用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目錄中的geos_c.dll的安裝位置。
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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.