Analizy przestrzenne w GeoPandas — prostsze niż myślisz!
Analizy przestrzenne nie muszą wymagać drogich narzędzi GIS czy skomplikowanego oprogramowania. Wystarczy Python i biblioteka GeoPandas, by w kilka minut przeprowadzić obliczenia geograficzne, stworzyć mapy czy przeanalizować zależności przestrzenne między obiektami. W tym artykule pokażę, jak zacząć przygodę z GeoPandas, korzystając z danych wektorowych i kilku linii kodu.
Zacznijmy od instalacji GeoPandas, jeśli jeszcze nie masz tej biblioteki. GeoPandas można zainstalować poleceniem:
pip install geopandas
Po instalacji możemy wczytać dane przestrzenne, np. granice województw zapisane w pliku .shp
. Robimy to za pomocą funkcji read_file
:
import geopandas as gpd
woj = gpd.read_file("wojewodztwa.shp")
print(woj.head())
Po wczytaniu danych warto upewnić się, jaki układ współrzędnych (CRS) posiadają dane. Na przykład:
print(woj.crs)
Jeśli dane są w układzie geograficznym (np. EPSG:4326), a chcemy pracować w metrach (np. do obliczeń powierzchni), możemy łatwo przekształcić je do układu PUWG 1992 (EPSG:2180):
woj = woj.to_crs("EPSG:2180")
Załóżmy teraz, że chcemy wybrać tylko województwo mazowieckie i sprawdzić jego powierzchnię. Wystarczy proste filtrowanie:
maz = woj[woj["nazwa"] == "mazowieckie"]
print(maz.geometry.area / 10**6) # powierzchnia w km²
Do naszej analizy dołączmy teraz dane punktowe — np. stacje pogodowe zapisane w formacie GeoJSON:
punkty = gpd.read_file("stacje_pogodowe.geojson")
punkty = punkty.to_crs(woj.crs)
Możemy sprawdzić, które stacje znajdują się w Mazowieckim, wykorzystując funkcję within()
:
maz_punkty = punkty[punkty.within(maz.geometry.values[0])]
Jeśli chcemy zobaczyć, które obiekty znajdują się w promieniu 10 km od danej stacji, wystarczy stworzyć bufor przestrzenny. Przykład dla pierwszego punktu:
bufor_10km = punkty.geometry.iloc[0].buffer(10000)
Chcąc zmierzyć odległość między wszystkimi stacjami a środkiem województwa, obliczamy centroid i używamy metody distance()
:
centrum = maz.geometry.centroid.values[0]
punkty["odleglosc_km"] = punkty.geometry.distance(centrum) / 1000
Na koniec warto dane przedstawić graficznie. Dzięki wbudowanej integracji z Matplotlib wystarczy kilka linii, by zobaczyć efekty analizy na mapie:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10, 10))
woj.plot(ax=ax, edgecolor='black', facecolor='none')
maz.plot(ax=ax, facecolor='lightblue')
maz_punkty.plot(ax=ax, color='red', markersize=20)
plt.title("Stacje pogodowe w województwie mazowieckim")
plt.show()
Zapiszmy punkty znajdujące się w Mazowieckim do nowego pliku GeoJSON:
maz_punkty.to_file("mazowieckie_stacje.geojson", driver="GeoJSON")
Jak widać, analiza danych przestrzennych w Pythonie może być intuicyjna i elastyczna. GeoPandas pozwala łączyć dane atrybutowe z geometrią, wykonywać przecięcia, obliczać powierzchnie i odległości, a nawet tworzyć proste mapy — wszystko bez konieczności opuszczania środowiska Pythona.