Table of Contents

Class DynamicFeature

Namespace
EncDotNet.S100.DynamicSources
Assembly
EncDotNet.S100.Core.dll

A single push-driven feature published by an IDynamicFeatureSource.

public sealed record DynamicFeature : IEquatable<DynamicFeature>
Inheritance
DynamicFeature
Implements
Inherited Members

Remarks

Geometry vocabulary is intentionally identical to the static vector pipeline's Feature: GeometryType is the same enum and Coordinates uses the same (Latitude, Longitude) tuple convention. This keeps renderer authors from learning two systems and gives adapters that want to snapshot a dynamic source as a static dataset a one-line projection.

The record is not derived from Feature because of three semantic mismatches documented in docs/design/dynamic-feature-source.md §5 Q2: stable string identity (vs the static record's long id), opaque renderer-dispatch Kind (vs FC-bound FeatureType), and the optional Motion / required LastUpdated temporal fields.

Dynamic sources must only use Point, Curve, or Surface. Coverage push is deferred to a future IDynamicCoverageSource; None is degenerate.

Properties

Attributes

Caller-defined extra attributes — vessel name, MMSI, call sign, pressure level, sensor reading, leg label, etc. Renderers consume this opaquely.

public IReadOnlyDictionary<string, object?> Attributes { get; init; }

Property Value

IReadOnlyDictionary<string, object>

Coordinates

Geometry coordinates in WGS-84 lat/lon. Same convention as the static vector pipeline: latitude first. Cardinality depends on GeometryType — exactly 1 for Point, at least 2 for Curve, a closed ring (first and last coincident) for Surface.

public required IReadOnlyList<GeoPosition> Coordinates { get; init; }

Property Value

IReadOnlyList<GeoPosition>

GeometryType

Geometry kind. Restricted to Point / Curve / Surface for dynamic sources (see remarks on the type).

public required GeometryType GeometryType { get; init; }

Property Value

GeometryType

Id

Source-stable opaque identity. The source chooses the semantics — MMSI for AIS, "ownship" for an own-ship singleton, a GUID for a route waypoint, an isobar key for a weather contour. Stability across updates is a hard contract: the same feature must round-trip the same Id.

public required string Id { get; init; }

Property Value

string

Kind

Opaque renderer-dispatch hint. Has no Feature Catalogue meaning. Conventional examples: "vessel.cargo", "vessel.tanker", "vessel.unknown", "ownship", "waypoint", "weather.isobar".

public string? Kind { get; init; }

Property Value

string

LastUpdated

UTC timestamp of the most recent update.

public required DateTimeOffset LastUpdated { get; init; }

Property Value

DateTimeOffset

Motion

Optional motion sidecar — only meaningful for moving point features.

public DynamicMotion? Motion { get; init; }

Property Value

DynamicMotion

VesselGeometry

Optional vessel-geometry sidecar — only meaningful for vessels (own-ship, AIS targets) and only when a renderer can use it to draw a true-scale hull (zoomed-in own-ship/AIS rendering). When null the renderer falls back to a dimension-less pictogram.

public DynamicVesselGeometry? VesselGeometry { get; init; }

Property Value

DynamicVesselGeometry