def add_remote_ways(coll): """Takes a collection of elements and adds way references for nodes if they don't have tags, or existing ways """ nodes = [ele for ele in coll if (ele['type'] == 'node' and not ele['tags'] and not ele.has_key('_ways'))] for node in nodes: if node['tags'] or node.has_key('_ways'): # It only needs to have one way for us to care. We're not # looking at all the object relationships, just the first # right now continue data = osmapi.getWaysforNode(node['id']) xml = et.XML(data.encode('utf-8')) ways = [parser.parseWay(way) for way in xml.findall('way')] for way in ways: coll.append(way) # This is a lot of looping we could avoid if we had an index... for nd in nodes: if not nd['id'] in way['nd']: continue if nd.has_key('_ways'): nd['_ways'].append(way) else: nd['_ways'] = [way]
def add_remote_ways(coll): """Takes a collection of elements and adds way references for nodes if they don't have tags, or existing ways """ logging.debug("Adding remote way references. %d items in the collection." % (len(coll))) nodes = [ ele for ele in coll if (ele['type'] == 'node' and not ele.get('tags') and not ele.get('_ways') and not ele.get('_relations')) ] logging.debug("%d nodes to consider" % (len(nodes))) logging.debug("Nodes: \n%s" % pformat(nodes)) for node in nodes: if node['tags'] or node.get('_ways') or node.get('_relations'): # It only needs to have one way for us to care. We're not # looking at all the object relationships, just the first # right now continue logging.debug("Node %s has no remote ways or relations. Retrieving." % str(node['id'])) data = osmapi.getWaysforNode(node['id']) xml = et.XML(data.encode('utf-8')) ways = [parser.parseWay(way) for way in xml.findall('way')] for way in ways: logging.debug("Adding new way %s to collection" % way['id']) logging.debug(pformat(way)) coll.append(way) target_nodes = [ retrieve(coll, 'node', node_id) for node_id in way['nd'] ] target_nodes = [node for node in target_nodes if node] logging.debug("%d nodes potentially effected" % len(target_nodes)) for node in target_nodes: logging.debug("Adding way reference for way %s to node %s" % (str(way['id']), str(node['id']))) if node.has_key('_ways'): node['_ways'].append(way['id']) else: node['_ways'] = [way['id']] logging.debug("Done adding references for way %s" % way['id'])
def add_remote_ways(coll): """Takes a collection of elements and adds way references for nodes if they don't have tags, or existing ways """ logging.debug("Adding remote way references. %d items in the collection." % (len(coll))) nodes = [ele for ele in coll if (ele['type'] == 'node' and not ele.get('tags') and not ele.get('_ways') and not ele.get('_relations'))] logging.debug("%d nodes to consider" % (len(nodes))) logging.debug("Nodes: \n%s" % pformat(nodes)) for node in nodes: if node['tags'] or node.get('_ways') or node.get('_relations'): # It only needs to have one way for us to care. We're not # looking at all the object relationships, just the first # right now continue logging.debug("Node %s has no remote ways or relations. Retrieving." % str(node['id'])) data = osmapi.getWaysforNode(node['id']) xml = et.XML(data) ways = [parser.parseWay(way) for way in xml.findall('way')] for way in ways: logging.debug("Adding new way %s to collection" % way['id']) logging.debug(pformat(way)) coll.append(way) target_nodes = [retrieve(coll, 'node', node_id) for node_id in way['nd']] target_nodes = [node for node in target_nodes if node] logging.debug("%d nodes potentially effected" % len(target_nodes)) for node in target_nodes: logging.debug("Adding way reference for way %s to node %s" % ( str(way['id']), str(node['id']))) if node.has_key('_ways'): node['_ways'].append(way['id']) else: node['_ways'] = [way['id']] logging.debug("Done adding references for way %s" % way['id'])
def way(id, version = None): """Gets a way from the OSM API and returns it as a complete element""" data = osmapi.getWay(id, version) xml = et.XML(data.encode('utf-8')) root = xml.find('way') return parser.parseWay(root)
def way(id, version=None): """Gets a way from the OSM API and returns it as a complete element""" data = osmapi.getWay(id, version) xml = et.XML(data) root = xml.find('way') return parser.parseWay(root)