Geopandas er en utvidelse av Pandas. Geopandas har en egen geografisk datatype, basert på ISO 19125-1:2004 Geographic information — Simple feature access — Part 1: Common architecture. Mye av funksjonalitetem i Geopandas kommer opprinnelig fra Pandas, og dokumentasjon om Pandas kan dermed være til nytte bruken av Geopandas. Unntaket er de operasjonene som utnytter den geografiske delen av Geopandas.
fiona er en Python overbygning over GDAL/OGR open source-programvarebiblioteker, og gir mulighet for å lese og skrive til en lang rekke geodataformater. fiona er inkludert i geopandas, men listlayers-funksjonen er ikke eksponert i geopandas. Vi må derfor importere fiona eksplisitt.
import pandas as pd
import geopandas as gpd
import fiona as fi
# Data for kommuner og grunnkretser i Innlandet er lastet ned fra geonorge.no.
# Formatet er ESRI File Geodatabase - FGDB.
# De utpakkede datafilene må ligge som en mappe i mappen der vi starter Jupyterlab.
ilk = "Basisdata_34_Innlandet_25832_Kommuner_FGDB.gdb"
ilg = "Basisdata_34_Innlandet_25832_Grunnkretser_FGDB.gdb"
# Hvilke kartlag inneholder datasettene?
print(fi.listlayers(ilk))
print(fi.listlayers(ilg))
# Oppretter variabel for ett kartlag
kommuner = gpd.read_file(ilk, layer = 'kommune')
# Hvilke egenskaper (kolonner) inneholder kartlaget?
kommuner.info()
# Hvordan ser de 5 første radene ut?
kommuner.head()
# Hvordan ser dataene ut som kart? Fargelegging gjøres ut fra verdien i column.
kommuner.plot(column = 'kommunenummer')
# Har kartlaget noen passende indeks?
# Dette viser at indeksen er en implisitt indeks - med fortløpende verdier fra 0 og oppover.
kommuner.index.values
# Ønsker å få kommunenavn inn sammen med resten av kommunedataene ved å lage en join
kommuner_navn = gpd.read_file(ilk, layer='administrativenhetnavn')
kommuner_navn.head()
# Erstatter innholdet i variabelen kommuner med nytt kartlag indeksert på objid
# if-test er for å unngå feilmelding hvis denne cella kjøres flere ganger
# Legg merke til at 'objid'-kolonnen nå får et annet utseende
if not kommuner.index.name == 'objid':
kommuner = kommuner.set_index('objid')
kommuner.head()
if not kommuner_navn.index.name == 'kommune_fk':
kommuner_navn = kommuner_navn.set_index('kommune_fk')
kommuner_navn.head()
# Kommandoen for join er "merge"
# For at dette skal virke må det være indekser med sammenfallende verdier i de to tabellene
# Oppskrift hentet herfra: https://pandas.pydata.org/pandas-docs/stable/getting_started/comparison/comparison_with_sql.html#compare-with-sql-join
# Lgge merke til at bare en kolonne, navn, hentes fra kommuner_navn
# if-test er for å unngå feilmelding hvis denne cella kjøres flere ganger
if not 'navn' in kommuner.columns:
kommuner = pd.merge(kommuner, kommuner_navn['navn'], how = 'left', left_on = 'objid', right_index = True)
kommuner.columns
# Velger ut én kommune
gjovik = kommuner[kommuner['navn'] == 'Gjøvik']
gjovik
gjovik.plot()
gkretser = gpd.read_file(ilg, layer = 'grunnkretser_omrade')
gkretser.plot("grunnkretsnavn")
nyjordet = gkretser[gkretser['grunnkretsnavn'] == 'Nyjordet']
nyjordet.head()
nyjordet.plot()
# Alle grunnkretser i Gjøvik - valgt ut med overlay-funksjon
gkretser_gjovik = gpd.overlay(gkretser, gjovik, how='intersection')
gkretser_gjovik .plot('grunnkretsnavn')