Skip to content
Jürgen Hansmann edited this page Mar 13, 2024 · 10 revisions

Web

Dienste

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.

Requests

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.

⚠️ In vielen Jahren hat der Kurs mit 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 Unterordner venv 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

  1. Studiere die Dokumentation zu den Webdiensten der Bundes-Geodateninfrastruktur.
    https://api3.geo.admin.ch/services/sdiservices.html#search
  2. Versuche zu einer beliebigen Adresse die Koordinaten zu erhalten.
    https://api3.geo.admin.ch/rest/services/api/SearchServer?searchText=wabern&type=locations
Clone this wiki locally