291 views
 owned this note
# Programmier-Werkzeuge für das Analysieren von Netzwerken mit OpenStreetMap- und weiteren Datenquellen Von Matteo Samadelli und Stefan Keller, Geometa Lab am [IFS OST](https://www.ost.ch/ifs), im Juli 2021. ***(Work-in-Progress)*** Stichworte: *Analyse, Geodaten, Netzwerke, OpenStreetMap, Programmier-Werkzeuge, Python, PostgreSQL, QGIS*. ## Übersicht Dies ist ein Vergleich zweier Programmier-Werkzeuge in Python (OSMnx, pyrosm) sowie pgRouting/PostgreSQL zum Arbeiten mit OpenStreetMap-Daten, insbesondere mit Netzwerken und auch mit grösseren Datenmengen. Es gäbe noch weitere Python-Software-Bibliotheken, wie namentlich [pyosmium](https://osmcode.org/pyosmium/) oder [osm-python-tools](https://github.com/mocnik-science/osm-python-tools) sowie diesen Überblick als Blogpost zu ["The future of working with OSM data"](http://k1z.blog.uni-heidelberg.de/2020/09/10/the-future-of-working-with-osm-data/) (2020) . * [OSMnx](https://osmnx.readthedocs.io/) (in Python) * [Pyrosm](https://pyrosm.readthedocs.io/) (in Python) * [pgRouting](https://pgrouting.org/)/PostgreSQL (mit Tools wie psql/pgAdmin in C++) Aufbau: * Kurzvorstellung * Filter-/Query-Sprache und ihre Möglichkeiten * Beschränkungen * Use Case POI extrahieren mit Beispiel(en) * Use Case Netzwerk/Graph extrahieren mit Beispiel(en) * APPENDIX: Einfache Netzwerkanalyse Fusswege Lützelsee OSMnx ist für die Verarbeitung von eher kleinen aber geografisch spetzifischen Datensätzen geeignet, da es die Daten selbständig von der Overpass API bezieht. Es bietet eine vielzahl an Möglichkeiten geografisch zu definieren welcher Bereich benötigt wird. Für die Arbeit mit Graphen und Netzwerken verwendet OSMnx [NetworkX](https://networkx.org/) und implementiert zusätzlich weitere Funktionen um die Arbeit zu erleichtern. Pyrosm bezieht seine Daten aus lokalen osm.pbf Files, das Standartformat für das Speichern von OSM Daten. Das ermöglicht es, grössere Datenmengen schneller zu verarbeiten, jedoch kann der Bereich, in dem die Daten bezogen werden nicht sehr genau definiert werden. Für die Analyse von Graphen bieten Pyrosm zwar keine eigenen Möglichkeiten an, jedoch können die Daten zu verschiedenen Graphen anderer Librarys exportiert werden. Zur Auswahl stehen dabei iGraph, Pandana und networkx, welches auch von OSMnx verwendet wird, was es ermöglicht, Daten aus Pyrosm zu exportieren und mit OSMnx weiter zu verarbeiten. ## OSMnx Mit OSMnx können OSM Daten über die Overpass API extrahiert und analysiert werden. Für das extrahieren der Daten wird das Geometry Modul verwendet. Dabei gibt es mehrere Methoden, die sich hauptsächlich darin unterscheiden, wie der Bereich, in dem nach Daten gesucht wird, definiert wird. Zusätzlich zu der Ortsbegrenzung kann immer auch ein Filter mitgegeben werden, der definiert, nach welchen Tags gesucht werden soll. Beispiel eines Filters: ``` filter = {"amenity": ["school", "kindergarten", "college", "university"]} ``` Die Daten werden dann als [GeoDataFrame](https://geopandas.org/docs/reference/api/geopandas.GeoDataFrame.html), einem [GeoPandas](https://geopandas.org/index.html) Objekt zurückgegeben. ### Lesen von Geometrien Beispiel, wie mit der 'geometries_from_place' Methode nach Schulen im Kanton Zürich gesucht werden kann: ``` camping = ox.geometries_from_place("CH-ZH", {"amenity": ["school", "kindergarten", "college", "university"]}) ``` ### Lesen von Netzwerken ## Pyrosm Pyrosm bezieht seine Daten aus einem lokalen osm.pbf File Pyrosm bezieht seine Daten aus [osm.pbf Files](https://wiki.openstreetmap.org/wiki/PBF_Format). Entweder wird so ein File übergeben, oder es wird mit der ``` get_data``` Funktion automatisch in dem temp Ordner heruntergeladen und übergeben. Pyrosm bietet dabei Kontinente, Länder, Subregionen und Städte zum Download an. ### Lesen von POIs (Points of Interest) Pyrosm bietet mit der ```get_pois``` Funktion eine einfache Möglichkeit alle Arten von Objekten von Overpass zu extrahieren. Welche das sind, kann durch einen Filter, gleich wie bei OSMnx definiert werden. Beispiel, wie alle Campingplätze in der Region Zürich extrahiert werden können: ```python from pyrosm import OSM from pyrosm import get_data fp = get_data("Zuerich") # Herunterladen der OSM Daten osm = OSM(fp) # Initialisiere ein OSM Objekt custom_filter = {"tourism": ["camp_site", "caravan_site", "camp_pitch"]} # definieren des Filters pois = osm.get_pois(custom_filter=custom_filter) # extrahieren der POIs ``` ### Lesen von Netzwerken Für das Extrahieren von Strassennetzwerken wird in Pyrosm zwischen vier Kategorien unterschieden. (cycling, driving, driving+service, walking). Jenachdem werden andere Daten mit eingeschlossen oder nicht. Damit die Netzwerke weiter analysiert werden können, gibt es die Möglichkeit, sie in Graphen umzuwandeln. Dabei werden drei verschiedene Librarys unterstützt: igraph, NetworkX und Pandana. Beispiel, wie das Strassennetzwerke in der Region Zürich extrahiert und als Graph gespeichert werden kann ```python from pyrosm import OSM from python import get_data fp = get_data("Zuerich") # Herunterladen der OSM Daten osm = OSM(fp) # Initialisiere ein OSM Objekt nodes, edges = osm.get_network(nodes=True, network_type="driving") graph = osm.to_graph(nodes, edges, graph_type="igraph") ``` Mit der Methode `get_network()` wird das Strassennetz gelesen. Per Default wird damit ein GeoDataFrame mit MultilineStrings zurückgegeben. Mit dem Argument `nodes=True`kann jedoch angegeben werden, das die Multilinestrings in Linestrings und Points zurückgegeben werden sollen. Damit kann man dann einen Graph erstellen. Mit `graph_type` kann angegeben werden, welche Library verwendet werden soll. ## pgRouting/ PostgreSQL pgRouting ist eine PostgreSQL Extension, die für das Routing mit Netzwerkdaten verwendet werden kann. Für die Arbeit mit OpenStreetMap Daten gibt es das Tool [osm2pgRouting](https://pgrouting.org/docs/tools/osm2pgrouting.html), mit welchem in wenigen Schritten ein Routingfähiges Netzwerk von OSM importiert werden kann. ### Importieren der Topo3D Daten in pgRouting Damit pgRouting verwendet werden kann, müssen zwei Extensions heruntergeladen und in der Datenbank hinzugefügt werden. Die eine ist pgRouting selbst und die andere ist PostGis. Zuerst müssen die Topo Daten in die Postgres Datenbank geladen werden. Eine Möglichkeit ist dabei, das verwenden von [ogr2ogr](https://gdal.org/programs/ogr2ogr.html), einem CommandLine Tool das in [GDAL](https://gdal.org/) dabei ist. ogr2ogr kann Daten zwischen Fileformaten konvertieren. ```bash ogr2ogr -f "PostgreSQL" PG:"dbname=datenbankname" /../filename -overwrite -progress --config PG_USE_COPY YES ``` Sobald die Daten in PostgreSQL importiert wurden, müssen noch zwei Kolumnen für die externen id hinzugefügt werden, und die Art der Geometrie verändert werden. pgRouting kann nicht mit 3D Geometrien rechnen, weswegen der Spaltentyp angepasst werden muss. ```sql alter table tlm_strasse alter column shape type geometry(MULTILINESTRING,2056) using st_Force2D(shape); alter table tlm_strasse add column source int; alter table tlm_strasse add column target int; ``` pgRouting benutzt ein Netzwerk von Linien und Punkten, die mit ids verknüpft sind für das Routing. Das Strassennetz (tlm_strasse) der Topo3D Daten hat ein dazugehöriges Set and Punkten (tlm_strasseninfo), diese sind jedoch nicht per id verknüpft, wir müssen als ein eigenes Set an Punkten in pgRouting generieren. pgRouting stellt dafür eine eigene Funktion zur verfügung. ```sql select pgr_createVerticesTable('tlm_strasse', 'shape', 'source', 'target'); ``` Sobald das alles gemacht ist, kann die Netzwerk Topologie generiert werden. ```sql select pgr_createTopology('tlm_strasse', 0.00001, 'shape', 'objectid', 'source', 'target') ``` ## APPENDIX: Hombrechtikon-Lützelsee Vergleich der Strassen/Wege (StWe) Daten von swissTLM und OSM in Hombrechtikon-Lützelsee. Ich habe in QGIS für beide Datensätze einen Puffer von 10m um die Wege generieren lassen, und diesen Puffer dann mit dem anderen Datensatz verschnitten. Dadurch sind die Wege übrig geblieben, die auf dem einen Datensatz vorhanden sind und auf dem anderen nicht. Resultat: ![](https://i.imgur.com/tEzxS3d.jpg) 1. OSM-StWe, die nicht in TLM sind (schwarz), und 2. TLM-StWe, die nicht in OSM sind (rot gestrichelt). Die roten Zahlen bedeuten gem. "Objektkatalog swissTLM 3D" Objektart 10(4m),11(3m),15(2m),16(1m) Breite: https://i.imgur.com/tEzxS3d.jpg Erstes Fazit: * TLM ist attributiv homogener (v.a. Belag sowie Befahrbarkeit mit Personenwagen bei 2m-Weg und 3m-Strasse), hat mehr Gebäudezufahrten. TLM ist aber >2j hintendrein und erst die Hälfte der Kantone hat Strassennamen. * OSM ist gleichauf v.a. bei Auto-Strassen, hat mehr StWe, v.a. wichtige Fusswege; ist nicht nur "Strassenachsen-zentriert" (auch Velo/Sidewalks).