source: subversion/applications/routing/pyroute/poi_osm.py @ 20924

Last change on this file since 20924 was 18561, checked in by buerste, 10 years ago

update

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