class osmData(pyrouteModule): def __init__(self, modules): pyrouteModule.__init__(self,modules) self.data = LoadOsm(None) def defaultFilename(self): return("data/routing.osm") def loadDefault(self): self.load(self.defaultFilename()) def load(self,filename): print "Loading OSM data from %s"%filename self.data.loadOsm(filename) def download(self,params): ownpos = self.get('ownpos') if(not ownpos['valid']): print "Can only download around own position" return lat = ownpos['lat'] lon = ownpos['lon'] size = 0.2 url = "http://informationfreeway.org/api/0.5/way[bbox=%1.4f,%1.4f,%1.4f,%1.4f][highway|railway|waterway=*]" % (lon-size,lat-size,lon+size,lat+size) print "downloading %s" % url filename = self.defaultFilename() if(os.path.exists(filename)): print "Removing existing file" os.remove(filename) urllib.urlretrieve(url, filename) print "Finished downloading" self.load(filename)
class osmData(pyrouteModule): def __init__(self, modules): pyrouteModule.__init__(self,modules) self.data = LoadOsm('cycle') def defaultFilename(self): return("data/routing.osm") def loadDefault(self): self.load(self.defaultFilename()) def load(self,filename): print "Loading OSM data from %s"%filename self.data.loadOsm(filename) def download(self,params): ownpos = self.get('ownpos') if(not ownpos['valid']): print "Can only download around own position" return lat = ownpos['lat'] lon = ownpos['lon'] size = 0.2 url = "http://open.mapquestapi.com/xapi/api/0.6/way[bbox=%1.4f,%1.4f,%1.4f,%1.4f][highway|railway|waterway=*]" % (lon-size,lat-size,lon+size,lat+size) print "downloading %s" % url filename = self.defaultFilename() if(os.path.exists(filename)): print "Removing existing file" os.remove(filename) urllib.urlretrieve(url, filename) print "Finished downloading" self.load(filename)
def route_geojson(input_f, output_f, mode='foot', local_planet=None): osmdata = LoadOsm(mode) if local_planet is not None: osmdata.getArea = lambda lat, lon: None osmdata.api = None print('loading osm data (this may take a while)...') osmdata.loadOsm(local_planet) print('starting router...') router = Router(osmdata) print('processing shapes...') # First load up the shapes layer = geojson.load(input_f) non_linestring = 0 not_two_points = 0 unsuccessful = 0 successful = 0 very_long = 0 first = True output_f.write('{"crs": {"type": "name", "properties": ' '{"name": "urn:ogc:def:crs:OGC:1.3:CRS84"}}, ' '"type": "FeatureCollection", "features": [\n') for feature in layer.features: if feature.geometry.type != 'LineString': # Not a LineString, skip! non_linestring += 1 continue geometry = list(feature.geometry.coordinates) if len(geometry) != 2: # LineString with other than two points, skip! not_two_points += 1 continue if pythagoras(*geometry[0] + geometry[1]) > 1.0: very_long += 1 continue # Now find a route. Data has x,y coordinates, but function is y,x, so # reverse the parameters. start = osmdata.findNode(*geometry[0][::-1]) end = osmdata.findNode(*geometry[1][::-1]) result, route = router.doRoute(start, end) if result != 'success': unsuccessful += 1 continue routed_geometry = [] for node_id in route: node = osmdata.rnodes[node_id] routed_geometry.append((node[1], node[0])) new_feature = geojson.Feature( geometry=geojson.LineString(coordinates=routed_geometry), properties=feature.properties, id=feature.id, ) if not first: output_f.write(',\n') first = False geojson.dump(new_feature, output_f) output_f.flush() successful += 1 output_f.write('\n]}\n') output_f.close() print( '%d LineStrings routed. Errors: %d non-linestring(s), ' '%d linestring(s) with !=2 points, %d very long, ' '%d unsuccessful routings' % (successful, non_linestring, not_two_points, very_long, unsuccessful))