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:

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).