aisdb.track_gen module

generation, segmentation, and filtering of vessel trajectories

exception aisdb.track_gen.EmptyRowsException[source]

Bases: Exception

aisdb.track_gen.TrackGen(rowgen: iter, decimate: False) dict[source]

generator converting sets of rows sorted by MMSI to a dictionary containing track column vectors. each row contains columns from database: mmsi time lon lat name … rows must be sorted by first by mmsi, then time

Parameters:
  • rowgen (aisdb.database.dbqry.DBQuery.gen_qry()) – DBQuery rows generator. Yields rows returned by a database query

  • decimate (bool) – if True, linear curve decimation will be applied to reduce the number of unnecessary datapoints

Yields:

dictionary containing track column vectors. static data (e.g. mmsi, name, geometry) will be stored as scalar values

>>> import os
>>> import numpy as np
>>> from datetime import datetime
>>> from aisdb import SQLiteDBConn, DBQuery, TrackGen, decode_msgs
>>> from aisdb.database import sqlfcn_callbacks
>>> # create example database file
>>> dbpath = 'track_gen_test.db'
>>> filepaths = ['aisdb/tests/testdata/test_data_20210701.csv',
...              'aisdb/tests/testdata/test_data_20211101.nm4']
>>> with SQLiteDBConn(dbpath) as dbconn:
...     decode_msgs(filepaths, dbconn=dbconn, source='TESTING', verbose=False)
...     q = DBQuery(callback=sqlfcn_callbacks.in_timerange_validmmsi,
...                 dbconn=dbconn,
...                 start=datetime(2021, 7, 1),
...                 end=datetime(2021, 7, 7))
...     rowgen = q.gen_qry()
...     for track in TrackGen(rowgen, decimate=True):
...         result = (track['mmsi'], track['lon'], track['lat'], track['time'])
...         assert result == (204242000, np.array([-8.931666], dtype=np.float32),
...                           np.array([41.45], dtype=np.float32), np.array([1625176725], dtype=np.uint32))
...         break
aisdb.track_gen.fence_tracks(tracks, domain)[source]

compute points-in-polygons for vessel positions within domain polygons

yields track dictionaries

Also see zone_mask()

aisdb.track_gen.min_speed_filter(tracks, minspeed)[source]
aisdb.track_gen.simplify_linestring_idx(x, y, precision)

linear curve decimation using visvalingam-whyatt algorithm.

Parameters:
  • x (array of float32) – longitudes

  • y (array of float32) – latitudes

  • precision (float32) – coordinates will be rounded to the nearest value. e.g. 0.01 for decimation to within a few km radius

Returns:

Vec<usize>

Array of indices along (x,y)

aisdb.track_gen.split_timedelta(tracks, maxdelta=datetime.timedelta(days=14))[source]

partitions tracks where delta time exceeds maxdelta

Parameters:
  • tracks (aisdb.track_gen.TrackGen) – track vectors generator

  • maxdelta (datetime.timedelta) – threshold at which tracks should be partitioned

aisdb.track_gen.zone_mask(tracks, domain)[source]

compute points-in-polygons for track positions, and filter results to positions within domain.

yields track dictionaries.

also see fence_tracks()