The filtering system allows you to chain multiple criteria to process an AIS stream. You create individual filter objects and pass them as a list to a FilterChain.
Available filters:
AttributeFilter(func): Keeps messages where func(msg) is True.NoneFilter(*attr_names): Filters out messages where the specified attributes are None.MessageTypeFilter(*types): Keeps only specified message types.DistanceFilter(ref_point, distance_km): Keeps messages within a certain distance (km) from a (lat, lon) tuple.GridFilter(lat_min, lon_min, lat_max, lon_max): Keeps messages within a geographical bounding box.
Use chain.filter(stream) to apply the filters to an AIS stream.
from pyais import TCPConnection
from pyais.filters import AttributeFilter, NoneFilter, MessageTypeFilter, DistanceFilter, GridFilter, FilterChain
# Define filters
attribute_filter = AttributeFilter(lambda x: not hasattr(x, 'turn') or x.turn == -128.0)
none_filter = NoneFilter('lon', 'lat', 'mmsi2')
message_type_filter = MessageTypeFilter(1, 2, 3)
distance_filter = DistanceFilter((51.900, 5.320), distance_km=1000)
grid_filter = GridFilter(lat_min=50, lon_min=0, lat_max=52, lon_max=5)
# Create and apply the chain
chain = FilterChain([
attribute_filter,
none_filter,
message_type_filter,
distance_filter,
grid_filter,
])
stream = TCPConnection(host='...', port=...)
filtered_data = list(chain.filter(stream))
for msg in filtered_data:
print(msg.lat, msg.lon)