wannesm / LeuvenMapMatching

Leuven.MapMatching toolbox for aligning GPS measurements to locations on a map.
Other
226 stars 44 forks source link

I can plot the match results using mmviz.plot_map, but matcher.path_pred_onlynodes is empty. #46

Open Isigned opened 1 year ago

Isigned commented 1 year ago

After using mmviz.plot_map, the route matching result map is already drawn. However, when I want to further observe which routes are matched to the road network, I found that matcher.path_pred_onlynodes is empty. How can I check which routes of the network are matched?

wannesm commented 1 year ago

That sounds odd, yes. Do you have a minimal working example that shows this behavior? Is matcher.path_pred also empty?

Isigned commented 1 year ago

That sounds odd, yes. Do you have a minimal working example that shows this behavior? Is matcher.path_pred also empty?

Sorry, I checked later and found that mmviz.plot_map only draws the latitude and longitude of the trip, but does not match the route network information.

This code is from a post on the web that I refer to.

First set the boundary according to the latitude and longitude

import osmnx as ox
bounds =  [ ]  # Here are the latitude and longitude of two points, which represent a rectangular area
north, south, east, west = bounds[3], bounds[1], bounds[2], bounds[0]
G = ox.graph_from_bbox(north, south, east, west, network_type='drive')

Then get the coordinates of the road center point

nodes, edges = ox.graph_to_gdfs(G, nodes=True, edges=True)
edges['lon'] = edges.centroid.x
edges['lat'] = edges.centroid.y

Convert the coordinate system of the road network

G_p = ox.project_graph(G, to_crs=2416)
nodes_p, edges_p = ox.graph_to_gdfs(G_p, nodes=True, edges=True)

Convert the road network into a network

map_con = InMemMap(name='pNEUMA', use_latlon=True, use_rtree=False, index_edges=True)

Build the network

for node_id, row in nodes_p.iterrows():
    map_con.add_node(node_id, (row['y'], row['x']))
for node_id_1, node_id_2, _ in G_p.edges:
    map_con.add_edge(node_id_1, node_id_2)

Introduce the package

import geopandas as gpd

where "tmp_gdf" is a table with latitude and longitude, and finally "path" is a list with a tuple of travel latitude and longitude

tmp_gdf['geometry'] = gpd.points_from_xy(tmp_gdf['lat'],tmp_gdf['long'])
tmp_gdf = gpd.GeoDataFrame(tmp_gdf)
tmp_gdf.crs = {'init':'epsg:4326'}
tmp_gdf = tmp_gdf.to_crs(4326)

path = list(zip(tmp_gdf.geometry.y, tmp_gdf.geometry.x))

Matching

matcher = DistanceMatcher(map_con, 
                          max_dist=500, 
                          max_dist_init=170, 
                          min_prob_norm=0.0001,
                        non_emitting_length_factor=0.95,
                        obs_noise=50, 
                          obs_noise_ne=50,
                              dist_noise=50,
                              max_lattice_width=20,
                              non_emitting_states=True)

states, _ = matcher.match(path, unique=False)

fig, ax = mmviz.plot_map(map_con, matcher=matcher,
               show_labels=False, show_matching=True,show_graph=True,
               #figwidth=20,
               #use_osm=True, zoom_path=True,

               #lon_labels_right=True, lat_labels_bottom=True, flip_lon=True, flip_lat=True,
               filename=None)

mmviz.plot_map only draws the latitude and longitude of the trip, but does not match the route network information.

wannesm commented 1 year ago

You can activate debug output to see (and share) what is happening: https://leuvenmapmatching.readthedocs.io/en/latest/usage/debug.html