-
Notifications
You must be signed in to change notification settings - Fork 1
11 Web
Im Internet finden sich unendlich viele Daten und Dienste, die wir downloaden oder anzapfen können, um eine bestimmte Anforderung zu lösen.
In der GIS-Welt müssen z.B. häufig Koordinaten von einem System in ein anderes umgerechnet werden. Den Algorithmus zur Transformation müssen wir nicht selber entwickeln, sondern können dazu einen Dienst im Internet nutzen.
Die swisstopo stellt z.B. einen Dienst (Service) zur Verfügung, mit dem solche Koordinatentransformationen vorgenommen werden können. siehe hier.
Auf der Webseite heisst es sinngemäss (Details siehe Dokumentations-PDF), dass wir über eine bestimmte URL mit der Übergabe der Parameter easting
und northig
die umgerechneten Koordinaten erhalten.
Anhand des aufgeführten Beispiels wissen wir, dass unsere URL so aussehen muss:
https://geodesy.geo.admin.ch/reframe/wgs84tolv03?easting=7.452&northing=46.928&format=json
Im Browserfenster sehen wir nun das Resultat
{"easting": "601017.990423179", "northing": "197433.9052806796"}
Nun gilt es das, was wir im Internetbrowser können, mit Python nachzustellen. Wir basteln die URL mit den Parametern zusammen zusammen und verwenden Variablen für die Koordinaten.
Für die Kommunikation mit dem Internet ist das Modul requests
bestens geeignet.
Dieses ist nicht im Standardpaket von Python enthalten und muss zuerst installiert werden.
Glücklicherweise befinden sich in unserem Github-Repository eine Konfigurationsdatei für eine virtuelle Umgebung. Eine virtuelle Umgebung bietet uns die Möglichkeit, für unser Python-Projekt alle Details und benötigten Pakete zu installieren, die wir brauchen. Das ist praktisch, wenn man an vielen verschiedenen Python-Projekten arbeitet, in denen man z.B. unterschiedliche Python-Versionen oder verschiedene Pakete benötigt. Man kann dann für jedes einzelne Projekt eine separate virtuelle Umgebung erstellen. Wer mehr dazu wissen möchte, kann z.B. hier nachschauen: https://pipenv.pypa.io/en/latest/.
In der Konfigurationsdatei sind alle Pakete, die wir im Laufe unseres Kurses benötigen, bereits aufgelistet.
Mit pipenv install --dev
können wir sie in einem Schritt installieren. Es kann sein, dass wir zuvor noch pipenv
selbst installieren müssten.
Das würde mit pip install pipenv
funktionieren.
Innerhalb des Bundesnetzes erscheinen u.U. Fehlermeldungen, und/oder das Package kann gar nicht installiert werden.
Falls das so ist, bitte bei mir melden. Dann können wir das gemeinsam lösen.
pipenv
gut funktioniert. In letzter Zeit gab es viele Probleme bei der Installation auf Windows-Laptops.
Wir sind daher auf virtualenv
umgestiegen: https://docs.python-guide.org/dev/virtualenvs/#lower-level-virtualenv
Auch hier kann es bei der Installation Probleme geben, aber sie waren vergleichsweise einfach zu lösen.
Eigentlich sollte virtualenv mit der Python-Installation mitgeliefert werden. Falls das mal nicht der Fall ist, kann es mit pip install virtualenv
nachinstalliert werden.
Manchmal hilft es, bereits ignorierte, fehlerhafte Versionen zu ignorieren, und eine Installation zu forcieren: pip install virtualenv -I
.
Um eine virtuelle Umgebung anzulegen:
- im VSCode im Terminal unten (unter Windows sollte das Terminal ein PowerShell sein) in den Projektordern wechseln
- Dort
virtualenv venv
ausführen. Es sollte dann ein neuer Unterordnervenv
im Projektordner angeleget werden - Dann mus die virtuelle Umgebung noch aktiviert werden:
C:\Users\SomeUser\project_folder> venv\Scripts\activate
- Falls das Script von Windows aus Sicherheitsgründen geblockt wird, was wahrscheinlich der Fall sein wird, im VSCode-Terminal das hier eingeben:
Set-ExecutionPolicy Unrestricted -Scope Process
- Jetzt könenn die gewünschten Module installiert werden, z.B.:
pip install requests
, diese werden dann in der virtuelle Umgebung installiert. - Zum Feierabend hin kann die virtuelle Umgebung mit
deactivate
im Terminal deaktiviert werden
import requests
e = 2600000
n = 1200000
service = "https://geodesy.geo.admin.ch/reframe/lv95towgs84"
parameter = {"easting": e,
"northing": n,
"format": "json"}
response = requests.get(url=service, params=parameter, verify=False)
result = response.json()
print(result["easting"])
print(result["northing"])
Auch beim Ausführen des Skriptes kann es innerhalb des Bundesnetzes zu Problemen kommen.
Die Übungsleitung kann euch auch hier gerne helfen.
Übung: Koordinatentransformation
koordinaten.py
Das Gebäude von swisstopo hat die WGS84-Koordinaten 46.928°N 7.452°E. Unser Schulungsgebäude liegt bei der LV03-Koordinate 600050m 198760m.
- Wie weit sind die beiden Gebäude (Luftlinie) voneinander entfernt?
- Runde das Resultat auf 10m genau
Tipps:
- gehe schrittweise vor
- programmiere zuerst die Transformation
- berechne danach die Distanz (Pythagoras)
Übung: Webdienste BGDI
adresse.py
- Studiere die Dokumentation zu den Webdiensten der Bundes-Geodateninfrastruktur.
https://api3.geo.admin.ch/services/sdiservices.html#search- Versuche zu einer beliebigen Adresse die Koordinaten zu erhalten.
https://api3.geo.admin.ch/rest/services/api/SearchServer?searchText=wabern&type=locations
Finde mehr interaktive Beispiele zu den meisten Kapiteln als Python Notebook.