docs: def parse_osm_relations(relations, osm_way_df):
      """
      Parses the osm relations (multipolygons) from osm 
      ways and nodes. See more information about relations 
      from OSM documentation: http://wiki.openstreetmap.org/wiki/Relation 
           
      Parameters
      ----------
      relations : list
          OSM 'relation' items (dictionaries) in a list. 
      osm_way_df : gpd.GeoDataFrame
          OSM 'way' features as a GeoDataFrame that contains all the 
          'way' features that will constitute the multipolygon relations.
       
      Returns
      -------
      gpd.GeoDataFrame
          A GeoDataFrame with MultiPolygon representations of the 
          relations and the attributes associated with them.   
      """
  
      gdf_relations = gpd.GeoDataFrame()
  
      # Iterate over relations and extract the items
      for relation in relations:
          if relation['tags']['type'] == 'multipolygon':
              try:
                  # Parse member 'way' ids
                  member_way_ids = [member['ref'] for member in relation['members'] if member['type'] == 'way']
                  # Extract the ways
                  member_ways = osm_way_df.reindex(member_way_ids)
                  # Extract the nodes of those ways
                  member_nodes = list(member_ways['nodes'].values)
                  try:
                      # Create MultiPolygon from geometries (exclude NaNs)
                      multipoly = MultiPolygon(list(member_ways['geometry']))
                  except Exception:
                      multipoly = invalid_multipoly_handler(gdf=member_ways, relation=relation, way_ids=member_way_ids)
  
                  if multipoly:
                      # Create GeoDataFrame with the tags and the MultiPolygon and its 'ways' (ids), and the 'nodes' of those ways
                      geo = gpd.GeoDataFrame(relation['tags'], index=[relation['id']])
                      # Initialize columns (needed for .loc inserts)
                      geo = geo.assign(geometry=None, ways=None, nodes=None, element_type=None, osmid=None)
                      # Add attributes
                      geo.loc[relation['id'], 'geometry'] = multipoly
                      geo.loc[relation['id'], 'ways'] = member_way_ids
                      geo.loc[relation['id'], 'nodes'] = member_nodes
                      geo.loc[relation['id'], 'element_type'] = 'relation'
                      geo.loc[relation['id'], 'osmid'] = relation['id']
  
                      # Append to relation GeoDataFrame
                      gdf_relations = gdf_relations.append(geo, sort=False)
                      # Remove such 'ways' from 'osm_way_df' that are part of the 'relation'
                      osm_way_df = osm_way_df.drop(member_way_ids)
              except Exception:
                  log("Could not handle OSM 'relation': {}".format(relation['id']))
  
      # Merge 'osm_way_df' and the 'gdf_relations'
      osm_way_df = osm_way_df.append(gdf_relations, sort=False)
      return osm_way_df