def __init__(self):
     self.api = MapquestApi()
     self._ATTRIBNAME = "highway"
     self._STREET_CATEGORIES = ['road', 'trunk', 'primary', 'secondary', 'tertiary',
                                'unclassified', 'residential', 'service', 'trunk_link',
                                'primary_link', 'secondary_link', 'tertiary_link', 'pedestrian']
     self.crosswalks = []
     self.streets = []
class StreetLoader:
    def __init__(self):
        self.api = MapquestApi()
        self._ATTRIBNAME = "highway"
        self._STREET_CATEGORIES = ['road', 'trunk', 'primary', 'secondary', 'tertiary',
                                   'unclassified', 'residential', 'service', 'trunk_link',
                                   'primary_link', 'secondary_link', 'tertiary_link', 'pedestrian']
        self.crosswalks = []
        self.streets = []


    def load_streets(self, bbox):
        self._load_data(bbox)
        return self.streets

    def _load_data(self, bbox):
        tree = self.api.request(bbox)
        self._parse_tree(tree)
        self._filter_crosswalks(tree)

    def _filter_crosswalks(self, tree):
        for node in tree.iter('node'):
            for tag in node.iter('tag'):
                if self._is_crosswalk(tag):
                    self.crosswalks.append(Node(node.get('lat'), node.get('lon')))

    def _parse_tree(self, tree):
        node_map = self._get_node_map(tree)
        for way in tree.iter('way'):
            for tag in way.iter('tag'):
                for category in self._STREET_CATEGORIES:
                    if self._is_in_category(tag,category):
                        results = self._parse_way(way, node_map)
                        self.streets += results

    def _is_in_category(self,tag, category):
        return str(tag.attrib) == "{'k': 'highway', 'v': '" + category + "'}"

    def _is_crosswalk(self, tag):
        return str(tag.attrib) == "{'k': 'highway', 'v': 'crossing'}"

    def _parse_way(self, way, node_map):
        result = []
        nodes = self._create_node_list(way, node_map)
        for i in range(len(nodes) -1):
            me = nodes[i]
            next_node = nodes[i + 1]

            street = self._create_street(way)
            street.nodes.append(me)
            street.nodes.append(next_node)
            result.append(street)

        return result

    def _create_street(self, way):
        ident = way.get('id')
        name = ""
        highway = ""

        for tag in way.iter('tag'):
            if tag.attrib['k'] == 'name':
                name = tag.attrib['v']
            if tag.attrib['k'] == 'highway':
                highway = tag.attrib['v']

        street = Street.from_info(name,ident,highway)
        return street

    def _create_node_list(self, way, node_map):
        nodes = []
        for node in way.iter('nd'):
            nid = node.get('ref')
            if nid in node_map:
                nodes.append(node_map[nid])
        return nodes

    def _get_node_map(self,tree):
        nodes = {}
        for node in tree.iter('node'):
            nodes[node.get('id')] = Node(node.get('lat'), node.get('lon'), node.get('id'))
        return nodes