Read/Write track, network and raster#

  1. Read/Write track(s) section.

  2. Read/Write network(s) section.

1. Read/Write track(s)#

Toutes les méthodes sont statiques dans la classe TrackReader pour la lecture et dans la classe TrackWriter pour écrire les données.

Loading track or track collection#

tracklib permet de charger des données GPS depuis un ou plusieurs fichiers de type CSV, GPX et dont les géométries sont sous forme de coordonnées ou au format wkt. Le timestamp, s’il existe peut-être fourni en format texte ou en time unix. Les AF peuvent être ou non chargées. On peut aussi filtrer les données à charger. On peut aussi définir un template.

File or folder, GPX or CSV#

Arguably the most common type of resource is a file. You specify it using the path to the file. To see all file import options, see TrackReader in API Reference.

  1. Example for a GPX file

    import os
    from tracklib.core.ObsTime import ObsTime
    from tracklib.io.TrackReader import TrackReader
    
    ObsTime.setReadFormat("4Y-2M-2DT2h:2m:2sZ")
    resource_path = '/home/glagaffe/tracklib/data'
    filepath = os.path.join(resource_path, 'activity_5807084803.gpx')
    tracks = TrackReader.readFromGpx(filepath)
    tracks[0].plot()
    
  2. Example for a CSV file

    import os
    from tracklib.core.ObsTime import ObsTime
    from tracklib.io.TrackReader import TrackReader
    
    ObsTime.setReadFormat("4Y-2M-2D 2h:2m:2s")
    resource_path = '/home/glagaffe/tracklib/data'
    filepath = os.path.join(resource_path, 'trace10_mm.dat')
    track = TrackReader.readFromCsv(filepath, 2, 3, -1, 1, h=1)
    track.plot()
    
  3. Example for a CSV file with a geometry structured in WKT (track is associated with a linestring)

    import os
    from tracklib.core.ObsTime import ObsTime
    from tracklib.io.TrackReader import TrackReader
    
    resource_path = '/home/glagaffe/tracklib/data/wkt'
    csvpath = os.path.join(resource_path, 'iti.wkt')
    TRACES = TrackReader.readFromWkt(csvpath, id_geom=0,
                                 separator="#", h=1, doublequote=True)
    print (len(TRACES))
    
  4. If you have a list of CVS files in a folder

    from tracklib.core.ObsTime import ObsTime
    from tracklib.io.TrackReader import TrackReader
    
    ObsTime.setReadFormat("2D/2M/4Y 2h:2m:2s")
    resource_path = '/home/glagaffe/tracklib/data/test/csv'
    collection = TrackReader.readFromCsv(resource_path, 1, 2, -1, -1)
    print (collection.size(), ' CSV tracks loaded')
    
  5. If you have a list of GPX files in a folder

    from tracklib.core.ObsTime import ObsTime
    from tracklib.io.TrackReader import TrackReader
    
    resource_path = '/home/glagaffe/tracklib/data/gpx/geo'
    ObsTime.setReadFormat("4Y-2M-2DT2h:2m:2sZ")
    tracks = TrackReader.readFromGpx(resource_path)
    print (collection.size(), ' GPX tracks loaded')
    

Time field#

Le format du champ time peut être défini de différentes façons dans les fichiers CSV:

  • champ texte, on spécifie le format

    ObsTime.setReadFormat("4Y-2M-2DT2h:2m:2sZ")
    ObsTime.setReadFormat("2D/2M/4Y 2h:2m:2s")
    
  • pas de champ time, -1

    idT = -1

  • Timestamp is in milliseconds

    PATH = '/home/marie-dominique/DATA/GPX/MOPSI/0/'
    dateInitiale = '1970-01-01 00:00:00'
    collection = reader.readFromCsv(path=PATH, id_E=1, id_N=0, id_T=2,
                                      srid="GeoCoords",
                                      DateIni = GPSTime.readTimestamp(dateInitiale),
                                      selector = s,
                                      separator = ' ', verbose = True)
    

Crs field#

Pour les 3 méthodes d’import, readFromGpx, readFromCsv et readFromWkt vous pouvez préciser quel type de coordonnées vous avez:

geographic coordinates

srid="GeoCoords"
# or
srid = "GEO"

or local projection (ENU or ENUCoords)

srid="ENUCoords"
# or
srid="ENU"

Loading tracks with Analytical Features#

If the CVS file contains AF, to load all of them

ObsTime.setReadFormat("2D/2M/4Y 2h:2m:2s")
chemin = os.path.join(self.resource_path, 'data/test/ecrins_interpol4.csv')
track = TrackReader.readFromCsv(chemin, 0, 1, 2, 3, separator=";",read_all=True)

Select tracks inside a defined bounding box#

Load a track collection by specifying and a directory in the variable ‘path’. Timestamp is in milliseconds. Select only tracks inside a defined bounding box

from tracklib.io.TrackReader import TrackReader as reader
from tracklib.core.GPSTime import GPSTime
from tracklib.core.Coords import ENUCoords
import tracklib.algo.Geometrics as Geometrics
from tracklib.algo.Selection import Constraint
from tracklib.algo.Selection import TYPE_CUT_AND_SELECT, MODE_INSIDE
from tracklib.algo.Selection import Selector

Xmin = 29.72
Xmax = 29.77
Ymin = 62.585
Ymax = 62.615

ll = ENUCoords(Xmin, Ymin)
ur = ENUCoords(Xmax, Ymax)
bbox = Geometrics.Rectangle(ll, ur)

constraintBBox = Constraint(shape = bbox, mode = MODE_INSIDE, type=TYPE_CUT_AND_SELECT)
s = Selector([constraintBBox])

PATH = '/home/marie-dominique/DATA/GPX/MOPSI/0/'
GPSTime.setReadFormat("4Y-2M-2D 2h:2m:2s")
dateInitiale = '1970-01-01 00:00:00'
collection = reader.readFromCsv(path=PATH, id_E=1, id_N=0, id_T=2,
                                srid="GeoCoords",
                                DateIni = GPSTime.readTimestamp(dateInitiale),
                                selector = s,
                                separator = ' ', verbose = True)

Template#

First, it is necessary to define the template in resources/track_file_format

RTKLIB    , pos, 2, 1, 3, 0, -1, bb, 1, %, -999999, GEO, 4Y/2M/2D 2h:2m:2s.3z, FALSE

Then to load the file

resource_path = '/home/glagaffe/tracklib/data/'
csvpath = os.path.join(resource_path, 'raw_gps.pos')
gps = TrackReader.readFromCsv(csvpath, "RTKLIB")
print (gps.size())

Export track or track collection#

  • To export only the basics attributes of a track, position and timestamp

    csvpath = os.path.join(self.resource_path, 'data/test/test_write_csv_minim.wkt')
    TrackWriter.writeToFile(track, csvpath, id_E=0,id_N=1,id_U=2,id_T=3,h=1, separator=";")
    
  • To export basic attributes and analytical features

    csvpath = os.path.join(self.resource_path, 'data/test/test_write_csv_2AF.wkt')
    af_names = ['speed', 'abs_curv']
    TrackWriter.writeToFile(track, csvpath, id_E=0, id_N=1, id_U=2, id_T=3, h=1,
                               separator=";", af_names=af_names)
    
  • Write one or many tracks in one or many GPX files

    TrackWriter.writeToGpx(self.collection, path=gpxpath, af=True, oneFile=False)
    
  • Write in a KML

    kmlpath = os.path.join(self.resource_path, 'data/test/couplage.kml')
    TrackWriter.writeToKml(trace, path=kmlpath, type="LINE", af='speed')
    

2. Read/Write network(s)#

Toutes les méthodes sont statiques dans la classe NetworkReader pour la lecture et dans la classe NetworkWriter pour écrire les données.

Loading network#

The NetworkReader class offers static methods that loads a network either from a file or from the IGN FRANCE Web Service .

loading network data from csv file#

Arguably the most common type of resource is a file. You specify it using the path to the file. To see all file import options, see CSV Files section in API Reference.

  1. Example

    from tracklib.io.NetworkReader import NetworkReader
    
    network = NetworkReader.readFromFile('network_760850.csv', formatfile = 'IGNGEO')
    network.toENUCoords(trace.base)
    #print ('nb edges=', len(network.EDGES))
    #print ('nb nodes=', len(network.NODES))
    

French map agency web service import#

If you want road network data from France, an alternative way to load network data is to use french map agence web service (WFS ). To see all file import options, see WFS service section in API Reference.

  1. Example

    import matplotlib.pyplot as plt
    
        from tracklib.core.Bbox import Bbox
        from tracklib.core import ObsCoords as Coords
        from tracklib.io.NetworkReader import NetworkReader
        from tracklib.io.NetworkWriter import NetworkWriter
    
        xmin = 6.74168
        xmax = 6.82568
        ymin = 45.3485
        ymax = 45.4029
        emprise = Bbox(Coords.GeoCoords(xmin, ymin), Coords.GeoCoords(xmax, ymax))
    
        proj = "EPSG:4326"
    
        tolerance=0.0001
    
        network = NetworkReader.requestFromIgnGeoportail(emprise, proj, margin=0.020,
                   tolerance=tolerance, spatialIndex=False, nomproxy='ENSG')
    
    
        network.plot('k-', '', 'g-', 'r-', 0.5, plt)
        print ('nb edges=', len(network.EDGES))
        print ('nb nodes=', len(network.NODES))