Как сделать запрос для всех точек определенного типа с пешеходным расстоянием от 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))

0 ответов

Другие вопросы по тегам