Skip to main content
`Ctrl`+`K`

# 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))