2013-01-21 381 views
6

我一直在努力使用shapely來找到一個線和一個多邊形的交集,但我遇到了一些浮點數的問題。多邊形相交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。

有沒有人有什麼想法或我失蹤?謝謝!

enter image description here

編輯:

我一直在使用勻稱1.12版和3.3.1,3.3.5,3.3.6,3.3.7 GEOS測試。

如果有些人好奇的是,我如何更新Windows上的GEOS版本:

從GEOS網站下載的geos- [版] .tar.bz2格式。使用Visual Studio 10 Win64生成器提取文件並在其上運行CMake。打開.sln文件並構建它,然後移動生成的geos_c.dll並將其粘貼到已安裝geos_c.dll的地方,方法是在Python目錄中進行修改。

+0

圖片會做這個問題的世界的好 – flup

+1

感謝unutbu的圖片,它看起來比我要畫的那個更好! – Lisa

+0

當我做'路口= shapely_poly.intersection(shapely_line)'然後'打印intersection'我得到'LINESTRING(4.0000000000000000 -2.0000000000000004,4.0000000000000000 -2.0000000000000000)' – flup

回答

3

Shapely構建在C++ GEOS庫周圍的C封裝之上。某處deep inside this C++ library坐在處理舍入誤差的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。

+0

好的,對於延遲抱歉。它包裝的是3.3.1,我嘗試使用3.3.5-CAPI-1.7.5,3.3.6-CAPI-1.7.6,3.3.7-CAPI-1.7.7,沒有運氣並運行1.12勻稱。我認爲這就像邁克的迴應,只有其他的區別,我可以認爲是不同的平臺。 – Lisa

+0

要將它標記爲正確,因爲最終它似乎與平臺的差異有關。 – Lisa

+0

最後一次事後,你有32位或64位的機器/ dll嗎? – flup