Как сделать запрос для всех точек определенного типа с пешеходным расстоянием от 1 до 2 часов в Overpass?
Как сказано в заголовке, мне нужно написать код на Python, который выводит все узлы определенного типа с шагом между двумя значениями. Я предполагаю, что потребуется запрос Overpass для всех узлов вокруг определенной точки, а затем построить кратчайший маршрут с эстакадой и отсортировать все пути.
Таким образом, мой вопрос: есть ли лучший / более короткий способ сделать это, и если нет, как упорядочить маршруты, заданные запросом openrouteservice, по длине?
Последний вопрос: как я могу найти 2 разных маршрута между двумя точками с помощью openrouteservice, эффективно формируя «петлю» с обеими точками на ней.
Мой текущий очень беспорядочный код, который возвращает только маршрут к случайной точке заданного типа внутри заданного радиуса:
client = openrouteservice.Client(key="my_ORS_key")
def findNodeNearLoc(lat, lon, rad):
"""
Given a location finds a node of given type within rad meters.
Parameters:
lat (double): Latitude
lon (double): Longitude
rad (double): radius
Returns:
way (Way): the Way corresponding to a node.
"""
api = overpy.Overpass()
# warning! this uses lat,lon format.
query = f"""way[amenity={type}](around:10000,{lat},{lon});
out body;"""
result = api.query(query)
# Picks the first way in the result
if not result.ways:
print("\n\tError: No results found")
return
else:
return result.ways[0]
def findRoute(start_lat, start_lon, end_lat, end_lon):
"""
Given a start and end location find a route between them
Parameters:
start_lat (double): Start Latitude
start_lon (double): Start Longitude
end_lat (double): End Latitude
end_lon (double): End Longitude
Returns:
Dictionary: A route from the start to the finish
"""
geometry = client.directions(((start_lon, start_lat),(end_lon, end_lat)), profile = "foot-hiking")['routes'][0]['geometry']
decoded = convert.decode_polyline(geometry)
return decoded
node_way = osm.findNodeNearLoc(lat, lon, rad, type)
end_node = node_way.get_nodes(resolve_missing=True)[0]
route = osm.findRoute(lat, lon, float(end_node.lat), float(end_node.lon))