def _parse_directions_json(response, algorithm, elevation): if response is None: # pragma: no cover if algorithm == 'alternative_route': return Directions() else: return Direction() if algorithm == 'alternative_route': routes = [] for route in response['paths']: geometry = [ list(reversed(coord)) for coord in utils.decode_polyline5( route['points'], elevation) ] routes.append( Direction(geometry=geometry, duration=int(route['time'] / 1000), distance=int(route['distance']), raw=route)) return Directions(routes, response) else: geometry = [ list(reversed(coord)) for coord in utils.decode_polyline5( response['paths'][0]['points'], elevation) ] return Direction(geometry=geometry, duration=int(response['paths'][0]['time'] / 1000), distance=int(response['paths'][0]['distance']), raw=response)
def _parse_direction_json(response, format, units): if response is None: # pragma: no cover return Direction() units_factor = 1 if units == 'mi': units_factor = 0.621371 * 1000 elif units == 'km': units_factor = 1000 if format == 'geojson': geometry = response['features'][0]['geometry']['coordinates'] duration = int( response['features'][0]['properties']['summary']['duration']) distance = int( response['features'][0]['properties']['summary']['distance']) elif format == 'json': geometry = [ list(reversed(coord)) for coord in utils.decode_polyline5( response['routes'][0]['geometry']) ] duration = int(response['routes'][0]['summary']['duration']) distance = int(response['routes'][0]['summary']['distance'] * units_factor) return Direction(geometry=geometry, duration=duration, distance=distance, raw=response)
def test_full_directions_not_encoded(self): query = deepcopy(ENDPOINTS_QUERIES[self.name]["directions"]) query["points_encoded"] = False query["algorithm"] = None res = ENDPOINTS_RESPONSES[self.name]["directions"] res["paths"][0]["points"] = dict( coordinates=decode_polyline5(res["paths"][0]["points"])) responses.add( responses.GET, "https://graphhopper.com/api/1/route", status=200, json=ENDPOINTS_RESPONSES[self.name]["directions"], content_type="application/json", ) route = self.client.directions(**query) self.assertEqual(1, len(responses.calls)) self.assertURLEqual( "https://graphhopper.com/api/1/route?avoid=tunnel%3Bford&" "block_area=48.23424%2C8.34234&calc_points=false&ch.disable=true&debug=true&details=time&details=tolls&" "elevation=true&heading=50%2C50%2C50&heading_penalty=100&instructions=false&key=sample_key&locale=en&" "optimize=true&pass_through=true&point=49.415776%2C8.680916&point=49.420577%2C8.688641&" "point=49.445776%2C8.780916&point_hint=Graphhopper%20Lane&point_hint=OSM%20Street&point_hint=Routing%20Broadway" "&points_encoded=false&vehicle=car&type=json&weighting=short_fastest&snap_prevention=trunk%2Cferry&curb_side=any%2Cright&turn_costs=true", responses.calls[0].request.url, ) self.assertIsInstance(route, Direction) self.assertIsInstance(route.geometry, list) self.assertIsInstance(route.duration, int) self.assertIsInstance(route.distance, int) self.assertIsInstance(route.raw, dict)
def _parse_direction_json(response, alternatives): if response is None: # pragma: no cover if alternatives: return Directions() else: return Direction() if alternatives: routes = [] for route in response['routes']: geometry = [] duration, distance = 0, 0 for leg in route['legs']: duration += leg['duration']['value'] distance += leg['distance']['value'] for step in leg['steps']: geometry.extend([ list(reversed(coords)) for coords in utils.decode_polyline5(step['polyline']['points']) ]) routes.append( Direction(geometry=geometry, duration=int(duration), distance=int(distance), raw=route)) return Directions(routes, response) else: geometry = [] duration, distance = 0, 0 for leg in response['routes'][0]['legs']: duration = int(leg['duration']['value']) distance = int(leg['distance']['value']) for step in leg['steps']: geometry.extend([ list(reversed(coords)) for coords in utils.decode_polyline5(step['polyline']['points']) ]) return Direction(geometry=geometry, duration=duration, distance=distance, raw=response)
def _parse_geometry(route_geometry): if geometry_format in (None, 'polyline'): geometry = utils.decode_polyline5(route_geometry, is3d=False) elif geometry_format == 'polyline6': geometry = utils.decode_polyline6(route_geometry, is3d=False) elif geometry_format == 'geojson': geometry = route_geometry['coordinates'] else: raise ValueError( "OSRM: parameter geometries needs one of ['polyline', 'polyline6', 'geojson" ) return geometry
def test_polyline5_3d_decoding(self): decoded = [(8.68864, 49.42058, 120.96), (8.68092, 49.41578, 1491.39)] self.assertEqual(decoded, utils.decode_polyline5(self.coords3d_5prec, True))
def test_polyline5_2d_decoding(self): decoded = [(8.68864, 49.42058), (8.68092, 49.41578)] self.assertEqual(decoded, utils.decode_polyline5(self.coords2d_5prec))