Export aus Portal mit maxspeed

Hallo zusammen

Es gibt bekanntlich zwei Optionen beim Export von Daten aus dem Portal: 1. Überholvorgänge und 2. Strassenstatistiken.

In OSM ist zu den Segmenten auch tag k=„maxspeed“ v=„50“/ vorhanden. Wäre es möglich, dass dieser Wert bei den Exporten aus dem Portal ebenfalls mitgenommen wird. Damit ein Vergleich der Überholdistanz zwischen den unterschiedlichen Höchstgeschwindigkeiten möglich wird. Oder gibt es bereits einen Weg dies zu tun?

Leider nicht einfach, das im Portal zu exportieren, weil wir nicht die ganze openstreetmap importieren, und den Wert in der Datenbank deshalb gar nicht zur Verfügung haben - Man müsste um das anzeigen zu können die Datenbankstruktur im Portal ändern, und mehr von der OpenStreetmap importieren. Alternativ könntest du über die segment id im postprozessing in der openstreetmap den maxspeed nachschlagen.

1 „Gefällt mir“

Ich habe mir nun ein Script von einem LML schreiben lassen. Und soweit ich das sehen kann, funktioniert es. Ich habe die maxspeed eines segments auf OSM angepasst - auf den richten wert. Und nach der erneuten Ausführung des Scipts wurde er Wert ins neue json übernommen, welchen ich auf OSM eingetragen hatte. Da dies geklappt hat, habe ich den Code um Tag zu Fahrradinfrastuktur erweitern lassen. Auch das sollte korrekt sein - habe stichprobenmässig überprüft.

Ich exportiere ein Strassenstatistik-json aus dem Portal und lasse dann diesen code laufen, der ein neues, mit Tags angereichertes json erstellt. Allenfalls hilft dieser Code wem. Daum:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script zur automatischen Ergänzung von OSM-Tags für OSM-Ways in einem GeoJSON,
inklusive Spezifizierung gängiger cycleway-Werte als separate Booleans.

Vorgehen:
1. GeoJSON laden und way_id aus Eigenschaften extrahieren
2. Overpass-API in Chunks (Standard: 200 IDs) abfragen via HTTP-Requests
3. Sammeln der Tags: maxspeed + Fahrradinfrastruktur-Tags
4. DataFrame mit neuen Spalten abspeichern, inkl. cycleway_* Booleans
5. GeoJSON-Features mit diesen Tags ergänzen und speichern
"""
import json
import pandas as pd
import requests
import time

# --- Konfiguration ---
INPUT_GEOJSON = "ueberholungen_alle_auswertung_segmente.json"
OUTPUT_CSV = "segmente_mit_osm_tags.csv"
OUTPUT_GEOJSON = "segmente_mit_osm_tags.json"
CHUNK_SIZE = 200       # Anzahl Way-IDs pro Overpass-Abfrage
SLEEP_BETWEEN = 1      # Sekunden Pause zwischen den Anfragen
OVERPASS_URL = "https://overpass-api.de/api/interpreter"

# Liste der zu extrahierenden OSM-Tags
TAG_KEYS = [
    "maxspeed",
    "cycleway", "cycleway:left", "cycleway:right", "cycleway:both",
    "highway",
    "bicycle", "oneway:bicycle", "bicycle:forward", "bicycle:backward",
    "route", "network",
    "segregated",
    "amenity"
]
# Einzelne cycleway-Werte, die als Booleans aufgesplittet werden sollen
CYCLEWAY_VALUES = ["lane", "track", "share_busway", "shared_lane"]

# --- Hilfsfunktionen ---
def chunk_list(lst, n):
    """Teilt eine Liste in Teilstücke der Größe n."""
    for i in range(0, len(lst), n):
        yield lst[i:i+n]

# --- Hauptlogik ---
if __name__ == "__main__":
    # 1) GeoJSON einlesen
    with open(INPUT_GEOJSON, "r", encoding="utf-8") as f:
        data = json.load(f)

    # 2) DataFrame aus properties erstellen
    records = [feat.get("properties", {}) for feat in data.get("features", [])]
    df = pd.DataFrame(records)
    if "way_id" not in df.columns:
        raise KeyError("Die Spalte 'way_id' wurde in den GeoJSON-Eigenschaften nicht gefunden.")
    way_ids = df["way_id"].astype(int).tolist()

    # 3) Overpass-Abfragen per HTTP-Request
    tags_map = {}  # way_id -> tags dict
    for chunk in chunk_list(way_ids, CHUNK_SIZE):
        id_list = ",".join(map(str, chunk))
        query = f"[out:json][timeout:25];way(id:{id_list});out tags;"
        try:
            resp = requests.post(OVERPASS_URL, data={'data': query})
            resp.raise_for_status()
            result = resp.json()
            for element in result.get('elements', []):
                if element.get('type') == 'way':
                    wid = int(element['id'])
                    tags_map[wid] = element.get('tags', {})
        except Exception as e:
            print(f"Fehler bei Overpass-Abfrage für Chunk {chunk[:3]}...: {e}")
        time.sleep(SLEEP_BETWEEN)

    # 4) Tags in DataFrame mappen
    for key in TAG_KEYS:
        df[key] = df['way_id'].astype(int).map(lambda wid: tags_map.get(wid, {}).get(key))

    # cycleway-Werte als Booleans
    for val in CYCLEWAY_VALUES:
        col = f"cycleway_{val}"
        df[col] = df['cycleway'] == val

    #  Daten als CSV speichern
    df.to_csv(OUTPUT_CSV, index=False, encoding="utf-8")
    print(f"CSV mit OSM-Tags gespeichert: {OUTPUT_CSV}")

    # 5) GeoJSON-Features aktualisieren und speichern
    for feat in data.get("features", []):
        props = feat.setdefault("properties", {})
        wid = int(props.get("way_id", -1))
        tags = tags_map.get(wid, {})
        # Original-Tags hinzufügen
        for key in TAG_KEYS:
            if key in tags:
                props[key] = tags[key]
        # cycleway_* Booleans hinzufügen
        cycleway_val = tags.get('cycleway')
        for val in CYCLEWAY_VALUES:
            props[f"cycleway_{val}"] = (cycleway_val == val)

    with open(OUTPUT_GEOJSON, "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=2)
    print(f"Erweitertes GeoJSON gespeichert: {OUTPUT_GEOJSON}")