Features utilities
This module provides helper functions to manage recurring tasks on features, like binding and unbinding event listeners to track real-time events on features services and update layers accordingly. It also provides functions for querying, transforming, validating, and persisting GeoJSON features.
Functions
listenToFeaturesServiceEventsForLayer(layer, options, listeners)
Binds event listeners to a given layer's service events and stores them in the returned object.
Rely on listenToServiceEvents
Parameters
layer(Object) - The layer to listen for service events.options(Object) - Event handlers to be executed when an event occurs. This object may contain:context(String | Object | null) - Service context if any.created(Function | null) - Handler for feature creation events.updated(Function | null) - Handler for feature update events.patched(Function | null) - Handler for feature patch events.removed(Function | null) - Handler for feature removal events.all(Function | null) - Handler for all events if no specific defined.
listeners(Object) - Object to store the registered event listeners.
Returns
listeners(Object) - The registered event listeners.
Example Usage
const layer = { service: 'features', _id: 'layer-1' };
const listeners = {};
const registeredListeners = listenToFeaturesServiceEventsForLayer(layer, {
created: (feature, layer) => console.log(`Feature created in layer ${layer._id}:`, feature),
updated: (feature, layer) => console.log(`Feature updated in layer ${layer._id}:`, feature),
removed: (feature, layer) => console.log(`Feature removed in layer ${layer._id}:`, feature),
}, listeners);unlistenToFeaturesServiceEventsForLayer(layer, listeners)
Unbinds previously registered event listeners from a given layer's service events.
Rely on unlistenToServiceEvents
Parameters
layer(Object) - The layer to remove service event listeners from.listeners(Object) - The object containing registered event listeners.
Example Usage
unlistenToFeaturesServiceEventsForLayer(layer, registeredListeners);processFeatures(geoJson, processor)
Applies a processor function or EJS template string to each feature in a GeoJSON dataset. Modifies features in place.
- Parameters:
geoJson(Object): GeoJSON Feature or FeatureCollection.processor(Function | string): Either a function(feature) => voidor an EJS template string with{ feature, properties }context.
transformFeatures(geoJson, transform)
Applies geometric transformations (scale, rotate, translate) to each feature in a GeoJSON dataset. Uses Turf.js and mutates features in place.
- Parameters:
geoJson(Object): GeoJSON Feature or FeatureCollection.transform(Object): Transformation spec with optional:scale(Object):{ factor, ...turfOptions }rotate(Object):{ angle, ...turfOptions }translate(Object):{ distance, direction }or{ point, pivot }(rhumb line bearing/distance computed automatically)
computeBoundingBox(geoJson, padding?)
Computes the bounding box of a GeoJSON dataset with optional padding.
- Parameters:
geoJson(Object): GeoJSON Feature or FeatureCollection.padding(number, default0): Fractional padding to add on each side (e.g.0.1for 10% padding).
- Returns:
[west, south, east, north]ornullif the bounding box contains non-finite values.
computeConvexHull(geoJson)
Computes the convex hull of all points in a GeoJSON dataset. Falls back to a single point or line string for degenerate cases.
- Returns: GeoJSON Feature (Point, LineString, or Polygon) or
nullif the input is empty.
buildGradientPath(geoJson, options)
Converts a FeatureCollection of multi-geometry features into line features with a gradient property array, suitable for gradient-path rendering. Uses Chroma.js for color scale computation.
- Parameters:
geoJson(Object): A FeatureCollection where each feature has aGeometryCollectionand a variable property array.options.build.variable(Object): Variable definition withchromajs.colorsand eitherchromajs.domainorchromajs.classes.
- Returns:
Promise<void>— MutatesgeoJson.featuresin place.
getBaseQueryForFeatures(options)
Builds the base query for a feature layer. Calls options.baseQuery() if it is a function, otherwise uses it directly.
- Returns:
Promise<Object | null>—nullsignals to skip the update.
getFilterQueryForFeatures(options)
Builds the filter query for a feature layer by combining options.filterQuery with any active/inactive filter conditions from options.filters.
- Returns:
Promise<Object>
getSortQueryForFeatures(options)
Builds the sort query { $sort: ... } for a feature layer from options.sortQuery.
- Returns:
Promise<Object>
getFeaturesUpdateInterval(options)
Returns the update interval as a Moment duration from options.every, or null if not set.
getFeaturesQueryInterval(options)
Returns the query interval as a Moment duration from options.queryFrom. Defaults to -2 × updateInterval if not explicitly set.
shouldSkipFeaturesUpdate(lastUpdateTime, options, interval?)
Returns true if the elapsed time since lastUpdateTime is less than the update interval, meaning no update is needed.
getProbeFeatures(options)
Fetches features from a probe service (uses options.probeService) with base, filter, and sort queries applied, plus optional processor and transform.
- Returns:
Promise<Object>— A GeoJSON FeatureCollection response.
getFeaturesQuery(options, queryInterval?, queryLevel?)
Builds the full query object for fetching time-varying features. Handles variable aggregation, time range filtering, level filtering, groupBy, and build instructions (e.g. gradient path).
- Returns:
Promise<Object>
isFeatureInQueryInterval(feature, options)
Returns true if the feature's time property falls within the current query interval. Features without a time are always considered in-range.
getFeaturesFromQuery(options, query)
Fetches features from the layer's service using the given query. Applies processor, transform, and build instructions (e.g. gradientPath) as needed.
- Returns:
Promise<Object>— A GeoJSON FeatureCollection response.
getMeasureForFeatureBaseQuery(layer, feature)
Builds a base query for fetching measure time-series for a specific feature. Uses layer.chronicleId or layer.featureId (supports compound IDs) and adds $groupBy.
- Returns:
Object
getMeasureForFeatureQuery(layer, feature, startTime, endTime, level?)
Builds the full query for fetching measure time-series for a feature within a time range.
- Returns:
Promise<Object>
getMeasureForFeatureFromQuery(layer, feature, query)
Executes a pre-built measure query and returns the first feature result.
- Returns:
Promise<Object | undefined>
getMeasureForFeature(layer, feature, startTime, endTime, level?)
Convenience function that combines query building and execution to fetch measure data for a feature.
- Returns:
Promise<Object | undefined>— The first probed location feature, orundefinedon error.
cleanFeatures(geoJson, precision?)
Validates and attempts to repair polygon geometries using JSTS. Reports geometry errors and applies a buffer-based correction.
- Parameters:
geoJson(Object): GeoJSON Feature or FeatureCollection.precision(number, default1e-9): Buffer precision for geometry repair.
- Returns:
{ errors: Array, geometryTypes: Array }— List of validation errors and the set of geometry types encountered.
checkFeatures(geoJson, options?)
Checks features for redundant coordinates and self-intersections (kinks). Removes redundant coordinates and returns kink features.
- Parameters:
options.kinks(boolean, defaulttrue): Check for self-intersecting polygons.options.redundantCoordinates(boolean, defaulttrue): Remove redundant coordinates.
- Returns:
{ kinks: Array }— Features removed due to self-intersections.
createFeatures(geoJson, layer, chunkSize?, processCallback?)
Creates features in the layer's FeathersJS service. For a single feature, calls create directly. For multiple features, splits into chunks based on point count (default 5000 points per chunk).
- Parameters:
processCallback(Function, optional): Called after each chunk with(chunkIndex, chunk).
- Returns:
Promise<Object | void>
editFeaturesGeometry(geoJson, layer)
Patches the geometry property of each feature in the dataset via the layer's service.
- Returns:
Promise<Object>— The updated GeoJSON with patched features.
editFeaturesProperties(geoJson, layer)
Patches the properties of each feature in the dataset via the layer's service.
- Returns:
Promise<Object>
editFeaturesStyle(geoJson, layer)
Patches the style of each feature in the dataset via the layer's service.
- Returns:
Promise<Object>
removeFeatures(geoJson, layer)
Removes features from the layer's service. When geoJson is null, removes all features for the layer by querying { layer: layer._id }.
- Returns:
Promise<void>
fetchGeoJson(dataSource, options?)
Fetches a GeoJSON dataset from a URL, with optional processor and transform.
- Parameters:
dataSource(string): URL to fetch.options.processor(Function | string, optional): Feature processor.options.transform(Object, optional): Feature transform.
- Returns:
Promise<Object>— Parsed GeoJSON data.
getFeatureStyleType(feature)
Returns the KDK style type ('point', 'line', 'polygon') for a GeoJSON feature based on its geometry type.
- Returns:
string | undefined