示例#1
0
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)
示例#2
0
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))