Сопоставление карт не работает. Когда координаты находятся внутри дома или офиса. Если в данных OSM отсутствует дорога.

Моя цель — создать алгоритм создания карт. Итак, у меня есть GPS-данные о поездках пользователя. Сопоставление карты Валгаллы является идеальным решением для моего варианта использования. Но если GPS-отслеживание маршрута внутри дома, офиса или парковочного места, тогда сопоставление карты Валгаллы обеспечивает ближайшую дорогу.

Перед сопоставлением карт

После сопоставления карты Итак, после сопоставления карты отслеживание желтых автомагистралей идеально. Так что это не выдается, Но внутри зеленой зоны (сада) видно много прямых линий, И я не предполагаю, что есть какое-либо решение, где внутри зеленой зоны (сад) Также показаны некоторые незашумленные координаты.

Таким образом, в основном необходимо сочетание сопоставления карты Валгаллы и удаления некоторых зашумленных координат.

Есть решение?

Я попробовал использовать выходные данные Валгаллы и оригинальные координаты. Если в оригинале идентифицировано достаточно близлежащих координат, метод Noisy устранит зашумленные координаты и заменит их выходными данными, которые соответствуют карте Валгаллы.

Вот код, пожалуйста, просмотрите его

      import requests
import json
from geoJsonToCoords import geoJsonToCoords
from common import extractCoordinates, haversineDistance, saveIntoJSFile
from sklearn.cluster import DBSCAN
import numpy as np

df_rawGPS_points = geoJsonToCoords('./example/1.geojson')
meili_coordinates = df_rawGPS_points.to_json(orient='records')
meili_head = '{"shape":'
meili_tail = ""","search_radius": 300, "shape_match":"map_snap", "costing":"auto", "format":"osrm"}"""
meili_request_body = meili_head + meili_coordinates + meili_tail
url = "http://localhost:8002/trace_route"
headers = {'Content-type': 'application/json'}
data = str(meili_request_body)
r = requests.post(url, data=data, headers=headers)

if r.status_code == 200:
    response_text = json.loads(r.text)
    # a = valhalla, b= orignal
    valhalla_c, original_c = extractCoordinates(
        df_rawGPS_points, response_text)
    a = original_c
    b = valhalla_c
    print("a>>", valhalla_c, len(valhalla_c))
    print("b>>", original_c, len(original_c))

    all_coordinates = np.array(a + b)

    eps = 0.05
    min_samples = 2

    dbscan = DBSCAN(eps=eps, min_samples=min_samples, metric=haversineDistance)
    labels = dbscan.fit_predict(np.radians(all_coordinates))

    cluster_counts = {}
    for label in labels:
        if label != -1:
            cluster_counts[label] = cluster_counts.get(label, 0) + 1

    high_density_clusters = [label for label,
                            count in cluster_counts.items() if count > 2]

    result = []

    for coord_a, coord_b, label in zip(a, b, labels):
        if label in high_density_clusters:
            result.append(coord_b)
        else:
            result.append(coord_a)

    print("result >>>", result)
    saveIntoJSFile(result)

И функции

      def extractCoordinates(df_rawGPS_points, response):
    import pandas as pd
    import json

    resp = str(response['tracepoints'])
    resp = resp.replace("'waypoint_index': None", "'waypoint_index': '#'")
    resp = resp.replace(
        "None", "{'matchings_index': '#', 'name': '', 'waypoint_index': '#', 'alternatives_count': 0, 'distance': 0, 'location': [0.0, 0.0]}")

    resp = resp.replace("'", '"')
    resp = json.dumps(resp)
    resp = json.loads(resp)
    df_response = pd.read_json(resp)
    df_response = df_response[['name', 'distance', 'location']]
    df_trip_optimized = pd.merge(
        df_rawGPS_points, df_response, left_index=True, right_index=True)

    a = [coord[::-1] for coord in df_trip_optimized['location'].tolist()]
    b = df_trip_optimized[['lat', 'lon']].values.tolist()
    return a, b


def haversineDistance(coord1, coord2):
    from math import radians, sin, cos, sqrt, atan2
    R = 6371.0
    lat1, lon1 = coord1
    lat2, lon2 = coord2
    lat1, lon1, lat2, lon2 = map(radians, [lat1, lon1, lat2, lon2])
    dlat = lat2 - lat1
    dlon = lon2 - lon1
    a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2
    c = 2 * atan2(sqrt(a), sqrt(1 - a))
    distance = R * c

    return distance


def dtwDistance(seq1, seq2):
    import numpy as np
    from scipy.spatial.distance import euclidean
    n, m = len(seq1), len(seq2)
    cost = np.inf * np.ones((n, m))

    cost[0, 0] = euclidean(seq1[0], seq2[0])
    for i in range(1, n):
        for j in range(1, m):
            cost[i, j] = euclidean(seq1[i], seq2[j]) + \
                min(cost[i-1, j], cost[i, j-1], cost[i-1, j-1])

    return cost[-1, -1]

0 ответов

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