Map-matching a track#

On peut mapper une trace sur un réseau (mapOnNetwork), un raster sur une trace (mapOnRaster), une trace sur une autre trace (mapOn).

Import de la librairie tracklib#

[1]:
import matplotlib.pyplot as plt
import os
import sys

#-------------------------------------------------------
# Import de tracklib

module_path = os.path.abspath(os.path.join('../../..'))
if module_path not in sys.path:
    sys.path.append(module_path)

Map-matching a track on a network#

Read GPX data#

[2]:
import matplotlib.pyplot as plt

# On charge les données
from tracklib.core.ObsTime import ObsTime
from tracklib.io.TrackReader import TrackReader
from tracklib.io.NetworkReader import NetworkReader
from tracklib.core.SpatialIndex import SpatialIndex
import tracklib.algo.Mapping as mapping

ObsTime.setReadFormat("4Y/2M/2D 2h:2m:2s")
trackpath = '/home/marie-dominique/tracklib/tracklib/data/gpx/utgtrack-22245.csv'
netpath = '/home/marie-dominique/tracklib/tracklib/data/network/network-utgtrack-22245.csv'

# ================================================================

trace = TrackReader.readFromCsv(path=trackpath, id_E=0, id_N=1, id_T=6,
                                  srid="GeoCoords", h=1,
                                  separator = ',', verbose = True)
trace.toENUCoordsIfNeeded()
trace.summary()
Loading file /home/marie-dominique/tracklib/tracklib/data/gpx/utgtrack-22245.csv
  File /home/marie-dominique/tracklib/tracklib/data/gpx/utgtrack-22245.csv loaded: 52 point(s) registered
-------------------------------------
GPS track #utgtrack-22245 of user 0:
-------------------------------------
  Nb of pt(s):   52
  Ref sys id   : ENU
  Starting at  : 12/07/2019 15:42:35
  Ending at    : 12/07/2019 16:48:16
  Duration     : 3941.000 s
  Length       : 1325.334 m
-------------------------------------

Read the network#

[3]:
network = NetworkReader.readFromFile(netpath, formatfile = 'VTT')
network.toENUCoords(trace.base)
print ('nb edges=', len(network.EDGES))
print ('nb nodes=', len(network.NODES))
print ('total length=', network.totalLength())


100% (289 of 289) |######################| Elapsed Time: 0:00:00 Time:  0:00:00
Loading network...
nb edges= 288
nb nodes= 216
total length= 19386.544826479818

Prepare and launch the map matching#

[4]:
si = SpatialIndex(network)
network.spatial_index = si


100% (288 of 288) |######################| Elapsed Time: 0:00:00 Time:  0:00:00
Building [100 x 80] spatial index...
[5]:
# computes all distances between pairs of nodes
network.prepare()


 31% (69 of 216) |#######                | Elapsed Time: 0:00:00 ETA:   0:00:00
Computing all pairs shortest distances...
100% (216 of 216) |######################| Elapsed Time: 0:00:00 Time:  0:00:00
[6]:
# Map track on network
mapping.mapOnNetwork(trace, network, search_radius=25, debug=False)


100% (52 of 52) |########################| Elapsed Time: 0:00:00 Time:  0:00:00
100% (51 of 51) |########################| Elapsed Time: 0:00:00 Time:  0:00:00
Map-matching preparation...
Compilation of states on track
Cost and marker matrix initialization
Compilation of observations on track
Optimal sequence computation
Backward reconstruction phase

Display results#

[7]:
plt.figure(figsize = (10, 7))

# emprise = trace.bbox()
plt.xlim([-580, 20])
plt.ylim([-20, 180])

trace.plotAsMarkers(append=True)
network.plot('b-', '', '', '', 1.5, plt)
si.plot(base=False, append=True)

for k in range(len(trace)):
    X = [trace[k].position.getX(), trace["hmm_inference", k][0].getX()]
    Y = [trace[k].position.getY(), trace["hmm_inference", k][0].getY()]
    plt.plot(X, Y, "r--", linewidth=1.4)
    trace[k].position.setX(trace["hmm_inference", k][0].getX())
    trace[k].position.setY(trace["hmm_inference", k][0].getY())
../_images/notebook_MapMatchingOnNetwork_13_0.png

Mapping a raster on a track#

[8]:
from tracklib.core.ObsTime import ObsTime
from tracklib.io.RasterReader import RasterReader
from tracklib.io.TrackReader import TrackReader
import tracklib.algo.Mapping as mapping


ObsTime.setReadFormat("4Y/2M/2D 2h:2m:2s")
trace = TrackReader.readFromCsv('/home/marie-dominique/tracklib/tracklib/data/asc/8961191_v3.csv',
                                id_E=0, id_N=1, id_U=3, id_T=4,
                                separator=",", h=1)
trace.summary()
#trace.plot()


chemin = '/home/marie-dominique/tracklib/tracklib/data/asc/test.asc'
raster = RasterReader.readFromAscFile(chemin, name='mnt')
band = raster.getRasterBand(0)  # bands.get('mnt')
band.summary()
#print ('ele MNT VT:', band.grid[465][1151])

mapping.mapOnRaster(trace, raster)
print (trace.getListAnalyticalFeatures())


for j in range(trace.size()):
    pos = trace.getObs(j).position
    if pos.getX() == 942323.41762134002055973:
        print ('ele MNT AF:', trace.getObsAnalyticalFeature('mnt', j))
        print ('ele Z:', pos.getZ())
-------------------------------------
GPS track #8961191_v3 of user 0:
-------------------------------------
  Nb of pt(s):   363
  Ref sys id   : ENU
  Starting at  : 02/08/2018 13:42:42
  Ending at    : 03/08/2018 07:04:42
  Duration     : 62520.000 s
  Length       : 19636.023 m
-------------------------------------

-------------------------------------
Grid 'mnt':
-------------------------------------
       nrows = 2000
       ncols = 2000
       XPixelSize = 5.0
       YPixelSize = 5.0
   Bounding box:
       Lower left corner : 939997.5,6430002.5
       Upper right corner: 949997.5,6440002.5
-------------------------------------

['mnt']
ele MNT AF: 2006.0
ele Z: 2002.007