OpenStreetMap is een gratis open geografische database die bijgehouden en onderhouden wordt door een community aan vrijwilligers via een open samenwerking. Deze data wordt gedeeld door diverse partijen, zoals Geofabrik.de. Geofabrik heeft data van Nederland beschikbaar gesteld, zoals van heel Nederland, maar ook per provincie.
Data downloaden
Ga naar Netherlands region op Geofabrik en download de "Commonly Used Format", namelijk netherlands-latest.osm.pbf (circa 1.1 GB op 16-3-2023).
Converteren
Download de converteer tool genaamd Osmconvert voor het gewenste besturingssysteem.
Extraheren CSV
Voer vervolgens volgende commando uit via de CMD, om het osm.pbf bestand naar CSV om te zetten, waarbij we filteren op latitude, longitude, straat, huisnummer, stad en postcode.
osmconvert64-0.8.8p.exe netherlands-latest.osm.pbf --csv="@lat @lon addr:street addr:housenumber addr:city addr:postcode" --csv-headline -o=1.csv
Filteren met Osmfilter
Mochten we eerst de Geofabrik-data willen filteren, dan kunnen we een filter toepassen met de OSmfilter tool. Hiervoor dienen we eerst de .osm.pbf naar bijvoorbeeld .05m om te zetten.
osmconvert64-0.8.8p.exe netherlands-latest.osm.pbf -o=netherlands.o5m
Vervolgens passen we te filter toe, zoals bijvoorbeeld voorkomens met lege adres voorkomens te verwijderen:
osmfilter.exe netherlands.o5m --keep="@lat @lon addr:street addr:housenumber addr:city addr:postcode" > filter.osm
De gefilterde data kunnen we ten slotte weer extraheren en converteren naar CSV met:
osmconvert64-0.8.8p.exe filter.osm --csv="@lat @lon addr:street addr:housenumber addr:city addr:postcode" --csv-headline -o=1.csv
Filteren met Python en Panda
import pandas as pd
# Create a Dataframe from a CSV
col_names = ["@lat", "@lon", "addr:street", "addr:housenumber", "addr:city", "addr:postcode"]
df = pd.read_csv('2.csv', names=col_names, sep='\t', lineterminator='\n', header=0)
df2 = df.copy() # Create duplicate of data
df2.dropna(subset = ['addr:street'], inplace = True) # Remove streets with NaN
df2.dropna(subset = ['addr:housenumber'], inplace = True) # Remove housenumbers with NaN
df2.dropna(subset = ['addr:city'], inplace = True) # Remove cities with NaN
df2.dropna(subset = ['addr:postcode'], inplace = True) # Remove cities with NaN
print(df2) # Print updated data
df2.to_csv("panda.csv")