improved josm; snapping

This commit is contained in:
zyphlar
2026-07-08 14:57:47 -07:00
parent 37398aac8c
commit cc925fd345
5 changed files with 805 additions and 9 deletions
+21 -6
View File
@@ -57,7 +57,7 @@ nwr["addr:housenumber"](area.searchArea);
out center;"""
return query
base_query = f"""[out:json][timeout:120];
base_query = f"""[out:json][timeout:180];
area(id:{area_id})->.searchArea;"""
if data_type == "highways":
@@ -72,13 +72,13 @@ area(id:{area_id})->.searchArea;"""
selector += 'way["highway"~"_link"](area.searchArea);'
selector += 'way["highway"="service"](area.searchArea);'
selector += 'way["highway"="track"](area.searchArea);'
selector += ');'
selector += ')->.ways;'
elif data_type == "multimodal":
selector = '(way["highway"="path"](area.searchArea);way["highway"="cycleway"](area.searchArea););'
selector = '(way["highway"="path"](area.searchArea);way["highway"="cycleway"](area.searchArea);)->.ways;'
else:
raise ValueError(f"Unknown data type: {data_type}")
query = base_query + selector + "out geom;"
query = base_query + selector + ".ways out meta geom;\nnode(w.ways);\nout meta;"
return query
@@ -117,10 +117,18 @@ def query_overpass(query):
def convert_to_geojson(overpass_data):
"""Convert Overpass API response to GeoJSON format."""
# First pass: collect node versions (present when query includes node metadata)
node_versions = {}
for element in overpass_data.get("elements", []):
if element["type"] == "node" and "version" in element:
node_versions[element["id"]] = element["version"]
features = []
for element in overpass_data.get("elements", []):
if element["type"] == "node":
if not element.get("tags"):
continue # Skip topology-only nodes (no tags); versions collected above
feature = {
"type": "Feature",
"properties": element.get("tags", {}),
@@ -133,11 +141,18 @@ def convert_to_geojson(overpass_data):
elif element["type"] in ("way", "relation"):
if "geometry" in element:
# out geom; — full coordinate list (used for highways/paths)
# out meta geom; — full coordinate list + node IDs + version
coordinates = [[coord["lon"], coord["lat"]] for coord in element["geometry"]]
props = dict(element.get("tags", {}))
props["osm_id"] = element["id"]
props["osm_type"] = element["type"]
props["osm_version"] = element.get("version", 1)
if "nodes" in element:
props["osm_nodes"] = element["nodes"]
props["osm_node_versions"] = [node_versions.get(nid, 1) for nid in element["nodes"]]
feature = {
"type": "Feature",
"properties": element.get("tags", {}),
"properties": props,
"geometry": {
"type": "LineString",
"coordinates": coordinates