From f4dcd37e7881b7c47a433f548df52cff2990e7dc Mon Sep 17 00:00:00 2001 From: Claude Dev Date: Thu, 26 Mar 2026 00:56:54 +0100 Subject: [PATCH] Fix: natural/waterway aus Generic-Filter entfernt Bei Landschaftsbildern waren alle Tags gefiltert (0 Ergebnisse). natural=peak, natural=wood etc. sind mit Region-BBox suchbar. Nur building, highway, landuse bleiben als generisch gefiltert. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/data_vlm.py | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/data_vlm.py b/src/data_vlm.py index b9144ec..8dc1a91 100644 --- a/src/data_vlm.py +++ b/src/data_vlm.py @@ -360,8 +360,18 @@ async def generate_queries(req: QueryGenRequest): fragments = [] used_types = set() + # Generische Keys die Overpass ueberlasten + _GENERIC_KEYS = { + "building", "highway", "landuse", + "surface", "barrier", "wall", "fence", "roof", + "addr:street", "addr:city", "addr:housenumber", + "name", "source", "type", + } + for obj in req.objects: obj_type = obj.get("type", "").lower().replace(" ", "_") + osm_tags = obj.get("osm_tags", []) + logger.info(f"VLM Objekt: type={obj_type}, osm_tags={osm_tags}") # Direkte Zuordnung if obj_type in _OBJECT_TO_OVERPASS and obj_type not in used_types: @@ -369,33 +379,33 @@ async def generate_queries(req: QueryGenRequest): fragments.append(f' node{tag}{bbox_str};') fragments.append(f' way{tag}{bbox_str};') used_types.add(obj_type) + logger.info(f" -> Mapping-Match: {obj_type} -> {tag}") continue # Fallback: OSM-Tags aus VLM-Ergebnis verwenden - # Generische Tags ignorieren (zu viele Treffer, Overpass Timeout) - _GENERIC_KEYS = { - "building", "highway", "landuse", "natural", "waterway", - "surface", "barrier", "wall", "fence", "roof", - "addr:street", "addr:city", "addr:housenumber", - "name", "source", "type", - } - osm_tags = obj.get("osm_tags", []) + matched = False for tag_str in osm_tags: if "=" in tag_str and tag_str not in used_types: key, val = tag_str.split("=", 1) if key in _GENERIC_KEYS: - continue # Zu generisch, ueberspringen + logger.info(f" -> Tag gefiltert (generisch): {tag_str}") + continue frag = f'["{key}"="{val}"]' fragments.append(f' node{frag}{bbox_str};') fragments.append(f' way{frag}{bbox_str};') used_types.add(tag_str) + logger.info(f" -> OSM-Tag verwendet: {tag_str}") + matched = True break + if not matched and obj_type not in _OBJECT_TO_OVERPASS: + logger.warning(f" -> KEIN MATCH fuer: {obj_type} (tags: {osm_tags})") if not fragments: raise HTTPException(400, "Keine passenden OSM-Tags fuer die erkannten Objekte gefunden") query = "[out:json][timeout:30];\n(\n" + "\n".join(fragments) + "\n);\nout center body;" + logger.info(f"VLM generierte Query: {query}") result = { "query": query, "object_count": len(req.objects), @@ -403,5 +413,7 @@ async def generate_queries(req: QueryGenRequest): } if region_used: result["region"] = region_used + logger.info(f"VLM Query generiert: {query}") + if region_used: logger.info(f"VLM Query: Region '{region_used}' als BBox verwendet") return result