Próbuję znaleźć miejsce, w którym wiele linii przecina wielokąt dla dwóch różnych ramek geodanych:
from shapely.geometry import Polygon, LineString
import geopandas as gpd
polygon = Polygon([(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)])
line1 = LineString([(0.5, 0.5), (0.7, 0.7)])
line2 = LineString([(0.9, 0.9), (0.2, 0.6)])
poly_gdf = gpd.GeoDataFrame(geometry=[polygon])
line_gdf = gpd.GeoDataFrame(geometry=[line1, line2])
Tak wyglądają powyższe ramki danych (jedna ma wielokąt, a druga dwie linie). Wydaje mi się, że obie linie przecinają wielokąt:
Jednak wynik przecięcia jest bardzo mylący:
print(line_gdf.intersects(poly_gdf))
0 Prawda
1 False
print(line1.intersects(polygon))
print(line2.intersects(polygon))
Prawdziwe
Prawdziwe
Dlaczego geopandas
intersect
metoda daje inny wynik niż standardowy shapely
?
Używam Python 3.5.3 i Geopandas 0.2.1 wszystkie na Anaconda.
python
intersection
shapely
geopandas
bgordon
źródło
źródło
print(line.intersects(polygon))
że masz dostęp do zmiennej, która nie jest zdefiniowana tak daleko, jak widzę. Zdefiniowałeśline1
iline2
wcześniej w kodzie. Nie wiem, dlaczego to zwróci Prawdę.print(line.intersects(polygon))
był literówką. Zaktualizowałem pytanie, aby odnieść się doline1
tego, co pierwotnie miałem na myśli.line_gdf.info
potwierdza, że masz tylko jedną kolumnę geometrii. Jestem zakłopotany. Sprawdzę, jeśli coś znajdę.Odpowiedzi:
Podczas porównywania ramek geodezyjnych z operacjami geometrii w Geopandzie, geometrie są najpierw dopasowywane przez indeks. W przypadku, gdy nie ma pasującego indeksu (ponieważ na przykład masz tylko jeden wielokąt), wynikiem będzie
False
.Jeśli
GeoSeries
miałoby to porównać każdy obiekt w środku, musiałbyś odzyskać pełną prostokątną ramkę danych wartości boolowskich, a to prawdopodobnie byłoby bardzo nieefektywne.Jeśli chcesz porównać wszystkie geometrie, masz dwie opcje. Pierwszym (i prawdopodobnie najłatwiejszym) jest użycie
sjoin
metody geopandas :Zwraca to nową
GeoDataFrame
geometrię dla każdego obiektu w lewej ramce danych, powtarzaną dla każdej geometrii, którą przecinają po prawej stronie, z indeksem obiektu po prawej stronie, tj .:Druga metoda to dla nas
apply
metoda pandy wGeoSeries
celu zwrócenia prostokątnej ramki danych:Co z kolei zwraca (wraz ze wzrostem nieefektywności wraz ze wzrostem ramek danych):
Ogólnie rzecz biorąc, chyba że potrzebujesz matrycy kwadratowej, radzę trzymać się tej
sjoin
metody.źródło