aisdb.track_gen module
generation, segmentation, and filtering of vessel trajectories
- 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.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.split_tracks(tracks, max_distance=25000, max_time=datetime.timedelta(days=1), max_speed=50, min_speed=0.2, min_segment_length=15, min_direction_change=45)[source]
Segments AIS tracks based on multiple criteria such as course changes, speed, distance, and time gaps. :param tracks: track vectors generator :type tracks: aisdb.track_gen.TrackGen :param max_distance: Maximum allowable distance (meters) between points in a segment. :type max_distance: float :param max_time: Maximum allowable time difference between points in a segment. :type max_time: timedelta :param max_speed: Maximum allowable speed (knots). :type max_speed: float :param min_speed: Minimum allowable speed (knots). :type min_speed: float :param min_segment_length: Minimum number of points required in a segment. :type min_segment_length: int :param min_direction_change: Minimum course change (degrees) to start a new segment. :type min_direction_change: float