System informacji przestrzennej w Python i GeoPandas

System informacji przestrzennej, określany skrótem GIS od angielskiego Geographic Information System, może być tworzony w języku Python z pakietem GeoPandas, który jest rozszerzeniem popularnego pakietu Pandas. Pakiet GeoPandas umożliwia przetwarzanie danych przestrzennych i przetwarzanie danych geograficznych w języku Python w bardzo wygodny sposób, podobny do przetwarzania danych relacyjnych w pakiecie Pandas lub w języku SQL.

System informacji przestrzennej i jego dane

System informacji przestrzennej charakteryzuje się przetwarzaniem specyficznych danych – danych przestrzennych, które opisują obiekty w przestrzeni rzeczywistej reprezentowane zazwyczaj przez zbiory punktów określanych przez długość i szerokość geograficzną oraz wysokość. Popularnym przykładem systemu informacji przestrzennej jest system informacji geograficznej, który przetwarza dane geograficzne, zazwyczaj w postaci mapy i obiektów na niej określonych.

Wiele przykładowych zbiorów danych dla systemów informacji przestrzennej można znaleźć w internecie. Dla systemów informacji geograficznej są dostępne różnorodne mapy, m.in. w takich serwisach jak www.geofabrik.de lub www.unece.org.

System informacji przestrzennej w Python

W tym artykule opisuję podstawy tworzenia systemu informacji geograficznej w języku Python z pakietem GeoPandas. Pakiet GeoPandas można bezpłatnie pobrać z repozytorium GitHub lub w popularnych dystrybucjach języka Python zainstalować instalatorem pip (poleceniem pip install geopandas) lub conda (poleceniem conda install -c conda-forge geopandas). Dokumentację do pakietu GeoPandas można znaleźć na stronie geopandas.org.

Przetwarzanie informacji geograficznej w Python

Pierwszym krokiem w tworzonym programie jest import niezbędnych pakietów.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import geopandas as gpd

Informacje przestrzenne zazwyczaj wczytuje się z dostępnych plików z danymi lub z odpowiednich baz danych. Przykładowe dane są instalowane razem z pakietem GeoPandas. Można je wczytać poleceniem

world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))

Dane wczytywane są, analogicznie jak w standardowym pakiecie Pandas, do obiektu klasy DataFrame. W GeoPandas obiekt ten zawsze ma co najmniej jedną kolumnę typu geometry, która przechowuje dane przestrzenne. Dane przestrzenne – w GeoPandas są to głównie dane geograficzne – są reprezentowane przez następujące typy danych: POINT i MULTIPOINTS, które reprezentują punkty na mapie lub zbiory takich punktów, LINES i MMULTILINES, które reprezentują linie na mapie lub zbiory takich linii, a także POLYGON i MULTIPOLYGON, które reprezentują wielokąty na mapie lub zbiory takich wielokątów.

Strukturę wczytanych danych można zobaczyć wyświetlając fragment danych, podobnie jak w standardowym pakiecie Pandas, poleceniem

world.head()

Kolumny wczytanych danych zawierają takie informacje jak liczbę mieszkańców (pop_est), nazwę kontynentu (continent), nazwę kraju (name), trzyliterowy skrót nazwy kraju (iso_a3) oraz informacje geograficzne (geometry) – położenie kraju na mapie świata reprezentowane przez obiekt klasy POLYGON lub listę takich obiektów (kiedy obszar kraju jest niespójny).

Wczytane dane można wyświetlić w postaci graficznej poleceniem

world.plot()

które rysuje mapę świata

system informacji przestrzennej - mapa świata

Na zakończenie tej części artykułu przedstawiam całość programu prostego systemu informacji przestrzennej w języku Python z pakietem GeoPandas, który wyświetla mapę na podstawie danych wczytanych z przykładowego pliku,

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import geopandas as gpd

world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
world.head()
world.plot()

System informacji drogowej dla Polski

Po zapoznaniu się z prostym przykładem mapy świata, można przejść do bardziej złożonych systemów informacji przestrzennej. W tej części artykułu przedstawiam
system informacji geograficznej opisujący siatkę najważniejszych dróg w Polsce, który można stworzyć na podstawie danych dostępnych w serwisie www.unece.org. Poniższy programu wczytuje pobrane dane geograficzne opisujące siatkę dróg w Polsce i wyświetla ich mapę.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import geopandas as gpd

roads = gpd.read_file('GIS//2015_E_Roads_PL.shp')
roads.plot()

system informacji drogowej dla Polski

Interesujące punkty województwa dolnośląskiego

Kolejnym prostym przykładem systemu informacji geograficznej w języku Python może być mapa interesujących punktów województwa dolnośląskiego stworzona na podstawie danych www.geofabrik.de. Poniższy programu wczytuje pobrane dane geograficzne opisujące województwo dolnośląskie i wyświetla mapę interesujących punktów.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import geopandas as gpd

dol = gpd.read_file('GIS//OpenStreetMap//dolnoslaskie-latest-free.shp//gis.osm_pois_free_1.shp')
dol.plot()

W razie potrzeby dokładną listę tych punktów, a raczej jej fragment, bo sama lista jest długa, można wyświetlić poleceniem

print dol.head()

system informacji geograficznej - województwo dolnośląskie

System informacji przestrzennej dla Wrocławia

Ostatnim przykładem systemu informacji przestrzennej, tym razem przedstawiającym siatkę dróg Wrocławia i okolic, jest poniższy program. Korzysta on z tych samych danych, co poprzedni przykład, ale dokonuje ich selekcji przy użyciu operatora cx i podaniu zakresu współrzędnych geograficznych odpowiednich dla Wrocławia.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import geopandas as gpd

dol = gpd.read_file('GIS//OpenStreetMap//dolnoslaskie-latest-free.shp//gis.osm_roads_free_1.shp')
wroclaw = dol.cx[16.9:17.2, 51.0:51.2]
wroclaw.plot()

system informacji geograficznej dla Wrocławia