from wrpylib.argparse_tools import bool_type
from wrpylib.wrgeojson import join_sledrun_map_ways, simplify_ways
-from wrpylib.wrosm import find_sledrun_relations, tags, convert_osm_to_geojson
+from wrpylib.wrosm import find_sledrun_relations, tags, convert_osm_to_geojson, DeRefError
def process_osm_file(filename: str, single: Optional[int], join_ways: bool, simplify_max_dist: Optional[float] = 15.):
print("-" * len(title))
# Convert to geojson
- sledrun_geojson = convert_osm_to_geojson(osm_tree, sledrun_relation)
+ try:
+ sledrun_geojson = convert_osm_to_geojson(osm_tree, sledrun_relation)
+ except DeRefError:
+ print('Error: Incomplete XML - please load larger region.')
+ continue
# Merge sledrun ways of the same type
if join_ways:
return {tag.attrib['k']: tag.attrib['v'] for tag in tag_list}
+class DeRefError(ValueError):
+ pass
+
+
def de_ref(osm_tree: ElementTree, element: Element) -> Element:
"""De-references an element (relation member or nd)."""
ref = element.get('ref')
if element.tag == 'member':
- return osm_tree.find(f"./{element.get('type')}[@id='{ref}']")
- if element.tag == 'nd':
- return osm_tree.find(f"./node[@id='{ref}']")
- raise ValueError(f'Unsupported element type: {element.tag}')
+ target = osm_tree.find(f"./{element.get('type')}[@id='{ref}']")
+ elif element.tag == 'nd':
+ target = osm_tree.find(f"./node[@id='{ref}']")
+ else:
+ raise ValueError(f'Unsupported element type: {element.tag}')
+ if target is None:
+ raise DeRefError(f'Element {element} not found in tree.')
+ return target
def node_coordinates(element: Element) -> Point: