Mam geoprzestrzenną ramkę danych w EPSG: 4326 i zrobiłbym nową ramkę danych składającą się ze wszystkich wierszy, które mieszczą się w określonej ramce granicznej.
Najpierw otrzymuję obwiednię, na której mi zależy (która w rzeczywistości jest obwiednią innej ramki danych):
print df_sussex.total_bounds
[ -1.57239292 50.57467674 0.14528384 51.27465152]
Następnie tworzę ramkę danych składającą się tylko z tego obwiedni:
pts = gpd.GeoDataFrame(df_sussex.total_bounds)
I w końcu staram się uzyskać wszystkie funkcje, które przecinają się z obwiednią:
sac_sussex = gpd.overlay(pts, df_sac, how='intersection')
Ale to mi daje AttributeError: No geometry data set yet (expected in column 'geometry'
.
Co ja robię źle?
Odpowiedzi:
Problem polega na tym, że używasz metody „total_bounds”. Wytwarza tylko krotkę z maksymalnymi i minimalnymi punktami obwiedni. Metodą, którą należy zastosować, jest „koperta”; poprzedni, aby zbudować odpowiednią „GeoDataFrame”. Na przykład czytanie moich plików kształtów jako GeoDataFrame :
Budowanie obwiedni pol1 i tworzenie odpowiedniej GeoDataFrame :
Przecięcie obu GeoDataFrame :
Wyniki wykreślania:
Działało zgodnie z oczekiwaniami.
Uwaga do edycji:
Korzystając z metody „total_bounds” (ponieważ metoda „koperty” zwraca ramkę graniczną dla każdej cechy wielokątów), można zastosować następujące podejście:
a wynik jest identyczny.
źródło
Możesz użyć tej
cx
metody na ramce geodata, aby wybrać wiersze w obwiedni. Dla przykładowych ramek:Ze strony http://geopandas.org/indexing.html :
źródło
.cx
robi coś nieco innego niżgpd.overlay
rozwiązanie: wybiera wiersze, które przecinają obwiednię, ale pozostawiają geometrie nienaruszone, podczas gdygpd.overlay
rozwiązanie zwróci tylko części geometrii w obwiedni. W zależności od sytuacji możesz chcieć jednego lub drugiego.