A Python package for Map Matching and Mapping. Research work for Noise Planet center.
This package was tested in 2019 and may be deprecated depending on your environment.
Python for map matching and mapping geojson tracks
This library is a project within the research center UMR-AE/CNRS, working on NoisePlanet for noise mapping. Made in collaboration with the École Nationale des Sciences Géographiques.
Citation : Dujardin, A., Mermet, S. (2020). État de l’art et suggestions pour la cartographie des données acoustiques mobiles. Projet de recherche.
noiseplanet is a Python package that lets you extract, correct, and plot geojson data on Leaflet maps. The main focus of this package is on map matching, and uses Open Street Map network as reference. The geojson track should contains a list of GPS points that you want to match on the street graph. The only informations used for the map matching are the points coordinates.
OSM network
The report and poster made for this project can be found here and here.
This module use several packages :
To install, clone the repository, and in the noiseplanet folder execute the setup.py
:
git clone https://github.com/arthurdjn/noiseplanet
cd noiseplanet
pip install .
For plotting and interface, the following packages are used :
Note that these packages are optional if you don't want to visualize the resulting maps. SQLite3 is used to stock all the informations of a geojson tracks or polygon into an SQL database.
noiseplanet is composed by internal sub-packages:
This project was created to provide new ways of mapping for the UMR-AE/CNRS team.
The noiseplanet package provides different tools for matching a track to the Open Street Map network.
However, the matching algorithm used within NoisePlanet is taken from Hidden Markov Models, as the matching is more precised.
HMM based algorithm used
To match a track, composed by latitudes and longitudes, use :
import numpy as np
import osmnx as ox
from noiseplanet.matcher import matching
track = np.array([[45.7584882 , 4.83585996],
[45.75848068, 4.83586747],
[45.75849549, 4.83585205],
[45.75849134, 4.83584647],
[45.75848135, 4.8358245 ],
# ...
[45.75846756, 4.83580848],
[45.75844998, 4.83580936],
[45.7584067 , 4.83580086],
[45.7584067 , 4.83580086],
[45.75839346, 4.83579883]])
graph = matching.model.graph_from_track(track)
track_coor, route_corr, edgeid, stats = matching.match(graph, track, method='hmm')
And visualize the results :
from noiseplanet.ui.foroute import plot_html
# Plot the graph
plot_html(track, track_corr=track_corr, route_corr=route_corr,
proj=True, show_graph=True)
You can change the matching method. For example, the above method uses Hidden Markov Models, and is the best way to match a track on the OSM (see the report for more details). However, you can use a naive method to match the track on the nearest road :
track_coor, route_corr, edgeid, stats = matching.match(graph, track, method='nearest')
And visualize the results :
from noiseplanet.ui import plot_html
# Plot the graph
plot_html(track, track_corr=track_corr, route_corr=route_corr,
proj=True, show_graph=True)
Check the read the docs documentation for more depth in the functions used. You can also see the report published for this project here : Dujardin, A., Mermet, S. (2020). État de l’art et suggestions pour la cartographie des données acoustiques mobiles. Projet de recherche.
The map matching algorithm was used to match more than 500.000 tracks from Lyon. Therefore, the noise can be represented on roads and sidewalks, more relevant at larger scale.
Before : heat map and hexagonal grid
After : points and roads