@@ -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