Viser bruk av GeoPandas overlay-funksjon
import pandas as pd
import geopandas as gpd
import fiona as fi
ledning_gdb = "Basisdata_1133_Hjelmeland_5972_FKB-Ledning_FGDB.gdb"
print(fi.listlayers(ledning_gdb))
ledning = gpd.read_file(ledning_gdb, layer = 'fkb_ledning_beliggenhet')
ledning.head()
ar5_gdb = "Basisdata_1133_Hjelmeland_25832_FKB-AR5_FGDB.gdb"
print(fi.listlayers(ar5_gdb))
ar5 = gpd.read_file(ar5_gdb, layer = 'fkb_ar5_omrade')
skog = ar5[(ar5["arealtype"] == "30")]
skog.head()
ledning.is_valid.value_counts()
# Denne gir feilmelding:
#skog.is_valid
# Denne koden viser at det er tre polygoner som ikke er gyldige:
for index,value in enumerate(skog.geometry):
try:
if value.is_valid:
pass
except:
print('index: ', index)
Triks for å få etablert geometrien for ugyldige polygoner på nytt:
Kjører en buffer-operasjon med bufferbredde 0
Dette er inspirert av dokumentasjonen for geopandas.overlay make_valid
Skriver tilbake til GeoDataFrame med pandas.DataFrame.iat-funksjon
# Finner kolonne-indeks for geometry
skog.columns.get_loc('geometry')
for index,value in enumerate(skog.geometry):
try:
if value.is_valid:
pass
except:
skog.iat[index, 26] = value.buffer(0)
print('fixed geometry at index: ', index)
skog.iloc[513].geometry
skog.iloc[518].geometry
skog.iloc[5289].geometry
ledning_skog = gpd.overlay(ledning, skog, how='intersection', keep_geom_type=False, make_valid=True)
ledning_skog.shape
ledning_skog.geom_type.value_counts()
base = skog.plot(column='treslag', cmap='tab20c', figsize=(25,25))
ledning.plot(ax=base, color='cyan');
ledning_skog.plot(ax=base, color='red');