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) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
@@ -360,8 +360,18 @@ async def generate_queries(req: QueryGenRequest):
|
|||||||
fragments = []
|
fragments = []
|
||||||
used_types = set()
|
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:
|
for obj in req.objects:
|
||||||
obj_type = obj.get("type", "").lower().replace(" ", "_")
|
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
|
# Direkte Zuordnung
|
||||||
if obj_type in _OBJECT_TO_OVERPASS and obj_type not in used_types:
|
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' node{tag}{bbox_str};')
|
||||||
fragments.append(f' way{tag}{bbox_str};')
|
fragments.append(f' way{tag}{bbox_str};')
|
||||||
used_types.add(obj_type)
|
used_types.add(obj_type)
|
||||||
|
logger.info(f" -> Mapping-Match: {obj_type} -> {tag}")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Fallback: OSM-Tags aus VLM-Ergebnis verwenden
|
# Fallback: OSM-Tags aus VLM-Ergebnis verwenden
|
||||||
# Generische Tags ignorieren (zu viele Treffer, Overpass Timeout)
|
matched = False
|
||||||
_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", [])
|
|
||||||
for tag_str in osm_tags:
|
for tag_str in osm_tags:
|
||||||
if "=" in tag_str and tag_str not in used_types:
|
if "=" in tag_str and tag_str not in used_types:
|
||||||
key, val = tag_str.split("=", 1)
|
key, val = tag_str.split("=", 1)
|
||||||
if key in _GENERIC_KEYS:
|
if key in _GENERIC_KEYS:
|
||||||
continue # Zu generisch, ueberspringen
|
logger.info(f" -> Tag gefiltert (generisch): {tag_str}")
|
||||||
|
continue
|
||||||
frag = f'["{key}"="{val}"]'
|
frag = f'["{key}"="{val}"]'
|
||||||
fragments.append(f' node{frag}{bbox_str};')
|
fragments.append(f' node{frag}{bbox_str};')
|
||||||
fragments.append(f' way{frag}{bbox_str};')
|
fragments.append(f' way{frag}{bbox_str};')
|
||||||
used_types.add(tag_str)
|
used_types.add(tag_str)
|
||||||
|
logger.info(f" -> OSM-Tag verwendet: {tag_str}")
|
||||||
|
matched = True
|
||||||
break
|
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:
|
if not fragments:
|
||||||
raise HTTPException(400, "Keine passenden OSM-Tags fuer die erkannten Objekte gefunden")
|
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;"
|
query = "[out:json][timeout:30];\n(\n" + "\n".join(fragments) + "\n);\nout center body;"
|
||||||
|
|
||||||
|
logger.info(f"VLM generierte Query: {query}")
|
||||||
result = {
|
result = {
|
||||||
"query": query,
|
"query": query,
|
||||||
"object_count": len(req.objects),
|
"object_count": len(req.objects),
|
||||||
@@ -403,5 +413,7 @@ async def generate_queries(req: QueryGenRequest):
|
|||||||
}
|
}
|
||||||
if region_used:
|
if region_used:
|
||||||
result["region"] = 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")
|
logger.info(f"VLM Query: Region '{region_used}' als BBox verwendet")
|
||||||
return result
|
return result
|
||||||
|
|||||||
In neuem Issue referenzieren
Einen Benutzer sperren