Skip to content

Commit 586a800

Browse files
authored
fix: Small overpass processing issues for surfaces (#98)
1 parent 8b2d0fa commit 586a800

File tree

1 file changed

+14
-8
lines changed

1 file changed

+14
-8
lines changed

pretty_gpx/common/request/overpass_processing.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -247,17 +247,24 @@ def get_members_from_relation(relation: Relation,
247247
outer_geometry_l: list[list[RelationWayGeometryValue]] = []
248248
inner_geometry_l: list[list[RelationWayGeometryValue]] = []
249249
if relation_members is None or recursion_depth >= MAX_RECURSION_DEPTH:
250-
if recursion_depth >= MAX_RECURSION_DEPTH:
251-
logger.warning("Max Recursion depth exceeded in get_members_from_relation function")
252250
return outer_geometry_l, inner_geometry_l
253251
for member in relation_members:
254252
if type(member) == RelationRelation:
255253
logger.debug("Found a RelationRelation i.e. a relation in the members of a relation")
256254
relation_inside_member = member.resolve(resolve_missing=True)
257255
outer_subrelation, inner_subrelation = get_members_from_relation(relation=relation_inside_member,
258256
recursion_depth=recursion_depth+1)
259-
outer_geometry_l += outer_subrelation
260-
inner_geometry_l += inner_subrelation
257+
if member.role == "outer":
258+
outer_geometry_l += outer_subrelation
259+
inner_geometry_l += inner_subrelation
260+
elif member.role == "inner":
261+
# Inversion of outer and inner because the subrelation was an inner
262+
# TODO: Support the inner of an inner subrelation
263+
# (which is an outer but must be drawn on top of the inner)
264+
# Might need to create the polygons on the go to take the outer of an inner into account by leveraging
265+
# shapely holes feature for polygons
266+
# For now, inner of an inner are dropped
267+
inner_geometry_l += outer_subrelation
261268
elif type(member) == RelationWay:
262269
if member.geometry is None:
263270
continue
@@ -482,7 +489,6 @@ def create_polygons_from_geom(outer_geoms: list[list[RelationWayGeometryValue]],
482489
else:
483490
skipped_inners += 1
484491

485-
inner_points = []
486492
for outer_geom in outer_geoms:
487493
point_l = get_lat_lon_from_geometry(outer_geom)
488494
if len(point_l) < 4:
@@ -500,11 +506,11 @@ def create_polygons_from_geom(outer_geoms: list[list[RelationWayGeometryValue]],
500506
# Relaxation of the constraint in order to validate some geometries that are on the border
501507
holes_i.append(hole)
502508
else:
503-
other_holes.append((hole, first_point))
509+
other_holes.append((hole, first_point, middle_point))
504510
polygon_l.append(ShapelyPolygon(shell=outer_polygon.exterior,
505511
holes=holes_i))
506-
inner_points = other_holes
507-
if len(inner_points) > 0:
512+
inner_rings = other_holes
513+
if len(inner_rings) > 0:
508514
logger.warning(f"Relation {id}. Could not find an outer for all inner geometries, {len(inner_geoms)} "
509515
f"inner geometr{'y is' if len(inner_geoms) == 1 else 'ies are'} unused")
510516
if skipped_inners:

0 commit comments

Comments
 (0)