improved josm; snapping
This commit is contained in:
+21
-6
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user