source: subversion/applications/routing/pyroute-dev/poi_osm.py

Last change on this file was 18456, checked in by buerste, 10 years ago

-reodering imports

  • Property svn:keywords set to Rev
File size: 3.4 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4"""OSM POI handler for pyroute
5"""
6
7__version__ = "$Rev: 18456 $"[1:-2]
8__license__ = """This program is free software: you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
12
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with this program. If not, see <http://www.gnu.org/licenses/>."""
20_debug = 0
21
22
23from poi_base import *
24from xml.sax import make_parser, handler
25import os
26import urllib
27
28class osmPoiModule(poiModule, handler.ContentHandler):
29        def __init__(self, modules):
30                poiModule.__init__(self, modules)
31                self.draw = False
32                self.loadPOIs("all", "amenity|shop=*")
33
34        def loadPOIs(self, name, search):
35                filename = os.path.join(os.path.dirname(__file__),
36                                                                                                                "data", "poi_%s.osm" % name)
37
38                url = "http://www.informationfreeway.org/api/0.5/node[%s][%s]" %(search,
39                                                                                                                                                                                                                                                                                 self.bbox())
40
41                if(not os.path.exists(filename)):
42                        print "Downloading POIs from OSM"
43                        urllib.urlretrieve(url, filename)
44                self.load(filename, os.path.join(os.path.dirname(__file__),
45                                                                                                                "Setup", "poi.txt"))
46
47        def bbox(self):
48                # TODO: based on location!
49                return "bbox=-6,48,2.5,61"
50
51        def load(self, filename, listfile):
52                self.filters = []
53                print "Loading POIs from %s" % listfile
54                f = open(listfile,"r")
55                try:
56                        for line in f:
57                                if(len(line) > 1):
58                                        text = line.rstrip()
59                                        name, filter = text.split('|')
60                                        group = poiGroup(name)
61                                        self.groups.append(group)
62                                        self.filters.append({'name':name,'filter':filter,'group':group})
63                finally:
64                        f.close()
65
66                if(not os.path.exists(filename)):
67                        print "Can't load %s"%filename
68                        return
69                self.inNode = False
70                parser = make_parser()
71                parser.setContentHandler(self)
72                parser.parse(filename)
73
74
75        def startElement(self, name, attrs):
76                if name == "node":
77                        self.currentNode = { \
78                                'lat': float(attrs.get('lat')),
79                                'lon': float(attrs.get('lon'))}
80                        self.inNode = True
81                if name == "tag" and self.inNode:
82                        self.currentNode[attrs.get('k')] = attrs.get('v')
83
84        def endElement(self, name):
85                if(name == "node"):
86                        self.storeNode(self.currentNode)
87                        self.inNode = False
88
89        def passesFilter(self,n,f):
90                parts = f.split(';')
91                matched = True
92                for part in parts:
93                        k,v = part.split('=',1)
94                        if(n.get(k,'') != v):
95                                matched = False
96                return(matched)
97
98        def storeNode(self, n):
99                for f in self.filters:
100                        if(self.passesFilter(n,f['filter'])):
101                                x = poi(n['lat'], n['lon'])
102                                x.title = n.get('amenity','') + ': ' + n.get('name', '?')
103                                #print "%s matches %s" % (x.title, f['name'])
104                                f['group'].items.append(x)
105
106        def save(self):
107                # Default filename if none was loaded
108                if(self.filename == None):
109                        self.filename = os.path.join(os.path.dirname(__file__),
110                                                                                                                "data", "poi.osm")
111
112                self.saveAs(self.filename)
113
114        def saveAs(self,filename):
115                if(filename == None):
116                        return
117                pass
118
119
120if __name__ == "__main__":
121        nodes = osmPoiModule(None)
122        nodes.sort({'valid':True,'lat':51.3,'lon':-0.2})
123        #nodes.report()
Note: See TracBrowser for help on using the repository browser.