Innlandet - med Python og Geopandas

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.

Nødvendige Python-biblioteker

In [2]:
import pandas as pd
import geopandas as gpd
import fiona as fi

Innlesing og utforsking av datasett

In [3]:
# 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"
In [4]:
# Hvilke kartlag inneholder datasettene?

print(fi.listlayers(ilk))
print(fi.listlayers(ilg))
['kommune', 'administrativenhetnavn', 'kommunegrense', 'riksgrense', 'fylkesgrense']
['grunnkretser_grense', 'grunnkretser_omrade']
In [5]:
# Oppretter variabel for ett kartlag

kommuner = gpd.read_file(ilk, layer = 'kommune')
In [5]:
# Hvilke egenskaper (kolonner) inneholder kartlaget?

kommuner.info()
<class 'geopandas.geodataframe.GeoDataFrame'>
RangeIndex: 46 entries, 0 to 45
Data columns (total 14 columns):
objid                       46 non-null int64
objtype                     46 non-null object
kommunenummer               46 non-null object
samiskforvaltningsomrade    46 non-null int64
lokalid                     46 non-null object
navnerom                    46 non-null object
versjonid                   46 non-null object
datafangstdato              0 non-null object
oppdateringsdato            46 non-null object
datauttaksdato              46 non-null object
opphav                      0 non-null object
SHAPE_Length                46 non-null float64
SHAPE_Area                  46 non-null float64
geometry                    46 non-null geometry
dtypes: float64(2), geometry(1), int64(2), object(9)
memory usage: 5.2+ KB
In [7]:
# Hvordan ser de 5 første radene ut?

kommuner.head()
Out[7]:
objid objtype kommunenummer samiskforvaltningsomrade lokalid navnerom versjonid datafangstdato oppdateringsdato datauttaksdato opphav SHAPE_Length SHAPE_Area geometry
0 31 Kommune 3416 0 172851 https://data.geonorge.no/sosi/administrativeen... 4.1 None 2003-07-01T00:00:00 2020-09-28T16:03:34 None 128300.686351 6.403379e+08 MULTIPOLYGON (((657139.573 6660572.926, 657147...
1 52 Kommune 3415 0 173046 https://data.geonorge.no/sosi/administrativeen... 4.1 None 2020-02-07T00:00:00 2020-09-28T16:03:36 None 129446.685167 5.166228e+08 MULTIPOLYGON (((657139.573 6660572.926, 657076...
2 72 Kommune 3414 0 172954 https://data.geonorge.no/sosi/administrativeen... 4.1 None 2020-02-07T00:00:00 2020-09-28T16:03:39 None 121904.419323 5.079867e+08 MULTIPOLYGON (((639300.489 6686975.032, 639297...
3 53 Kommune 3401 0 173049 https://data.geonorge.no/sosi/administrativeen... 4.1 None 2003-07-01T00:00:00 2020-09-28T16:03:37 None 201868.192644 1.036433e+09 MULTIPOLYGON (((662218.637 6664832.970, 662217...
4 114 Kommune 3413 0 172714 https://data.geonorge.no/sosi/administrativeen... 4.1 None 2020-02-07T00:00:00 2020-09-28T16:03:42 None 137589.293014 7.239833e+08 MULTIPOLYGON (((628814.181 6704799.478, 628653...
In [7]:
# Hvordan ser dataene ut som kart? Fargelegging gjøres ut fra verdien i column.

kommuner.plot(column = 'kommunenummer')
Out[7]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f737db0c710>
In [6]:
# Har kartlaget noen passende indeks?
# Dette viser at indeksen er en implisitt indeks - med fortløpende verdier fra 0 og oppover.

kommuner.index.values
Out[6]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
       34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45])

Tilrettelegging av datasett for join-operasjoner

In [10]:
# Ønsker å få kommunenavn inn sammen med resten av kommunedataene ved å lage en join

kommuner_navn = gpd.read_file(ilk, layer='administrativenhetnavn')
kommuner_navn.head()
Out[10]:
objtype navn rekkefolge sprak kommune_fk geometry
0 Kommune Eidskog None nor 31 None
1 Kommune Sør-Odal None nor 52 None
2 Kommune Nord-Odal None nor 72 None
3 Kommune Kongsvinger None nor 53 None
4 Kommune Stange None nor 114 None
In [8]:
# 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()
Out[8]:
objtype kommunenummer samiskforvaltningsomrade lokalid navnerom versjonid datafangstdato oppdateringsdato datauttaksdato opphav SHAPE_Length SHAPE_Area geometry
objid
31 Kommune 3416 0 172851 https://data.geonorge.no/sosi/administrativeen... 4.1 None 2003-07-01T00:00:00 2020-09-28T16:03:34 None 128300.686351 6.403379e+08 MULTIPOLYGON (((657139.573 6660572.926, 657147...
52 Kommune 3415 0 173046 https://data.geonorge.no/sosi/administrativeen... 4.1 None 2020-02-07T00:00:00 2020-09-28T16:03:36 None 129446.685167 5.166228e+08 MULTIPOLYGON (((657139.573 6660572.926, 657076...
72 Kommune 3414 0 172954 https://data.geonorge.no/sosi/administrativeen... 4.1 None 2020-02-07T00:00:00 2020-09-28T16:03:39 None 121904.419323 5.079867e+08 MULTIPOLYGON (((639300.489 6686975.032, 639297...
53 Kommune 3401 0 173049 https://data.geonorge.no/sosi/administrativeen... 4.1 None 2003-07-01T00:00:00 2020-09-28T16:03:37 None 201868.192644 1.036433e+09 MULTIPOLYGON (((662218.637 6664832.970, 662217...
114 Kommune 3413 0 172714 https://data.geonorge.no/sosi/administrativeen... 4.1 None 2020-02-07T00:00:00 2020-09-28T16:03:42 None 137589.293014 7.239833e+08 MULTIPOLYGON (((628814.181 6704799.478, 628653...
In [11]:
if not kommuner_navn.index.name == 'kommune_fk':
    kommuner_navn = kommuner_navn.set_index('kommune_fk')

kommuner_navn.head()
Out[11]:
objtype navn rekkefolge sprak geometry
kommune_fk
31 Kommune Eidskog None nor None
52 Kommune Sør-Odal None nor None
72 Kommune Nord-Odal None nor None
53 Kommune Kongsvinger None nor None
114 Kommune Stange None nor None

Join-operasjon (merge)

In [12]:
# 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
Out[12]:
Index(['objtype', 'kommunenummer', 'samiskforvaltningsomrade', 'lokalid',
       'navnerom', 'versjonid', 'datafangstdato', 'oppdateringsdato',
       'datauttaksdato', 'opphav', 'SHAPE_Length', 'SHAPE_Area', 'geometry',
       'navn'],
      dtype='object')

Spørringer og utvalg av data

In [13]:
# Velger ut én kommune

gjovik = kommuner[kommuner['navn'] == 'Gjøvik']
gjovik
Out[13]:
objtype kommunenummer samiskforvaltningsomrade lokalid navnerom versjonid datafangstdato oppdateringsdato datauttaksdato opphav SHAPE_Length SHAPE_Area geometry navn
objid
11 Kommune 3407 0 172699 https://data.geonorge.no/sosi/administrativeen... 4.1 None 2020-02-07T00:00:00 2020-09-28T16:03:33 None 122049.225559 6.706795e+08 MULTIPOLYGON (((579213.177 6767170.485, 579513... Gjøvik
In [14]:
gjovik.plot()
Out[14]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fc1f572c590>

Nytt datasett: Grunnkretser

In [15]:
gkretser = gpd.read_file(ilg, layer = 'grunnkretser_omrade')
gkretser.plot("grunnkretsnavn")
Out[15]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fc1f56e0490>
In [16]:
nyjordet = gkretser[gkretser['grunnkretsnavn'] == 'Nyjordet']
nyjordet.head()
Out[16]:
objid objtype grunnkretsnummer grunnkretsnavn lokalid navnerom versjonid datauttaksdato datafangstdato oppdateringsdato opphav kommunenummer SHAPE_Length SHAPE_Area geometry
535 5873 Grunnkrets 34070204 Nyjordet a53b7447-2523-479e-86ba-c618766e4129 https://data.geonorge.no/sosi/administrativeen... 1.5_20180115 2020-09-30T01:02:20 None 2017-11-06T00:00:00 Kartverket 3407 1359.745314 91385.882876 MULTIPOLYGON (((591873.354 6740239.662, 591877...
In [17]:
nyjordet.plot()
Out[17]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fc1f56cc650>

Overlay-operasjon

In [18]:
# Alle grunnkretser i Gjøvik - valgt ut med overlay-funksjon
gkretser_gjovik = gpd.overlay(gkretser, gjovik, how='intersection')
gkretser_gjovik .plot('grunnkretsnavn')
Out[18]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fc1f55f9550>
In [ ]: