2013-01-21 16 views
6

Próbowałem użyć foremnie, aby znaleźć przecięcie linii i wielokąta, ale mam problemy z niektórymi liczbami zmiennoprzecinkowymi.Przecięcie wieloboku z linią | Python Shapely

Przykładowy kod:

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 

co by się spodziewać jest lista dwoma wierzchołkami.

Punkt 1: punkt znajdujący się wewnątrz wielokąta lub (4.0, -2.0000000000000004) w tym przypadku.

Punkt 2: punkt będący punktem przecięcia [(4.0, -2.0000000000000004), (2.0, -1.1102230246251565e-15)] i [(3.0, -3.0), (4.0, -2,0)].

Jednak wynik otrzymuję to:

[(4.0, -2.0000000000000004)] 

Mam również sprawdzić, czy istnieje w ogóle przecięcia z krawędzią że patrzę na:

>>> edge = shapely.geometry.LineString([(3.0, -3.0), (4.0, -2.0)]) 
>>> edge.intersects(shapely_line) 
False 

Gdybym zastąpić (4,0, -2,0000000000000004) z (4,0, -2,000000000000000), a następnie przecięcie krawędzi zostanie obliczone jako True.

Czy ktoś ma pomysły na to, co się dzieje lub czego mi brakuje? Dzięki!

enter image description here

Edit:

Ja testowałem przy użyciu zgrabną wersji 1.12 i Geos z 3.3.1, 3.3.5, 3.3.6, 3.3.7.

W przypadku gdy ktoś jest ciekaw, jak ja zaktualizowane wersję GEOS na oknach:

pobraniu geos- [wersja] .tar.bz2 ze strony internetowej GEOS. Wyodrębniono pliki i uruchomiono CMake przy użyciu generatora Visual Studio 10 Win64. Otworzył plik .sln i zbudował go, a następnie przeniósł wygenerowany plik geos_c.dll i wkleił go tam, gdzie został zainstalowany geos_c.dll przez kształt w katalogu Python.

+0

zdjęcie zrobi to pytanie świat dobrej – flup

+1

Dzięki wyjęciu do zdjęcia, wygląda lepiej niż ten, który miałem narysować! – Lisa

+0

kiedy robię 'przecięcia = shapely_poly.intersection (shapely_line)' ', a następnie wydrukować intersection' uzyskać' LineString (+4,0000000000000000 -2.0000000000000004, +4,0000000000000000 -2,0000000000000000) ' – flup

Odpowiedz

3

Shapely jest zbudowana na wierzchu opakowania C wokół biblioteki GEOS C++. Gdzieś deep inside this C++ library siedzą klasy Precision, które obsługują błędy zaokrąglania. Myślę, że możemy wywnioskować, że twoja wersja Shapely i biblioteki Geos zajmują się tą sprawą w inny sposób. Niestety kod, który uzyskuje dostęp do modelu dokładności, nie jest dostępny w C api, a zatem ani w Shapely. Zobacz http://lists.gispython.org/pipermail/community/2011-February/002898.html

Zmiana na wyższą wersję geos może jednak rozwiązać problem. Działa to dobrze na moim komputerze z zgrabnymi wersjami 1.2.16 i libgeos 3.3.5-CAPI-1.7.5.

+0

Okay, przepraszam za opóźnienie. Ten, z którym został zapakowany, był w wersji 3.3.1 i próbowałem używać 3.3.5-CAPI-1.7.5, 3.3.6-CAPI-1.7.6, 3.3.7-CAPI-1.7.7 bez powodzenia i uruchamiania 1.12 Shapely . Myślę, że to tak, jakby odpowiedź Mike'a z jedyną inną różnicą, która może być odmienna, to platforma. – Lisa

+0

Uznanie tego za poprawne, ponieważ ostatecznie wydaje się, że jest to coś związanego z różnicami w platformach. – Lisa

+0

Po raz ostatni, czy macie maszyny 32-bitowe lub 64-bitowe? – flup