Speichern von Overpass-Abfrageergebnissen in einer GeoJSON-Datei mit Python

Salü Community

ich will ein Leaflet erstellen, das die Daten deutscher Schulen zeigt.
Dazu hab ich ja verschieden Möglichkeiten.

a. Abfrage via Overpass-Turbo und Ausgabe der Daten in GeoJSon-format:
b. Abfrage via Python über die Overpass-Turbo-API
usw. usf.

Hintergrund: Ich habe mal überlegt, hier Python zu verwenden und möchte eine Abfrage an Overpass stellen und die Ergebnisse in einem Geodatenformat (z. B. GeoJSON) speichern. Soweit ich weiß, gibt es eine Bibliothek namens Overpy, nach der ich suchen sollte.

Nachdem ich die Dokumentation gelesen hatte, kam ich auf den folgenden kleinen Code:

geojson_school_map

import overpy
import json

API = overpy.Overpass()

# Fetch schools in Germany
result = API.query("""
[out:json][timeout:250];
{{geocodeArea:Deutschland}}->.searchArea;
nwr[amenity=school][!"isced:level"](area.searchArea);
out geom;
""")

# Create a GeoJSON dictionary to store the features
geojson = {
    "type": "FeatureCollection",
    "features": []
}

# Iterate over the result and extract relevant information
for node in result.nodes:
    # Extract coordinates
    lon = float(node.lon)
    lat = float(node.lat)

    # Create a GeoJSON feature for each node
    feature = {
        "type": "Feature",
        "geometry": {
            "type": "Point",
            "coordinates": [lon, lat]
        },
        "properties": {
            "name": node.tags.get("name", "Unnamed School"),
            "amenity": node.tags.get("amenity", "school")
            # Add more properties as needed
        }
    }

    # Append the feature to the feature list
    geojson["features"].append(feature)

# Write the GeoJSON to a file
with open("schools.geojson", "w") as f:
    json.dump(geojson, f)

print("GeoJSON file created successfully!")

was ich vorhabe: Ich werde die Daten der Abfrage der Overpass-API für Schulen in Deutschland hinzufügen.

Dabei gehe ich in einer Schrittfolge vor;

Nach der Extraktion der relevanten Informationen wie Koordinaten und Schulnamen werde ich diese Daten anschließend in das GeoJSON-Format konvertieren.
Schließlich werden die GeoJSON-Daten in eine Datei mit dem Namen „schools.geojson“ geschrieben.

hier meine resultate die ich bekomme, wenn ich das auf google-colab: laufen lasse.

verpassBadRequest                        Traceback (most recent call last)

<ipython-input-3-f0918b7fb5d0> in <cell line: 7>()
      5 
      6 # Fetch schools in Germany
----> 7 result = API.query("""
      8 [out:json][timeout:250];
      9 {{geocodeArea:Deutschland}}->.searchArea;

/usr/local/lib/python3.10/dist-packages/overpy/__init__.py in query(self, query)
    173                 )
    174                 if not do_retry:
--> 175                     raise current_exception
    176                 retry_exceptions.append(current_exception)
    177                 continue

OverpassBadRequest: Error: line 3: parse error: Unknown type &quot;{&quot; 
Error: line 3: parse error: An empty query is not allowed 
Error: line 3: parse error: ';' expected - '{' found.

Diese Zeile ist dein Problem. Diese funktin geocofeArea:* wird nur von overpass-turbo unterstützt. Wenn du auf der Webseite unter Export die eigenständige Abfrage dir abrufst, dann siehst du, dass dieser geocode vorher aufgelöst wird.
Bzw. Dort die rohe Abfrage solltest du verwenden können.

Und auf die dreifachen Anführungszeichen solltest du verzichten. Da sollten einfache ausreichen.

1 Like

Hi und vielen dank fuer die rueckmeldung.

Vorweg: hab gearade etwas wenig zeit ( bin gearade etwas im " osterstress". :grinning::smiley:Aber spaeter am Abend hab ich laenger zeit.

. Freu mich. Der mix im code ist problematisch. Du meinst dass ich das also via overpass turbo request zu einem verarbeitbaren datensatz bringen kann.
Im grund muss ich ja auch nicht mit nem python script abfragen.

Melde mich spaeter am Abend wieder

Viele gruesse

Tagtheworld :slightly_smiling_face:

Noch ganz kurz.:

Mit einem python script arbeiteten zu koennen ist dennoch eine sache, die fuer mich auch interessant ist. Und das z.b. in google colab laufen lassen zu koennen - das ist grundsaetzlich auch eine “tolle Sache”.

Viele gruesse, tagtheworld :slightly_smiling_face:

import overpass
import geojson

api = overpass.API(timeout=500)
result = api.get("""area["name"="Deutschland"]->.boundaryarea;
                 (nwr["amenity"="school"](area.boundaryarea);)"""
                 ,responseformat="geojson", verbosity="geom")

with open('osmExport.geojson', 'w') as f:
   geojson.dump(result, f)

Edit: Ob das mit Google Colab funzt, weiß ich nicht. Gitlab geht.
Edit2: Für ganz DE klappt es bei mir doch nicht. Bremen und Hamburg sind hingegen kein Problem. Keine Ahnung, wo das Problem liegt. Vielleicht hilft es trotzdem.

1 Like

Hallo 4b696

Vielen Dank für deine Nachricht und die wertvollen Tipps

Das hilft mir hier sehr. Bin gerade etwas in Eile.

Werde das heute Abend noch einmal testen hier.

Viele Grüße

PS . Denke dass es so auch in colab laufen. Sollte
Vg

Liegt ggf daran, dass es kein eindeutige Area in Overpass aufgelöst gibt.

Helfen würde hier:

// fetch area “Deutschland” to search in
area(id:3600051477)->.searchArea;
nwr["amenity"="school"](area.searchArea);
1 Like

hallo und guten Tag Safetying

vielen Dank für deinen Beitrag. Das hilft hier weiter.

VG TagTheWorld

hallo nochmals @4b696d und @SafetyIng

vielen Dank für Eure Beiträge zu diesem Thema. Also ich kann derlei Abfragen - die ich über Overpass-Turbo stelle - in einem GeoJson-Format dann exportieren - u. in einem Leaflet dann darstellen - z.B. auch in WordPress:

denke dass das damit gehen sollte: Geojson, properties and Popups – Extensions for Leaflet Map

Extensions for Leaflet Map :: With the WordPress plugin Leaflet Map you can display maps using shortcodes. Extensions for Leaflet Map integrates Leaflet plugins and offers even more functions.

Euch nochmals vielen Dank!

VG TagTheWorld :wink:

Falls du noch Hilfe brauchst, hier sind Beipiele mit Kirchen:

https://leafext.de/grouping/geojsonfeature/