docs: def ding0_graph_to_routing_specs(graph):
      """ Build data dictionary from graph nodes for routing (translation)
  
      Args
      ----
      graph: :networkx:`NetworkX Graph Obj< >`
          NetworkX graph object with nodes
  
      Returns
      -------
      :obj:`dict`
          Data dictionary for routing.
          
      See Also
      --------
      ding0.grid.mv_grid.models.models.Graph : for keys of return dict
          
      """
  
      # get power factor for loads
      cos_phi_load = cfg_ding0.get('assumptions', 'cos_phi_load')
  
      specs = {}
      nodes_demands = {}
      nodes_pos = {}
      nodes_agg = {}
  
      # check if there are only load areas of type aggregated and satellite
      # -> treat satellites as normal load areas (allow for routing)
      satellites_only = True
      for node in graph.nodes():
          if isinstance(node, LVLoadAreaCentreDing0):
              if not node.lv_load_area.is_satellite and not node.lv_load_area.is_aggregated:
                  satellites_only = False
  
      for node in graph.nodes():
          # station is LV station
          if isinstance(node, LVLoadAreaCentreDing0):
              # only major stations are connected via MV ring
              # (satellites in case of there're only satellites in grid district)
              if not node.lv_load_area.is_satellite or satellites_only:
                  # get demand and position of node
                  # convert node's demand to int for performance purposes and to avoid that node
                  # allocation with subsequent deallocation results in demand<0 due to rounding errors.
                  nodes_demands[str(node)] = int(node.lv_load_area.peak_load / cos_phi_load)
                  nodes_pos[str(node)] = (node.geo_data.x, node.geo_data.y)
                  # get aggregation flag
                  if node.lv_load_area.is_aggregated:
                      nodes_agg[str(node)] = True
                  else:
                      nodes_agg[str(node)] = False
  
          # station is MV station
          elif isinstance(node, MVStationDing0):
              nodes_demands[str(node)] = 0
              nodes_pos[str(node)] = (node.geo_data.x, node.geo_data.y)
              specs['DEPOT'] = str(node)
              specs['BRANCH_KIND'] = node.grid.default_branch_kind
              specs['BRANCH_TYPE'] = node.grid.default_branch_type
              specs['V_LEVEL'] = node.grid.v_level
  
      specs['NODE_COORD_SECTION'] = nodes_pos
      specs['DEMAND'] = nodes_demands
      specs['MATRIX'] = calc_geo_dist_matrix_vincenty(nodes_pos)
      specs['IS_AGGREGATED'] = nodes_agg
  
      return specs