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}")