Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
To get started:
import { Felt } from "@feltmaps/js-sdk";
const felt = await Felt.embed(
document.querySelector("#container"),
"FELT_MAP_ID",
{
uiControls: {
cooperativeGestures: false,
fullScreenButton: false,
showLegend: false,
},
}
);
const layers = await map.getLayers();
View FeltController for a complete list of available functions. FeltEmbedOptions enumerates initialization options.
160ca6d: Implement getFeatures method on LayersController
6a1e536: Widen allowed boundary types
56077be: Add setLayerBoundary, getLayerBoundaries, onLayerBoundaryChange
ac68984: Update getLayerSchema example
d327b46: Add afterCreation
option in pin tool settings to control what happens after creating a Place
6a66d40: Add updateLayer and expand createLayersFromGeoJson options
6504fea: Change documentation for getElementGeoemtry to document Highlighter and Marker functionality, and allow holes in Highlighter geometry
cf6711e: Make programmatic element CRUD types more accurate
4c83c60: Add programmatic element creation, editing and deletion
46e8ddc: Add onElementChange and onElementDelete
3e87812: Adds APIs to use Felt's drawing tools on read-only maps
d877a83: Add getFeature for getting a single feature as GeoJSON with full detail geometry
7f1d6aa: Add "interaction" to element schema
cf1dd7c: Improve Text and Note types and docs
1f6a386: Add getViewportConstraints and setViewportConstraints methods definition
b059b70: Add onLayerFiltersChange to allow listening to changes to layer filters, be it ephemeral, style or widget filters that changed.
19b41ce: Improve createLayer API
c20e605: Add setLayerLegendVisibility and setLayerGroupLegendVisibility methods definition
cbfd3fd: Reject promises when method handlers are invalid
0915f48: Add showLayerDataTable and hideLayerDataTable methods
9620df9: Change Circle.coordinates for Circle.center
63c3042: Add getLayerSchema method
69cc0a9: Fix spelling mistake in types
87304d8: Fix geometry filter type
1f22654: Add screen point to pointer events
b0e4149: Improves type readability and docs
65bf269: Add createLayer and deleteLayer
4bd0ae9: Add getMapDetails method definition
5f903fb: Update Layer type and createLayerFromGeoJson to separate out Source concept
597a8d6: Return coordinates on Circle and Place elements as they are only a single point.
f2f4289: Add layer stats methods
993fd44: Allow workers to be SDK clients
417b8f4: Fixes incorrect value in documentation and updates links to other methods
9620df9: Improve element docs
f0892c4: Improve documentation
bb79037: Fix per-geometry styling for created layers
555a25a: Add clearSelection method
1f5d950: Add option to pass auth token when embedding
4bbde62: Allow setting a note to show with layer filters
7badd4b: Add onMapIdle event
41efd53: Add selectFeature method to select feature by layer and feature ID
208c492: Add areaQuery param to getRenderedFeatures
5f607ec: Return style with layers, and allow updating layer styles via setLayerStyle
3a8bec8: Fix API reference link in README
Release v1 of Felt JS SDK
The Felt SDK lets you read, create and update elements on the map.
Elements that are created via the SDK are only available to the current session - they are not persisted to the map and not available to other users of the map.
If you want to let your users create elements (as opposed to using the SDK to create them programmatically), you can use the ToolsController to select and configure the drawing tools in Felt.
FilterLogicGate:
"and"
|"or"
FilterExpression: [
null
|string
,"in"
|"ni"
,null
| (null
|string
|number
|boolean
)[]] | [null
|string
,"lt"
|"gt"
|"le"
|"ge"
|"eq"
|"ne"
|"cn"
|"nc"
|"is"
|"isnt"
,null
|string
|number
|boolean
]
LayerProcessingStatus:
"processing"
|"completed"
|"failed"
|"incomplete"
This describes the processing status of a layer.
The various values are:
processing
: The layer has been uploaded or updated and is still processing.
completed
: The layer has been processed and can be viewed on the map.
failed
: The layer failed to process and cannot be viewed on the map.
incomplete
: The layer has not been processed.
A raster pixel value for a specific layer.
value:
number
The value of the pixel.
layerId:
string
The ID of the layer that the pixel belongs to.
categoryName:
null
|string
The name of the category that the pixel belongs to.
color:
null
| {r
:number
;g
:number
;b
:number
;a
:number
; }
The color of the pixel. Each value is between 0 and 255.
id:
string
The unique identifier for the element.
groupId:
null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
name:
null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
description:
null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
attributes:
Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
type:
"Image"
imageUrl:
string
The URL of the image that is rendered in this element
opacity:
number
The opacity of the image, between 0 and 1.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
The parameters for the and the listeners.
element:
null
|
The new data for the element or null if the element was removed.
isBeingCreated:
boolean
Whether or not this element is still being created by a drawing tool.
For example, if the user begins drawing a polygon, they need to place multiple points until they've ultimately completed the polygon. All the time they are still placing points, this will be true.
For elements that require text entry (such as Places, Text and Notes) this will be true all the time the user is typing text until the point at which the user finishes, by pressing Escape for example.
If the user is editing an existing element, this will be false.
For elements that are created programatically, this will be false.
A single category from the response from the method.
key:
string
|number
|boolean
The category for which the value was calculated.
value:
null
|number
The value calculated for the category, whether a count, sum, average, etc.
null
is returned if there are no features in the category as opposed to zero,
so as not to confuse with a real zero value from some aggregation.
The schema that describes the structure of the features in a layer.
This can be useful to build generic UIs that need to know the structure of the data in a layer, such as a dropdown to choose an attribute.
featureCount:
number
The total number of features in the layer.
attributes: []
Array of attribute schemas describing the properties available on features in this layer.
1
"default"
id:
string
The unique identifier for the element.
groupId:
null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
color:
string
The color of the element in some CSS-like format.
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
name:
null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
description:
null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
attributes:
Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
type:
"Link"
url:
string
The URL of the link that is rendered in this element.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
"default"
id:
string
A string identifying the element group.
name:
string
The name of the element group. This is shown in the legend.
caption:
null
|string
The caption of the element group. This is shown in the legend.
elementIds:
string
[]
The ids of the elements in the element group.
You can use these ids to get the full element objects via the `getElements` method.
visible:
boolean
Whether the element group is visible or not.
shownInLegend:
boolean
Whether the element group is shown in the legend or not.
FilterTernary: [
FilterTernary
|FilterExpression
|null
|boolean
,FilterLogicGate
,FilterTernary
|FilterExpression
|null
|boolean
]
A FilterTernary
is a tree structure for combining expressions with logical operators.
When combining three or more conditions, you must use proper nesting rather than a flat list.
// A simple filter with a single condition
const filter = [
["AREA", "gt", 30_000],
"and",
["COLOR", "eq", "red"]
]
// A complex filter with multiple conditions
const filter = [
["AREA", "gt", 30_000],
"and",
[
["COLOR", "eq", "red"],
"or",
["TYPE", "eq", "residential"]
]
]
FeltTiledVectorSource: {
type
:"felt"
;tileTemplateUrl
:string
; }
A tiled vector source is a layer that is populated from data the has been uploaded to Felt, and processed into vector tiles.
type:
"felt"
Identifies this as a tiled vector source. Typically, these tiles will have been uploaded to and processed by Felt.
tileTemplateUrl:
string
The template URL used for fetching tiles.
The parameters for getting categories from a layer, passed to the LayersController.getCategoryData method.
layerId:
string
The ID of the layer to get categories from.
attribute:
string
The attribute to use for categorization.
optional
limit:number
The maximum number of categories to return.
optional
filters:Filters
Attribute filters for the features to include when calculating the categories.
optional
boundary:GeometryFilter
The spatial boundary for the features to include when calculating the categories.
optional
values:ValueConfiguration
Configuration for filtering and aggregating values while preserving the full set of categories in the results.
This is particularly useful when you want to compare different subsets of data while maintaining consistent categories. For example:
Show all building types in a city, but only count recent buildings in each type
Keep all neighborhood categories but only sum up residential square footage
Unlike top-level filters which affect both what categories appear AND their values, filters in this configuration only affect the values while keeping all possible categories in the results.
GeometryFilter:
FeltBoundary
|PolygonGeometry
|MultiPolygonGeometry
|LngLatTuple
[]
The common type for filtering data by a spatial boundary.
This can be either:
FeltBoundary
: a [w, s, e, n] bounding box
PolygonGeometry
: a GeoJSON Polygon geometry
MultiPolygonGeometry
: a GeoJSON MultiPolygon geometry
LngLatTuple[]
: a list of coordinates describing a single ring of a polygon
Layer:
RasterLayer
|VectorLayer
|DataOnlyLayer
A legend item, which often represents a sub-class of features in a layer in the case of categorical or classed layers.
title:
string
|string
[]
The title of the legend item.
titleDependsOnZoom:
boolean
Whether the title depends on the zoom level or not. If it does, you need to call `getLegendItem` when the zoom level changes.
Note that as the zoom level changes, the `onLegendItemChange` handler will not be called, so you need to call `getLegendItem` yourself.
visible:
boolean
Whether the legend item is visible or not.
id:
string
The id of the legend item.
layerId:
string
The id of the layer the legend item belongs to.
All the different sources for boundaries for a layer, including their combined result.
spatialFilters:
null
|MultiPolygonGeometry
Boundaries set by drawing spatial filters on the map.
When there are multiple spatial filters, they are combined into a multi-polygon.
ephemeral:
null
|GeometryFilter
Boundaries that are set ephemerally by viewers in their own session.
These are the filters that are set when the LayersController.setLayerBoundary method is called. There is no way to set these in the Felt UI - they can only be set using the SDK.
combined:
null
|MultiPolygonGeometry
The combined result of all the boundaries set on the layer.
Each different source of boundary is intersected to produce the combined result.
optional
uiControls:UiControlsOptions
optional
initialViewport:ViewportCenterZoom
optional
token:string
A short-lived (15 minutes) authentication token to use for showing embeds that are configured to be private.
id:
string
The unique identifier for the element.
groupId:
null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
color:
string
The color of the element in some CSS-like format.
name:
null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
description:
null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
attributes:
Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
type:
"Highlighter"
renderHoles:
boolean
Whether to render the holes of the highlighted area.
opacity:
number
The opacity of the highlighter, between 0 and 1.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
id:
string
The unique identifier for the element.
type:
"Image"
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
name:null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
optional
coordinates: [number
,number
][][] =MultiLineStringGeometrySchema.shape.coordinates
optional
imageUrl:string
The URL of the image that is rendered in this element
optional
opacity:number
The opacity of the image, between 0 and 1.
The parameters for calculating a single aggregate value for a layer, passed to the method.
layerId:
string
The ID of the layer to calculate an aggregate value for.
aggregation: <
T
>
Specifies how to aggregate values within each category or bin. When omitted, features are counted. When specified, the chosen calculation (avg, sum, etc.) is performed on the specified attribute.
optional
filters:
Attribute filters for the features to include when calculating the aggregate value.
optional
boundary:
The spatial boundary for the features to include when calculating the aggregate value.
Constraints for the method. This can include layer constriants, spatial constraints, or both. If no constraints are provided, all rendered features will be returned.
optional
areaQuery: {coordinates
: ; } | {boundary
: [number
,number
,number
,number
]; }
The area to query for rendered features. This can be specific coordinates or a . If omitted, the entire viewport will be queried.
optional
layerIds:string
[]
The ids of the layers to get rendered features for.
The common properties for all layers.
id:
string
A string identifying the layer
groupId:
null
|string
The ID of the layer group that the layer belongs to.
Layers that appear at the root level in Felt will not have a group ID.
name:
string
The name of the layer can be displayed in the Legend, depending on how the layer's legend is configured in its style.
caption:
null
|string
The layer's caption is shown in the legend.
description:
null
|string
The layer description forms part of the layer's metadata. This is visible to users via the layer info button in the legend.
visible:
boolean
Whether the layer is visible or not.
shownInLegend:
boolean
Whether the layer is shown in the legend or not.
style:
object
The FSL style for the layer.
See the for details on how to read and write styles.
As the types of the styles are very complex, we return object
here and advise that you
program defensively while reading the styles.
status:
"processing"
|"completed"
|"failed"
|"incomplete"
The current processing status of the layer.
bounds:
null
| [number
,number
,number
,number
]
The bounding box of the layer in [west, south, east, north] order
There are cases where the bounds are not available, such as for layers added to the map from URL sources, as these are not (depending on their type) processed and analyzed by Felt.
A LayerFeature is a single geographical item in a layer.
It is intended to be a lightweight object that contains the properties of a feature, but not the geometry. It is returned by methods like and , and as part of the methods in the
The geometry can be obtained via the method, which returns a object.
id:
string
|number
The identifier of the feature, unique within the layer.
layerId:
string
The identifier of the layer that the feature belongs to.
geometryType:
"Polygon"
|"MultiPolygon"
|"LineString"
|"MultiLineString"
|"Point"
|"MultiPoint"
|string
& {}
The type of geometry of the feature.
Because LayerFeatures can be read from tiled features, it's
possible that this geometryType
won't match the geometry.type
of the returned by .
For example, this may return LineString
but the full feature is a MultiLineString
,
or, similarly Polygon
here may be a MultiPolygon
in the full feature.
As a result, you should treat this property as being indicative only.
bbox:
undefined
| [number
,number
,number
,number
]
The bounding box of the feature.
Because LayerFeatures can be read from tiled features and considering that feature geometry can go through multiple tiles, it's possible that this is not the complete bounding box of the feature.
properties:
The properties of the feature, as a bag of attributes.
The filters that are currently set on a layer.
A layer's filters are the combination of various different places in which filters can be applied.
style:
Filters that are set in the layer's style. These are the lowest level of filters, and can only be set by editing the map.
components:
Filters that are set in the layer's components, which are interactive elements in the legend. These can be set by viewers for their own session, but their default value can be set by the map creator.
ephemeral:
Filters that are set ephemerally by viewers in their own session.
These are the filters that are set when the method is called. There is no way to set these in the Felt UI - they can only be set using the SDK.
combined:
The combined result of all the filters set on the layer.
Use the object to embed a new iframe, or connect to an existing embedded iframe.
Once you have connected to a Felt map (either by embedding or connecting to an existing iframe), you can use the object to control the map.
To see what you can do with the map, see the documentation for the interface and its constituent controllers.
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
false
0.5
"default"
"default"
1
T
extends AggregationMethod
| "count"
// embed the map
const map = await Felt.embed(container, "felt-map-abc-123");
// now the map is loaded and connected, you can use the FeltController interface
// to control the map. For instance, to get information about the layers
const layers = await map.getLayers();
// Or to set the viewport to a specific location and zoom level
await map.setViewport({
center: { latitude: 37.8113, longitude: -122.2682 },
zoom: 10,
});
The parameters for the LayersController.createLayersFromGeoJson method.
name:
string
The name of the layer to create.
source:
GeoJsonUrlVectorSource
|GeoJsonDataVectorSource
|GeoJsonFileVectorSource
The source of the GeoJSON data.
optional
bounds: [number
,number
,number
,number
]
Sets the bounds of the layer.
optional
caption:string
Sets the caption of the layer.
optional
description:string
Sets the description of the layer.
optional
geometryStyles: {Point
:object
;Line
:object
;Polygon
:object
; }
The styles to apply to each geometry on the layer.
Each style should be a valid FSL style, as described in Layer.style.
These are optional, and if missing will use a default style determined by Felt, which you can consider to be undefined behaviour.
Point
?
object
Line
?
object
Polygon
?
object
const layer = await layersController.createLayersFromGeoJson({
name: "My Layer",
geometryStyles: {
Point: {
paint: { color: "red", size: 8 },
},
Line: {
paint: { color: "blue", size: 4 },
config: { labelAttribute: ["name"] },
label: { minZoom: 0 },
},
Polygon: {
paint: { color: "green", strokeColor: "darkgreen" },
},
},
});
id:
string
The unique identifier for the element.
groupId:
null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
color:
string
The color of the element in some CSS-like format.
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
name:
null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
description:
null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
attributes:
Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
type:
"Marker"
opacity:
number
The opacity of the marker, between 0 and 1.
1
size:
number
The size of the marker, used in conjunction with the zoom
to determine
the actual size of the marker.
10
zoom:
number
The zoom level at which the marker was created. This is combined with
the size
to determine the actual size of the marker.
When creating a marker, if you don't supply this value it defaults to
the current zoom of the map when you call createElement
.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
"default"
type:
"Marker"
coordinates:
LngLatTuple
[][]
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
color:string
The color of the element in some CSS-like format.
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
optional
name:null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
"default"
optional
opacity:number
The opacity of the marker, between 0 and 1.
1
optional
size:number
The size of the marker, used in conjunction with the zoom
to determine
the actual size of the marker.
10
optional
zoom:number
The zoom level at which the marker was created. This is combined with
the size
to determine the actual size of the marker.
When creating a marker, if you don't supply this value it defaults to
the current zoom of the map when you call createElement
.
The schema for a numeric attribute on a layer.
id:
string
The unique identifier for this attribute.
This can be used to fetch statistics, categories, histograms etc. for this attribute via the LayersController.getCategoryData, LayersController.getHistogramData, and LayersController.getAggregates methods.
displayName:
string
The human-readable name of this attribute.
detailedType:
string
The specific data type of this attribute, providing more detail than the basic type.
For instance, a numeric attribute might be "INTEGER", "FLOAT, etc.
distinctCount:
number
The number of distinct values present for this attribute across all features.
type:
"numeric"
Indicates this is a numeric attribute.
sampleValues: {
value
:number
;count
:number
; }[]
A small sample of values for this attribute and their frequency.
value
number
count
number
min:
number
The minimum value present for this attribute across all features.
max:
number
The maximum value present for this attribute across all features.
A GeoJSON URL source is a layer that is populated from a GeoJSON file at a remote URL.
These sources are ones that have not been uploaded to and processed by Felt, and as such their capabilities are limited.
For instance, they cannot be filtered, nor can statistics be fetched for them.
type:
"geoJsonUrl"
Identifies this as a GeoJSON URL source.
url:
string
The remote URL of the GeoJSON file used to populate the layer.
optional
refreshInterval:null
|number
The interval in milliseconds between automatic refreshes of the GeoJSON.
The value must be in the range of 250ms - 5 minutes (300,000ms).
If the value is null
, the GeoJSON will not be refreshed automatically.
const
Felt: {embed
:Promise
<FeltController
>;connect
:Promise
<FeltController
>; }
The Felt SDK is a library for embedding Felt maps into your website, allowing you to control and inspect the map programmatically.
Embeds a Felt map into the provided container, returning a promise that resolves to a FeltController object that you can use to control the map.
container
HTMLElement
The container element to embed the map into.
mapId
string
The ID of the map to embed.
options
?
The options to configure the map.
Promise
<FeltController
>
A promise for a FeltController.
Binds to an existing Felt map iframe.
feltWindow
Pick
<Window
, "postMessage"
>
The iframe element containing the Felt map.
Promise
<FeltController
>
id:
string
The unique identifier for the element.
groupId:
null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
color:
string
The color of the element in some CSS-like format.
name:
null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
description:
null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
attributes:
Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
imageUrl:
null
|string
The URL of an image that has been added to the element.
strokeOpacity:
number
A value between 0 and 1 that describes the opacity of the element's stroke.
strokeWidth:
number
The width of the element's stroke in pixels.
strokeStyle:
"solid"
|"dashed"
|"dotted"
The style of the element's stroke.
type:
"Polygon"
fillOpacity:
number
The opacity of the polygon's fill, between 0 and 1.
areaMarker:
boolean
Whether to show an area marker on the polygon.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
id:
string
The unique identifier for the element.
groupId:
null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
color:
string
The color of the element in some CSS-like format.
name:
null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
description:
null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
attributes:
Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
imageUrl:
null
|string
The URL of an image that has been added to the element.
type:
"Place"
symbol:
string
The symbol that is rendered for the Place.
This can be an emoji by using colon-enclosed characters (e.g. ":smiley:"
)
or one of the symbols available in Felt's symbol library.
You can see the available symbols in the Felt UI when editing a Place
by hovering a symbol and converting the tooltip to kebab-case. For example,
the "Oil barrel" symbol is oil-barrel
.
frame:
null
|"frame-circle"
|"frame-square"
The frame that is rendered around the Place's symbol. This is only available for non-emoji symbols.
hideLabel:
boolean
Whether the element's label is hidden on the map. This allows you to add a name to the element and can show in popups, but not have it visible on the map.
This will also hide the faint placeholder label that is shown when an editable Place is selected.
coordinates:
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
id:
string
The unique identifier for the element.
type:
"Marker"
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
color:string
The color of the element in some CSS-like format.
optional
name:null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
optional
opacity:number
The opacity of the marker, between 0 and 1.
optional
size:number
The size of the marker, used in conjunction with the zoom
to determine
the actual size of the marker.
optional
zoom:number
The zoom level at which the marker was created. This is combined with
the size
to determine the actual size of the marker.
When creating a marker, if you don't supply this value it defaults to
the current zoom of the map when you call createElement
.
optional
coordinates: [][]
Filters: | |
null
|boolean
Filters can be used to change which features in a layer are rendered. Filters can be applied to a layer by the method on the Felt controller.
Filters use a tree structure for combining expressions with logical operators, called a. When combining three or more conditions, you must use proper nesting rather than a flat list.
See the examples below for the correct structure to use when building complex filters.
The possible operators are:
lt
: Less than
gt
: Greater than
le
: Less than or equal to
ge
: Greater than or equal to
eq
: Equal to
ne
: Not equal to
cn
: Contains
nc
: Does not contain
The allowed boolean operators are:
and
: Logical AND
or
: Logical OR
id:
string
The unique identifier for the element.
type:
"Place"
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
color:string
The color of the element in some CSS-like format.
optional
name:null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
optional
imageUrl:null
|string
The URL of an image that has been added to the element.
optional
symbol:string
The symbol that is rendered for the Place.
This can be an emoji by using colon-enclosed characters (e.g. ":smiley:"
)
or one of the symbols available in Felt's symbol library.
You can see the available symbols in the Felt UI when editing a Place
by hovering a symbol and converting the tooltip to kebab-case. For example,
the "Oil barrel" symbol is oil-barrel
.
optional
frame:null
|"frame-circle"
|"frame-square"
The frame that is rendered around the Place's symbol. This is only available for non-emoji symbols.
optional
hideLabel:boolean
Whether the element's label is hidden on the map. This allows you to add a name to the element and can show in popups, but not have it visible on the map.
This will also hide the faint placeholder label that is shown when an editable Place is selected.
optional
coordinates:
type:
"Polygon"
coordinates: [][]
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
color:string
The color of the element in some CSS-like format.
optional
name:null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
optional
imageUrl:null
|string
The URL of an image that has been added to the element.
optional
strokeOpacity:number
A value between 0 and 1 that describes the opacity of the element's stroke.
optional
strokeWidth:number
The width of the element's stroke in pixels.
optional
strokeStyle:"solid"
|"dashed"
|"dotted"
The style of the element's stroke.
optional
fillOpacity:number
The opacity of the polygon's fill, between 0 and 1.
optional
areaMarker:boolean
Whether to show an area marker on the polygon.
A raster layer is a layer that contains raster data that can be rendered on the map
id:
string
A string identifying the layer
groupId:
null
|string
The ID of the layer group that the layer belongs to.
Layers that appear at the root level in Felt will not have a group ID.
name:
string
The name of the layer can be displayed in the Legend, depending on how the layer's legend is configured in its style.
caption:
null
|string
The layer's caption is shown in the legend.
description:
null
|string
The layer description forms part of the layer's metadata. This is visible to users via the layer info button in the legend.
visible:
boolean
Whether the layer is visible or not.
shownInLegend:
boolean
Whether the layer is shown in the legend or not.
style:
object
The FSL style for the layer.
See the for details on how to read and write styles.
As the types of the styles are very complex, we return object
here and advise that you
program defensively while reading the styles.
status:
"processing"
|"completed"
|"failed"
|"incomplete"
The current processing status of the layer.
bounds:
null
| [number
,number
,number
,number
]
The bounding box of the layer in [west, south, east, north] order
There are cases where the bounds are not available, such as for layers added to the map from URL sources, as these are not (depending on their type) processed and analyzed by Felt.
geometryType:
"Raster"
Identifies the type of geometry in the layer.
source:
The source of the raster layer's data.
The schema for a datetime attribute on a layer.
id:
string
The unique identifier for this attribute.
This can be used to fetch statistics, categories, histograms etc. for this attribute via the , , and methods.
displayName:
string
The human-readable name of this attribute.
detailedType:
string
The specific data type of this attribute, providing more detail than the basic type.
For instance, a numeric attribute might be "INTEGER", "FLOAT, etc.
distinctCount:
number
The number of distinct values present for this attribute across all features.
type:
"datetime"
Indicates this is a datetime attribute.
min:
string
The earliest datetime present for this attribute in ISO8601 format.
max:
string
The latest datetime present for this attribute in ISO8601 format.
sampleValues: {
value
:string
;count
:number
; }[]
A representative sample of datetime values for this attribute and their frequency.
ElementCreate: | | | | | | | |
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
1
2
"solid"
0.25
false
"default"
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
false
"default"
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
"default"
1
10
// 1. Simple filter: single condition
felt.setLayerFilters({
layerId: "layer-1",
filters: ["AREA", "gt", 30_000],
});
// 2. Basic compound filter: two conditions with AND
felt.setLayerFilters({
layerId: "layer-1",
filters: [
["AREA", "gt", 30_000], // First condition
"and", // Logic operator
["COLOR", "eq", "red"] // Second condition
]
});
// 3. Complex filter: three or more conditions require nesting
// ⚠️ IMPORTANT: Filters use a tree structure, not a flat list
felt.setLayerFilters({
layerId: "layer-1",
filters: [
["AREA", "gt", 30_000], // First condition
"and", // First logic operator
[ // Nested group starts
["COLOR", "eq", "red"], // Second condition
"and", // Second logic operator
["TYPE", "eq", "residential"] // Third condition
] // Nested group ends
]
});
// 4. Even more complex: four conditions with proper nesting
// Visual structure:
// AND
// / \
// condition AND
// / \
// condition AND
// / \
// condition condition
felt.setLayerFilters({
layerId: "layer-1",
filters: [
["AREA", "gt", 30_000], // First condition
"and",
[
["COLOR", "eq", "red"], // Second condition
"and",
[
["TYPE", "eq", "residential"], // Third condition
"and",
["YEAR", "gt", 2000] // Fourth condition
]
]
]
});
// 5. Mixed operators: combining AND and OR
// Visual structure:
// AND
// / \
// condition OR
// / \
// condition condition
felt.setLayerFilters({
layerId: "layer-1",
filters: [
["AREA", "gt", 30_000], // Must have large area
"and",
[
["COLOR", "eq", "red"], // Must be either red
"or",
["TYPE", "eq", "residential"] // OR residential type
]
]
});
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
"default"
false
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
"default"
1
2
"solid"
0.25
false
value
string
count
number
id:
string
The unique identifier for the element.
type:
"Text"
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
color:string
The color of the element in some CSS-like format.
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
"default"
optional
rotation:number
The rotation of the element in degrees.
0
optional
scale:number
The relative scale of the element from the default size. This is combined
with the zoom
to determine the actual size of the element.
1
optional
zoom:number
The zoom level at which the element was created. This is combined with
the scale
to determine the actual size of the element.
When creating an element, if you don't supply this value it defaults to
the current zoom of the map when you call createElement
.
optional
text:string
The text in the element.
optional
align:"center"
|"left"
|"right"
The alignment of the text, either left
, center
or right
.
"center"
optional
style:"italic"
|"light"
|"regular"
|"caps"
The style of the text, either italic
, light
, regular
or caps
.
"regular"
optional
position:LngLatTuple
The geographical position of the center of the text element.
A vector layer is a layer that contains vector data that can be rendered on the map
id:
string
A string identifying the layer
groupId:
null
|string
The ID of the layer group that the layer belongs to.
Layers that appear at the root level in Felt will not have a group ID.
name:
string
The name of the layer can be displayed in the Legend, depending on how the layer's legend is configured in its style.
caption:
null
|string
The layer's caption is shown in the legend.
description:
null
|string
The layer description forms part of the layer's metadata. This is visible to users via the layer info button in the legend.
visible:
boolean
Whether the layer is visible or not.
shownInLegend:
boolean
Whether the layer is shown in the legend or not.
style:
object
The FSL style for the layer.
See the FSL documentation for details on how to read and write styles.
As the types of the styles are very complex, we return object
here and advise that you
program defensively while reading the styles.
status:
"processing"
|"completed"
|"failed"
|"incomplete"
The current processing status of the layer.
bounds:
null
| [number
,number
,number
,number
]
The bounding box of the layer in [west, south, east, north] order
There are cases where the bounds are not available, such as for layers added to the map from URL sources, as these are not (depending on their type) processed and analyzed by Felt.
geometryType:
"Polygon"
|"Point"
|"Line"
Identifies the type of geometry in the layer.
source:
GeoJsonUrlVectorSource
|FeltTiledVectorSource
|Omit
<GeoJsonDataVectorSource
,"data"
>
The source of the vector layer's data.
AggregationMethod:
"avg"
|"max"
|"min"
|"sum"
|"median"
The method to use for the aggregation.
Constraints for legend items. If nothing is passed, all legend items will be returned.
optional
ids: {id
:string
;layerId
:string
; }[]
Array of legend item identifiers to constrain by.
id
string
The id of the legend item.
layerId
string
The id of the layer the legend item belongs to.
optional
layerIds:string
[]
Array of layer ids to constrain legend items by.
The params used to request a histogram of values from a layer, passed to the LayersController.getHistogramData method.
layerId:
string
attribute:
string
steps:
number
[] | {type
:"equal-intervals"
;count
:number
; } | {type
:"time-interval"
;interval
:"hour"
|"day"
|"week"
|"month"
|"year"
; }
optional
values: {boundary
: [number
,number
][] | [number
,number
,number
,number
] | {type
:"Polygon"
;coordinates
: [number
,number
][][]; } | {type
:"MultiPolygon"
;coordinates
: [number
,number
][][][]; };filters
:null
|boolean
| [null
|string
,"in"
|"ni"
,null
| (null
|string
|number
|boolean
)[]] | [null
|string
,"lt"
|"gt"
|"le"
|"ge"
|"eq"
|"ne"
|"cn"
|"nc"
|"is"
|"isnt"
,null
|string
|number
|boolean
] |FilterTernary
;aggregation
: {method
:"avg"
|"max"
|"min"
|"sum"
|"median"
;attribute
:string
; }; }
Configuration for filtering and aggregating values while preserving the full set of bin ranges in the results.
This is particularly useful when you want to compare different subsets of data while maintaining consistent ranges. For example:
Use the same height ranges for comparing old vs new buildings
Unlike top-level filters which affect both what ranges appear AND their values, filters in this configuration only affect the values while keeping all possible ranges in the results.
boundary
?
[number
, number
][] | [number
, number
, number
, number
] | { type
: "Polygon"
; coordinates
: [number
, number
][][]; } | { type
: "MultiPolygon"
; coordinates
: [number
, number
][][][]; }
-
-
filters
?
null
| boolean
| [null
| string
, "in"
| "ni"
, null
| (null
| string
| number
| boolean
)[]] | [null
| string
, "lt"
| "gt"
| "le"
| "ge"
| "eq"
| "ne"
| "cn"
| "nc"
| "is"
| "isnt"
, null
| string
| number
| boolean
] |
-
-
aggregation
?
{ method
: "avg"
| "max"
| "min"
| "sum"
| "median"
; attribute
: string
; }
-
-
aggregation.method
"avg"
| "max"
| "min"
| "sum"
| "median"
AggregateMethodSchema
The operation to use on the values from the features in the layer
aggregation.attribute
string
-
The attribute to use for the aggregation. This must be a numeric attribute.
optional
filters:Filters
Attribute filters for the features to include when calculating the histogram bins.
optional
boundary:GeometryFilter
The spatial boundary for the features to include when calculating the histogram bins.
id:
string
The unique identifier for the element.
type:
"Circle"
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
color:string
The color of the element in some CSS-like format.
optional
name:null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
optional
imageUrl:null
|string
The URL of an image that has been added to the element.
optional
strokeOpacity:number
A value between 0 and 1 that describes the opacity of the element's stroke.
optional
strokeWidth:number
The width of the element's stroke in pixels.
optional
strokeStyle:"solid"
|"dashed"
|"dotted"
The style of the element's stroke.
optional
radius:number
The radius of the circle in meters.
optional
radiusMarker:boolean
Whether to show a marker on the circle that indicates the radius
optional
radiusDisplayAngle:number
The angle at which the control point for setting the radius is displayed,
in degrees. When the radiusMarker
is true
, there is a dotted line rendered
from the center of the circle to the control point, and the marker is shown
at the midpoint of this line.
optional
radiusDisplayUnit:null
|"meter"
|"kilometer"
|"foot"
|"mile"
The unit of the radius used when the radiusMarker
is true
.
A value of null
means that the unit matches the user's locale.
optional
fillOpacity:number
The opacity of the circle's fill.
optional
center:
The center of the circle.
A data-only layer doesn't have any geometry, but can be used to join with other layers
id:
string
A string identifying the layer
groupId:
null
|string
The ID of the layer group that the layer belongs to.
Layers that appear at the root level in Felt will not have a group ID.
name:
string
The name of the layer can be displayed in the Legend, depending on how the layer's legend is configured in its style.
caption:
null
|string
The layer's caption is shown in the legend.
description:
null
|string
The layer description forms part of the layer's metadata. This is visible to users via the layer info button in the legend.
visible:
boolean
Whether the layer is visible or not.
shownInLegend:
boolean
Whether the layer is shown in the legend or not.
style:
object
The FSL style for the layer.
See the for details on how to read and write styles.
As the types of the styles are very complex, we return object
here and advise that you
program defensively while reading the styles.
status:
"processing"
|"completed"
|"failed"
|"incomplete"
The current processing status of the layer.
geometryType:
null
Indicates that this layer has no geometry.
bounds:
null
This is always null for data-only layers.
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
"default"
1
2
"solid"
false
90
null
0.25
Layers in a Felt map hold geospatial data, but also configure how the data is rendered both on the map and in the legend. The data can be vector data such as Points, Lines, or Polygons, or raster data such as satellite images.
Each Layer can be grouped under a LayerGroup, and has associated LegendItems that represent how the layer is rendered in the legend.
You can control the visibility of layers, layer groups, and legend items using the`setLayerVisibility`, `setLayerGroupVisibility`, and `setLegendItemVisibility` methods.
When a Layer is styled to as categorical data or "classed" numeric data, there will be
a LegendItem
for each category or class. Each LegendItem
can be controlled for visibility
independently of the Layer, so you can turn on and off each category or class individually.
type:
"Image"
coordinates: [
number
,number
][][] =MultiLineStringGeometrySchema.shape.coordinates
imageUrl:
string
The URL of the image that is rendered in this element
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
name:null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
"default"
optional
opacity:number
The opacity of the image, between 0 and 1.
1
The event object passed to the interaction listeners.
coordinate:
LatLng
The cursor position in world coordinates.
point: {
x
:number
;y
:number
; }
The pixel coordinates of the mouse cursor, relative to the map and measured from the top left corner.
x
number
y
number
features:
LayerFeature
[]
The vector features that are under the cursor.
rasterValues:
RasterValue
[]
The raster pixel values that are under the cursor.
Configuration for filtering and aggregating values across features.
This can be used to restrict the features considered for aggregation via the boundary
and filters
properties.
It can also be used to specify how to aggregate the values via the aggregation
property.
optional
boundary:GeometryFilter
The spatial boundary for what to count or aggregate.
optional
filters:Filters
Attribute filters to determine what gets counted or aggregated.
optional
aggregation:AggregationConfig
Specifies how to aggregate values within each category or bin. When omitted, features are counted. When specified, the chosen calculation (avg, sum, etc.) is performed on the specified attribute.
For example, instead of counting buildings in each category, you might want to sum their square footage or average their assessed values.
The RasterBand interface describes the metadata for a raster band, necessary for calculating the encoded raster value from the red, green, and blue values of the pixel.
base:
number
Encoding base value as a floating point number
interval:
number
Encoding interval as a floating point number
bandIndex:
number
1-based index of the band in the raster
id:
string
The unique identifier for the element.
groupId:
null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
color:
string
The color of the element in some CSS-like format.
description:
null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
attributes:
Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
rotation:
number
The rotation of the element in degrees.
scale:
number
The relative scale of the element from the default size. This is combined
with the zoom
to determine the actual size of the element.
zoom:
number
The zoom level at which the element was created. This is combined with
the scale
to determine the actual size of the element.
When creating an element, if you don't supply this value it defaults to
the current zoom of the map when you call createElement
.
text:
string
The text in the element.
align:
"center"
|"left"
|"right"
The alignment of the text, either left
, center
or right
.
style:
"italic"
|"light"
|"regular"
|"caps"
The style of the text, either italic
, light
, regular
or caps
.
name:
string
The text shown in the element, which is identical to the text
property.
This is added for consistency with other elements that have a name
property.
type:
"Note"
widthScale:
number
position:
The geographical position of the center of the note element.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
id:
string
A string identifying the layer group.
name:
string
The name of the layer group. This is shown in the legend.
caption:
null
|string
The caption of the layer group. This is shown in the legend.
layerIds:
string
[]
The ids of the layers in the layer group.
You can use these ids to get the full layer objects via the method.
visible:
boolean
Whether the layer group is visible or not.
shownInLegend:
boolean
Whether the layer group is shown in the legend or not.
bounds:
null
| [number
,number
,number
,number
]
The bounding box of the layer group in [west, south, east, north] order.
The schema for a date attribute on a layer.
id:
string
The unique identifier for this attribute.
This can be used to fetch statistics, categories, histograms etc. for this attribute via the , , and methods.
displayName:
string
The human-readable name of this attribute.
detailedType:
string
The specific data type of this attribute, providing more detail than the basic type.
For instance, a numeric attribute might be "INTEGER", "FLOAT, etc.
distinctCount:
number
The number of distinct values present for this attribute across all features.
type:
"date"
Indicates this is a date attribute.
min:
string
The earliest date present for this attribute in truncated ISO8601 format (YYYY-MM-DD).
max:
string
The latest date present for this attribute in truncated ISO8601 format (YYYY-MM-DD).
sampleValues: {
value
:string
;count
:number
; }[]
A representative sample of date values for this attribute and their frequency.
Defines how to aggregate a value across features in a layer with multiple aggregations returned at once.
methods:
T
[]
The operations to use on the values from the features in the layer
optional
attribute:string
The attribute to use for the aggregation when aggregations other than "count" are used.
This can be omitted if the only aggregation is "count", but must be a numeric attribute otherwise.
T
extends AggregationMethod
| "count"
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
0
1
"center"
"regular"
"default"
value
string
count
number
type:
"Path"
coordinates:
LngLatTuple
[][]
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
color:string
The color of the element in some CSS-like format.
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
optional
name:null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
"default"
optional
imageUrl:null
|string
The URL of an image that has been added to the element.
optional
strokeOpacity:number
A value between 0 and 1 that describes the opacity of the element's stroke.
1
optional
strokeWidth:number
The width of the element's stroke in pixels.
2
optional
strokeStyle:"solid"
|"dashed"
|"dotted"
The style of the element's stroke.
"solid"
optional
distanceMarker:boolean
Whether a distance marker is shown at the midpoint of the path.
false
optional
routingMode:null
|"driving"
|"cycling"
|"walking"
|"flying"
Whether this represents a route, and if so, what mode of transport is used.
If this is null
, the path is not considered to be a route, so while it
can have a distanceMarker
, it will does not have a start or end cap.
null
optional
endCaps:boolean
Whether or not to show Start and End caps on the path. This is
only available if the routingMode
is set.
false
The value you need to pass to LayersController.updateLayer
id:
string
The id of the layer to update.
optional
shownInLegend:boolean
Changes whether the layer is shown in the legend.
optional
name:string
Changes the name of the layer.
optional
caption:string
Changes the caption of the layer.
optional
description:string
Changes the description of the layer.
optional
bounds: [number
,number
,number
,number
]
Changes the bounds of the layer.
optional
style:object
The style of the layer.
optional
source:GeoJsonUrlVectorSource
|GeoJsonDataVectorSource
|GeoJsonFileVectorSource
Updates the source of the layer.
Only layers that have a GeoJSON source can have their source udpated.
For URL sources, if you pass the same URL again it will cause the data to be refreshed.
The schema for a boolean attribute on a layer.
id:
string
The unique identifier for this attribute.
This can be used to fetch statistics, categories, histograms etc. for this attribute via the LayersController.getCategoryData, LayersController.getHistogramData, and LayersController.getAggregates methods.
displayName:
string
The human-readable name of this attribute.
detailedType:
string
The specific data type of this attribute, providing more detail than the basic type.
For instance, a numeric attribute might be "INTEGER", "FLOAT, etc.
distinctCount:
number
The number of distinct values present for this attribute across all features.
type:
"boolean"
Indicates this is a boolean attribute.
sampleValues: {
value
:boolean
;count
:number
; }[]
A representative sample of boolean values for this attribute and their frequency.
value
boolean
count
number
id:
string
The unique identifier for the element.
type:
"Note"
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
color:string
The color of the element in some CSS-like format.
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
optional
rotation:number
The rotation of the element in degrees.
optional
scale:number
The relative scale of the element from the default size. This is combined
with the zoom
to determine the actual size of the element.
optional
zoom:number
The zoom level at which the element was created. This is combined with
the scale
to determine the actual size of the element.
When creating an element, if you don't supply this value it defaults to
the current zoom of the map when you call createElement
.
optional
text:string
The text in the element.
optional
align:"center"
|"left"
|"right"
The alignment of the text, either left
, center
or right
.
optional
style:"italic"
|"light"
|"regular"
|"caps"
The style of the text, either italic
, light
, regular
or caps
.
optional
widthScale:number
optional
position:
The geographical position of the center of the note element.
The Interactions controller allows you to observe interactions with the map
onPointerClick(
params
: {handler
: (event
: ) =>void
; }):VoidFunction
Allows you to be notified the user clicks on the map.
VoidFunction
A function to unsubscribe from the listener
onPointerMove(
params
: {handler
: (event
: ) =>void
; }):VoidFunction
Allows you to be notified the user moves the mouse over the map.
VoidFunction
A function to unsubscribe from the listener
type:
"Place"
coordinates:
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
color:string
The color of the element in some CSS-like format.
optional
name:null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
optional
imageUrl:null
|string
The URL of an image that has been added to the element.
optional
symbol:string
The symbol that is rendered for the Place.
This can be an emoji by using colon-enclosed characters (e.g. ":smiley:"
)
or one of the symbols available in Felt's symbol library.
You can see the available symbols in the Felt UI when editing a Place
by hovering a symbol and converting the tooltip to kebab-case. For example,
the "Oil barrel" symbol is oil-barrel
.
optional
frame:null
|"frame-circle"
|"frame-square"
The frame that is rendered around the Place's symbol. This is only available for non-emoji symbols.
optional
hideLabel:boolean
Whether the element's label is hidden on the map. This allows you to add a name to the element and can show in popups, but not have it visible on the map.
This will also hide the faint placeholder label that is shown when an editable Place is selected.
id:
string
The unique identifier for the element.
type:
"Highlighter"
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
color:string
The color of the element in some CSS-like format.
optional
name:null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
optional
renderHoles:boolean
Whether to render the holes of the highlighted area.
optional
opacity:number
The opacity of the highlighter, between 0 and 1.
optional
coordinates: [][][]
A multipolygon describing the area that is highlighted.
If renderHoles
is set to false, only the outer ring of each polygon
will be rendered, filling in the area inside the highlighted region.
The schema for a text attribute on a layer.
id:
string
The unique identifier for this attribute.
This can be used to fetch statistics, categories, histograms etc. for this attribute via the , , and methods.
displayName:
string
The human-readable name of this attribute.
detailedType:
string
The specific data type of this attribute, providing more detail than the basic type.
For instance, a numeric attribute might be "INTEGER", "FLOAT, etc.
distinctCount:
number
The number of distinct values present for this attribute across all features.
type:
"text"
Indicates this is a text attribute.
sampleValues: {
value
:string
;count
:number
; }[]
A small sample of string values for this attribute and their frequency.
id:
string
The unique identifier for the element.
type:
"Polygon"
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
color:string
The color of the element in some CSS-like format.
optional
name:null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
optional
imageUrl:null
|string
The URL of an image that has been added to the element.
optional
strokeOpacity:number
A value between 0 and 1 that describes the opacity of the element's stroke.
optional
strokeWidth:number
The width of the element's stroke in pixels.
optional
strokeStyle:"solid"
|"dashed"
|"dotted"
The style of the element's stroke.
optional
fillOpacity:number
The opacity of the polygon's fill, between 0 and 1.
optional
areaMarker:boolean
Whether to show an area marker on the polygon.
optional
coordinates: [][]
The source of a raster layer's data.
imageTileTemplateUrl:
string
A URL template for fetching image tiles for the raster.
encodedTileTemplateUrl:
string
A URL template for fetching encoded tiles for the raster.
The encoded raster value can be calculated from the red, green, and blue values of the pixel using the following formula:
or
bands: []
List of encoded raster bands
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
"default"
0
1
"center"
"regular"
params
{ handler
: (event
: MapInteractionEvent
) => void
; }
params.handler
(event
: MapInteractionEvent
) => void
const unsubscribe = felt.onPointerClick({
handler: (event) => console.log(event.center, event.features),
});
// later on...
unsubscribe();
params
{ handler
: (event
: MapInteractionEvent
) => void
; }
Params for the listener
params.handler
(event
: MapInteractionEvent
) => void
The handler function
// Track mouse movement and features under cursor
const unsubscribe = felt.onPointerMove({
handler: (event) => {
console.log("Mouse position:", event.center);
console.log("Features under cursor:", event.features);
}
});
// later on...
unsubscribe();
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
"default"
false
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
"default"
false
0.5
value
string
count
number
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
"default"
1
2
"solid"
0.25
false
base + ((RED << 16) + (GREEN <<8) + BLUE) * interval
base + (RED * 256 * 256 + GREEN * 256 + BLUE) * interval
type:
"Highlighter"
coordinates:
LngLatTuple
[][][]
A multipolygon describing the area that is highlighted.
If renderHoles
is set to false, only the outer ring of each polygon
will be rendered, filling in the area inside the highlighted region.
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
color:string
The color of the element in some CSS-like format.
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
optional
name:null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
"default"
optional
renderHoles:boolean
Whether to render the holes of the highlighted area.
false
optional
opacity:number
The opacity of the highlighter, between 0 and 1.
0.5
type:
"Note"
text:
string
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
color:string
The color of the element in some CSS-like format.
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
"default"
optional
rotation:number
The rotation of the element in degrees.
0
optional
scale:number
The relative scale of the element from the default size. This is combined
with the zoom
to determine the actual size of the element.
1
optional
zoom:number
The zoom level at which the element was created. This is combined with
the scale
to determine the actual size of the element.
When creating an element, if you don't supply this value it defaults to
the current zoom of the map when you call createElement
.
optional
align:"center"
|"left"
|"right"
The alignment of the text, either left
, center
or right
.
"center"
optional
style:"italic"
|"light"
|"regular"
|"caps"
The style of the text, either italic
, light
, regular
or caps
.
"regular"
optional
widthScale:number
optional
position:LngLatTuple
The geographical position of the center of the note element.
If this is omitted, the note will be placed at the center of the current viewport.
The common schema for all attributes.
id:
string
The unique identifier for this attribute.
This can be used to fetch statistics, categories, histograms etc. for this attribute via the LayersController.getCategoryData, LayersController.getHistogramData, and LayersController.getAggregates methods.
displayName:
string
The human-readable name of this attribute.
detailedType:
string
The specific data type of this attribute, providing more detail than the basic type.
For instance, a numeric attribute might be "INTEGER", "FLOAT, etc.
distinctCount:
number
The number of distinct values present for this attribute across all features.
A GeoJSON file source is a layer that is populated from a GeoJSON file on your local machine.
This is an input-only type. It is converted to a GeoJsonDataVectorSource when passed to LayersController.createLayersFromGeoJson.
type:
"geoJsonFile"
Identifies this as a GeoJSON file source.
file:
File
The GeoJSON file for the layer.
type:
"Text"
text:
string
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
color:string
The color of the element in some CSS-like format.
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
optional
rotation:number
The rotation of the element in degrees.
optional
scale:number
The relative scale of the element from the default size. This is combined
with the zoom
to determine the actual size of the element.
optional
zoom:number
The zoom level at which the element was created. This is combined with
the scale
to determine the actual size of the element.
When creating an element, if you don't supply this value it defaults to
the current zoom of the map when you call createElement
.
optional
align:"center"
|"left"
|"right"
The alignment of the text, either left
, center
or right
.
optional
style:"italic"
|"light"
|"regular"
|"caps"
The style of the text, either italic
, light
, regular
or caps
.
optional
position:
The geographical position of the center of the text element.
If this is omitted, the text will be placed at the center of the current viewport.
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
"default"
0
1
"center"
"regular"
id:
string
The unique identifier for the element.
type:
"Path"
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
color:string
The color of the element in some CSS-like format.
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
optional
name:null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
"default"
optional
imageUrl:null
|string
The URL of an image that has been added to the element.
optional
strokeOpacity:number
A value between 0 and 1 that describes the opacity of the element's stroke.
1
optional
strokeWidth:number
The width of the element's stroke in pixels.
2
optional
strokeStyle:"solid"
|"dashed"
|"dotted"
The style of the element's stroke.
"solid"
optional
distanceMarker:boolean
Whether a distance marker is shown at the midpoint of the path.
false
optional
routingMode:null
|"driving"
|"cycling"
|"walking"
|"flying"
Whether this represents a route, and if so, what mode of transport is used.
If this is null
, the path is not considered to be a route, so while it
can have a distanceMarker
, it will does not have a start or end cap.
null
optional
endCaps:boolean
Whether or not to show Start and End caps on the path. This is
only available if the routingMode
is set.
false
optional
coordinates:LngLatTuple
[][]
id:
string
The unique identifier for the element.
groupId:
null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
color:
string
The color of the element in some CSS-like format.
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
name:
null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
description:
null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
attributes:
Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
imageUrl:
null
|string
The URL of an image that has been added to the element.
strokeOpacity:
number
A value between 0 and 1 that describes the opacity of the element's stroke.
1
strokeWidth:
number
The width of the element's stroke in pixels.
2
strokeStyle:
"solid"
|"dashed"
|"dotted"
The style of the element's stroke.
"solid"
type:
"Path"
distanceMarker:
boolean
Whether a distance marker is shown at the midpoint of the path.
false
routingMode:
null
|"driving"
|"cycling"
|"walking"
|"flying"
Whether this represents a route, and if so, what mode of transport is used.
If this is null
, the path is not considered to be a route, so while it
can have a distanceMarker
, it will does not have a start or end cap.
null
endCaps:
boolean
Whether or not to show Start and End caps on the path. This is
only available if the routingMode
is set.
false
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
"default"
id:
string
The unique identifier for the element.
groupId:
null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
color:
string
The color of the element in some CSS-like format.
name:
null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
description:
null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
attributes:
Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
imageUrl:
null
|string
The URL of an image that has been added to the element.
strokeOpacity:
number
A value between 0 and 1 that describes the opacity of the element's stroke.
strokeWidth:
number
The width of the element's stroke in pixels.
strokeStyle:
"solid"
|"dashed"
|"dotted"
The style of the element's stroke.
type:
"Circle"
radius:
number
The radius of the circle in meters.
radiusMarker:
boolean
Whether to show a marker on the circle that indicates the radius
radiusDisplayAngle:
number
The angle at which the control point for setting the radius is displayed,
in degrees. When the radiusMarker
is true
, there is a dotted line rendered
from the center of the circle to the control point, and the marker is shown
at the midpoint of this line.
radiusDisplayUnit:
null
|"meter"
|"kilometer"
|"foot"
|"mile"
The unit of the radius used when the radiusMarker
is true
.
A value of null
means that the unit matches the user's locale.
fillOpacity:
number
The opacity of the circle's fill.
center:
The center of the circle.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
id:
string
The unique identifier for the element.
groupId:
null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
color:
string
The color of the element in some CSS-like format.
description:
null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
attributes:
Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
rotation:
number
The rotation of the element in degrees.
scale:
number
The relative scale of the element from the default size. This is combined
with the zoom
to determine the actual size of the element.
zoom:
number
The zoom level at which the element was created. This is combined with
the scale
to determine the actual size of the element.
When creating an element, if you don't supply this value it defaults to
the current zoom of the map when you call createElement
.
text:
string
The text in the element.
align:
"center"
|"left"
|"right"
The alignment of the text, either left
, center
or right
.
style:
"italic"
|"light"
|"regular"
|"caps"
The style of the text, either italic
, light
, regular
or caps
.
name:
string
The text shown in the element, which is identical to the text
property.
This is added for consistency with other elements that have a name
property.
type:
"Text"
position:
The geographical position of the center of the text element.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
1
2
"solid"
false
90
null
0.25
"default"
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
0
1
"center"
"regular"
"default"
type:
"Circle"
radius:
number
The radius of the circle in meters.
center:
LngLatTuple
The center of the circle.
optional
groupId:null
|string
The ID of the element group that the element belongs to. For elements that are not part of a group, this will be null.
optional
color:string
The color of the element in some CSS-like format.
"#ABC123";
"rgb(255, 0, 0)";
"hsl(200, 100%, 50%)";
"#C93535"
optional
name:null
|string
The element's name. For elements that can show a label or text on the map (e.g. a Place or Text element) this is the text that will be shown.
For elements such as Polygons or Paths, the name is what is shown when the element is selected by clicking on it.
optional
description:null
|string
Text describing the element, which is shown in an element's popup when it is selected.
Note that some elements are not selectable on the map, such as Notes, Text and Markers, so their description will not be shown.
optional
attributes:Record
<string
,unknown
>
A set of key-value pairs that can be used to store arbitrary data about the element.
This is most useful for associating additional data with an element that is not part of the element's core data, such as a Place's address or some other data.
optional
interaction:"default"
|"locked"
Whether the element is interactive.
The default
interaction mode means that the element can be selected and edited by
the user, if it was created by the SDK or by the user using a tool.
If the interaction mode is locked
, the element will not be editable by the user,
which is often used for elements that you don't want the user to edit or move by
accident.
Elements that were created by the map author (i.e. not during an SDK "session") are not editable and have special behaviour depending on their name, description and attributes.
"default"
optional
imageUrl:null
|string
The URL of an image that has been added to the element.
optional
strokeOpacity:number
A value between 0 and 1 that describes the opacity of the element's stroke.
1
optional
strokeWidth:number
The width of the element's stroke in pixels.
2
optional
strokeStyle:"solid"
|"dashed"
|"dotted"
The style of the element's stroke.
"solid"
optional
radiusMarker:boolean
Whether to show a marker on the circle that indicates the radius
false
optional
radiusDisplayAngle:number
The angle at which the control point for setting the radius is displayed,
in degrees. When the radiusMarker
is true
, there is a dotted line rendered
from the center of the circle to the control point, and the marker is shown
at the midpoint of this line.
90
optional
radiusDisplayUnit:null
|"meter"
|"kilometer"
|"foot"
|"mile"
The unit of the radius used when the radiusMarker
is true
.
A value of null
means that the unit matches the user's locale.
null
optional
fillOpacity:number
The opacity of the circle's fill.
0.25
The Elements controller allows you to get information about the elements on the map, and make changes to their visibility.
getElement(
id
:string
):Promise
<null
|Element
>
Get a single element from the map by its id.
id
string
The id of the element you want to get.
Promise
<null
| Element
>
The requested element.
const element = await felt.getElement("element-1");
getElementGeometry(
id
:string
):Promise
<null
|GeoJsonGeometry
>
Get the geometry of an element in GeoJSON geometry format.
For most element types, the geometry returned is based on the coordinates
property of the element, with some differences:
For Circle elements, the geometry is a Polygon drawn from the center
andradius
properties.
Path elements become MultiLineString geometries.
Marker elements return a MultiLineString of the path traced by the user as they drew the marker. Note that this is not the polygon formed by filled-in "pen" stroke, which doesn't exactly follow the path traced by the user as it is smoothed and interpolated to create a continuous line.
Text, Note and Image elements do not return geometry, so will return null
.
id
string
The id of the element you want to get the geometry of.
Promise
<null
| GeoJsonGeometry
>
const geometry = await felt.getElementGeometry("element-1");
console.log(geometry?.type, geometry?.coordinates);
getElements(
constraint
?:GetElementsConstraint
):Promise
<(null
|Element
)[]>
Gets elements from the map, according to the constraints supplied. If no constraints are supplied, all elements will be returned.
constraint
?
The constraints to apply to the elements returned from the map.
Promise
<(null
| Element
)[]>
All elements on the map.
The elements in the map, ordered by the order specified in Felt. This is not necessarily the order that they are drawn in, as Felt draws points above lines and lines above polygons, for instance.
const elements = await felt.getElements();
getElementGroup(
id
:string
):Promise
<null
|ElementGroup
>
Get an element group from the map by its id.
id
string
Promise
<null
| ElementGroup
>
The requested element group.
const elementGroup = await felt.getElementGroup("element-group-1");
getElementGroups(
constraint
?:GetElementGroupsConstraint
):Promise
<(null
|ElementGroup
)[]>
Gets element groups from the map, according to the filters supplied. If no constraints are supplied, all element groups will be returned in rendering order.
constraint
?
The constraints to apply to the element groups returned from the map.
Promise
<(null
| ElementGroup
)[]>
The requested element groups.
const elementGroups = await felt.getElementGroups({ ids: ["element-group-1", "element-group-2"] });
setElementGroupVisibility(
visibility
:SetVisibilityRequest
):Promise
<void
>
Hide or show element groups with the given ids.
visibility
Promise
<void
>
felt.setElementGroupVisibility({ show: ["element-group-1", "element-group-2"], hide: ["element-group-3"] });
createElement(
element
:ElementCreate
):Promise
<Element
>
Create a new element on the map.
element
Promise
<Element
>
const element = await felt.createElement({ type: "Place", coordinates: [10, 10] });
updateElement(
element
:ElementUpdate
):Promise
<Element
>
Update an element on the map.
element
Promise
<Element
>
// Update a place element's coordinates
await felt.updateElement({
id: "element-1",
coordinates: [10, 20]
});
// Update a polygon's style
await felt.updateElement({
id: "element-2",
color: "#ABC123",
fillOpacity: 0.5
});
deleteElement(
id
:string
):Promise
<void
>
Delete an element from the map.
id
string
Promise
<void
>
await felt.deleteElement("element-1");
onElementCreate(
args
: {handler
: (change
:ElementChangeCallbackParams
) =>void
; }):VoidFunction
Adds a listener for when an element is created.
args
{ handler
: (change
: ) => void
; }
-
args.handler
(change
: ) => void
The handler that is called when an element is created. This will fire when elements are created programatically, or when the user starts creating an element with a drawing tool. When the user creates an element with a drawing tool, it can begin in an invalid state, such as if you've just placed a single point in a polygon. You can use the isBeingCreated
property to determine if the element is still being created by a drawing tool. If you want to know when the element is finished being created, you can use the listener.
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onElementCreate({
handler: (element) => console.log(element.id),
});
// later on...
unsubscribe();
onElementCreateEnd(
args
: {handler
: (params
: {element
:Element
; }) =>void
; }):VoidFunction
Listens for when a new element is finished being created by a drawing tool.
This differs from the `onElementCreate` listener, which fires whenever an element is first created. This fires when the user finishes creating an element which could be after a series of interactions.
For example, when creating a polygon, the user places a series of points then finishes by pressing Enter or Escape. Or when creating a Place element, they add the marker, type a label, then finally deselect the element.
args
{ handler
: (params
: { element
: ; }) => void
; }
-
args.handler
(params
: { element
: ; }) => void
The handler to call whenever this event fires.
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onToolCreatedElement({
handler: (params) => console.log(params),
});
// later on...
unsubscribe();
onElementChange(
args
: {options
: {id
:string
; };handler
: (change
:ElementChangeCallbackParams
) =>void
; }):VoidFunction
Adds a listener for when an element changes.
This will fire when an element is being edited, either on the map by the user or programatically.
Like the `onElementCreate` listener, this will fire when an element is still being created by a drawing tool.
You can check the `isBeingCreated` property to determine if the element is still being created by a drawing tool.
args
{ options
: { id
: string
; }; handler
: (change
: ) => void
; }
-
args.options
{ id
: string
; }
-
args.options.id
string
The id of the element to listen for changes to.
args.handler
(change
: ) => void
The handler that is called when the element changes.
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onElementChange({
options: { id: "element-1" },
handler: ({element}) => console.log(element.id),
});
// later on...
unsubscribe();
onElementDelete(
args
: {options
: {id
:string
; };handler
: () =>void
; }):VoidFunction
Adds a listener for when an element is deleted.
args
{ options
: { id
: string
; }; handler
: () => void
; }
-
args.options
{ id
: string
; }
-
args.options.id
string
The id of the element to listen for deletions of.
args.handler
() => void
The handler that is called when the element is deleted.
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onElementDelete({
options: { id: "element-1" },
handler: () => console.log("element-1 deleted"),
});
// later on...
unsubscribe();
onElementGroupChange(
args
: {options
: {id
:string
; };handler
: (change
:ElementGroupChangeCallbackParams
) =>void
; }):VoidFunction
Adds a listener for when an element group changes.
args
{ options
: { id
: string
; }; handler
: (change
: ) => void
; }
args.options
{ id
: string
; }
args.options.id
string
args.handler
(change
: ) => void
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onElementGroupChange({
options: { id: "element-group-1" },
handler: elementGroup => console.log(elementGroup.id),
});
// later on...
unsubscribe();
The Layers controller allows you to get information about the layers on the map, and make changes to their visibility.
Layers can be organised into groups, and their groups can also have their visibility toggled.
getLayer(
id
:string
):Promise
<null
|Layer
>
Get a single layer from the map by its id.
id
string
The id of the layer you want to get.
Promise
<null
| Layer
>
The requested layer.
const layer = await felt.getLayer("layer-1");
getLayers(
constraint
?:GetLayersConstraint
):Promise
<(null
|Layer
)[]>
Gets layers from the map, according to the constraints supplied. If no constraints are supplied, all layers will be returned.
constraint
?
The constraints to apply to the layers returned from the map.
Promise
<(null
| Layer
)[]>
All layers on the map.
The layers in the map, ordered by the order specified in Felt. This is not necessarily the order that they are drawn in, as Felt draws points above lines and lines above polygons, for instance.
const layers = await felt.getLayers();
setLayerVisibility(
visibility
:SetVisibilityRequest
):Promise
<void
>
Hide or show layers with the given ids.
visibility
Promise
<void
>
felt.setLayerVisibility({ show: ["layer-1", "layer-2"], hide: ["layer-3"] });
setLayerStyle(
params
: {id
:string
;style
:object
; }):Promise
<void
>
Set the style for a layer using FSL, the Felt Style Language.
Changes are only for this session, and not persisted. This is useful to make temporary changes to a layer's style, such as to highlight a particular layer or feature.
See the FSL documentation for details on how to read and write styles.
If the style you set is invalid, you will receive an error explaining the problem in the rejected promise value.
params
{ id
: string
; style
: object
; }
-
params.id
string
The id of the layer to set the style for.
params.style
object
The style to set for the layer.
Promise
<void
>
// first get the current style
const oldStyle = (await felt.getLayer("layer-1")).style;
felt.setLayerStyle({ id: "layer-1", style: {
...oldStyle,
paint: {
...oldStyle.paint,
color: "red",
},
} });
setLayerLegendVisibility(
params
:SetVisibilityRequest
):Promise
<void
>
Hide or show layers with the given ids from the legend.
params
Promise
<void
>
felt.setLayerLegendVisibility({ show: ["layer-1", "layer-2"], hide: ["layer-3"] });
createLayersFromGeoJson(
params
:CreateLayersFromGeoJsonParams
):Promise
<null
| {layerGroup
:LayerGroup
;layers
:Layer
[]; }>
Adds layers to the map from file or URL sources.
params
Promise
<null
| { layerGroup
: LayerGroup
; layers
: Layer
[]; }>
The layer groups that were created.
This allows you to add temporary layers to the map that don't depend on any processing by Felt. This is useful for viewing data from external sources or remote files.
const layerFromFile = await felt.createLayersFromGeoJson({
source: {
type: "geoJsonFile",
file: someFile,
},
name: "Parcels",
});
const layerFromUrl = await felt.createLayersFromGeoJson({
source: {
sourceType: "geoJsonUrl",
url: "https://example.com/parcels.geojson",
},
name: "Parcels",
updateLayer(
params
:UpdateLayerParams
):Promise
<Layer
>
Update a layer by passing a subset of the layer's properties.
Note that not all properties can be updated, so check the UpdateLayerParams type to see which properties can be updated.
params
Promise
<Layer
>
await felt.updateLayer({
id: "layer-1",
name: "My Layer",
caption: "A description of the layer",
});
deleteLayer(
id
:string
):Promise
<void
>
Delete a layer from the map by its id.
id
string
Promise
<void
>
This only works for layers created via the SDK createLayersFromGeoJson
method, not layers added via the Felt UI.
await felt.deleteLayer("layer-1");
getLayerGroup(
id
:string
):Promise
<null
|LayerGroup
>
Get a layer group from the map by its id.
id
string
Promise
<null
| LayerGroup
>
The requested layer group.
const layerGroup = await felt.getLayerGroup("layer-group-1");
getLayerGroups(
constraint
?:GetLayerGroupsConstraint
):Promise
<(null
|LayerGroup
)[]>
Gets layer groups from the map, according to the constraints supplied. If no constraints are supplied, all layer groups will be returned in rendering order.
constraint
?
The constraints to apply to the layer groups returned from the map.
Promise
<(null
| LayerGroup
)[]>
The requested layer groups.
const layerGroups = await felt.getLayerGroups({ ids: ["layer-group-1", "layer-group-2"] });
setLayerGroupVisibility(
visibility
:SetVisibilityRequest
):Promise
<void
>
Hide or show layer groups with the given ids.
visibility
Promise
<void
>
felt.setLayerGroupVisibility({ show: ["layer-group-1", "layer-group-2"], hide: ["layer-group-3"] });
setLayerGroupLegendVisibility(
params
:SetVisibilityRequest
):Promise
<void
>
Hide or show layer groups with the given ids from the legend.
params
Promise
<void
>
felt.setLayerGroupLegendVisibility({ show: ["layer-1", "layer-2"], hide: ["layer-3"] });
getLegendItem(
id
:LegendItemIdentifier
):Promise
<null
|LegendItem
>
Allows you to get the state of a single legend item.
id
Promise
<null
| LegendItem
>
const legendItem = await felt.getLegendItem({
id: "legend-item-1",
layerId: "layer-1",
})
getLegendItems(
constraint
?:LegendItemsConstraint
):Promise
<(null
|LegendItem
)[]>
Allows you to obtain the state of several legend items, by passing in constraints describing which legend items you want.
If you do not pass any constraints, you will receive all legend items.
constraint
?
Promise
<(null
| LegendItem
)[]>
const legendItems = await felt.getLegendItems({layerId: "layer-1"});
setLegendItemVisibility(
visibility
: {show
:LegendItemIdentifier
[];hide
:LegendItemIdentifier
[]; }):Promise
<void
>
Hide or show legend items with the given identifiers.
visibility
{ show
: []; hide
: []; }
visibility.show
?
[]
visibility.hide
?
[]
Promise
<void
>
felt.setLegendItemVisibility({
show: [{layerId: "layer-group-1", id: "item-1-0"}],
hide: [{layerId: "layer-group-2", id: "item-2-0"}],
})
getLayerFilters(
layerId
:string
):Promise
<null
|LayerFilters
>
Get the filters for a layer.
layerId
string
Promise
<null
| LayerFilters
>
The return type gives you the filters split up into the various sources that make up the overall filters for a layer.
const filters = await felt.getLayerFilters("layer-1");
console.log(filters.combined, filters.style, filters.ephemeral, filters.components);
setLayerFilters(
params
: {layerId
:string
;filters
:Filters
;note
:string
; }):Promise
<void
>
Sets the ephemeral filters for a layer.
params
{ layerId
: string
; filters
: ; note
: string
; }
-
params.layerId
string
The layer that you want to set the filters for.
params.filters
The filters to set for the layer. This will replace any ephemeral filters that are currently set for the layer.
params.note
?
string
A note to display on the layer legend when this filter is applied. When the note is shown, a reset button will also be shown, allowing the user to clear the filter.
Promise
<void
>
await felt.setLayerFilters({
layerId: "layer-1",
filters: ["AREA", "gt", 30_000],
});
getLayerBoundaries(
layerId
:string
):Promise
<null
|LayerBoundaries
>
Get the spatial boundaries that are filtering a layer.
layerId
string
Promise
<null
| LayerBoundaries
>
The return type gives you the boundaries split up into the various sources that make up the overall boundary for a layer.
The combined boundary is the intersection of the other sources of boundaries.
const boundaries = await felt.getLayerBoundaries("layer-1");
console.log(boundaries?.combined);
console.log(boundaries?.spatialFilters);
console.log(boundaries?.ephemeral);
setLayerBoundary(
params
: {layerIds
:string
[];boundary
:null
|GeometryFilter
; }):Promise
<void
>
Set the `ephemeral` boundary for one or more layers.
params
{ layerIds
: string
[]; boundary
: null
| ; }
-
params.layerIds
string
[]
The ids of the layers to set the boundary for.
params.boundary
null
|
The boundary to set for the layer. Passing null
clears the ephemeral boundary for the layer.
Promise
<void
>
await felt.setLayerBoundary({
layerIds: ["layer-1", "layer-2"],
boundary: { type: "MultiPolygon", coordinates: [[[100, 0], [101, 0], [101, 1], [100, 1], [100, 0]]] }
});
getRenderedFeatures(
params
?:GetRenderedFeaturesConstraint
):Promise
<LayerFeature
[]>
Get the features that are currently rendered on the map in the viewport.
Note that this is explicitly about the features that are rendered, which isn't necessarily a complete list of all the features in the viewport. This is because of the way features are tiled: at low zoom levels or high feature densities, many features are omitted from what is rendered on the screen.
params
?
The constraints to apply to the features returned from the map.
Promise
<LayerFeature
[]>
const features = await felt.getRenderedFeatures();
getFeature(
params
: {id
:string
|number
;layerId
:string
; }):Promise
<null
|LayerFeature
>
Get a feature from the map by its ID and layer ID.
The response is a LayerFeature object, which does not include the geometry of the feature.
You may want to use this when you don't need the geometry of a feature, but you know the ID of the feature you need.
params
{ id
: string
| number
; layerId
: string
; }
params.id
string
| number
params.layerId
string
Promise
<null
| LayerFeature
>
const feature = await felt.getFeature({ layerId: "layer-1", id: 123 });
getFeatures(
params
: {layerId
:string
;filters
:Filters
;sorting
:SortConfig
;boundary
:GeometryFilter
;search
:string
;pagination
:null
|string
; }):Promise
<{features
:LayerFeature
[];count
:number
;previousPage
:null
|string
;nextPage
:null
|string
; }>
Get a list of layer features.
params
{ layerId
: string
; filters
: ; sorting
: ; boundary
: ; search
: string
; pagination
: null
| string
; }
-
params.layerId
string
The ID of the layer to get features from.
params.filters
?
Filters to be applied. These filters will merge with layer's own filters.
params.sorting
?
Attribute to sort by.
params.boundary
?
The spatial boundary to be applied.
params.search
?
string
Search term to search by. Search is case-insensitive and looks for matches across all feature properties.
params.pagination
?
null
| string
Pagination token. It comes from either the previousPage
or nextPage
properties of the previous response.
Promise
<{ features
: LayerFeature
[]; count
: number
; previousPage
: null
| string
; nextPage
: null
| string
; }>
The response is an object which contains:
features
: list of LayerFeature objects, which does not include
the geometry of the feature but it does include its bounding box.
count
: the total number of features that match the query.
previousPage
& nextPage
: The tokens to pass in the pagination
param
to navigate between pages.
This list is paginated in sets of 20 features for each page. In order to paginate
between pages, the response includes previousPage
and nextPage
that are tokens
that should be sent in the pagination
params for requesting sibling pages.
Text search is case-insensitive and looks for matches across all feature properties.
const page1Response = await felt.getFeatures({
layerId: "layer-1",
search: "abc123",
pagination: undefined,
});
// Note that the search term here matches the one for the first page.
if (page1Response.nextPage) {
const page2Response = await felt.getFeatures({
layerId: "layer-1",
search: "abc123",
pagination: page1Response.nextPage,
});
}
getGeoJsonFeature(
params
: {id
:string
|number
;layerId
:string
; }):Promise
<null
|GeoJsonFeature
>
Get a feature in GeoJSON format from the map by its ID and layer ID.
The response is a GeoJSON Feature object with the complete geometry of the feature. Note that for some very large geometries, the response may take a long time to return, and may return a very large object.
params
{ id
: string
| number
; layerId
: string
; }
params.id
string
| number
params.layerId
string
Promise
<null
| GeoJsonFeature
>
const feature = await felt.getGeoJsonFeature({ layerId: "layer-1", id: 123 });
getCategoryData(
params
:GetLayerCategoriesParams
):Promise
<GetLayerCategoriesGroup
[]>
Gets values from a layer grouped by a given attribute.
params
Promise
<GetLayerCategoriesGroup
[]>
Groups features in your layer by unique values in the specified attribute and calculates a value for each group. By default, this value is the count of features in each group.
You can apply filters in two ways:
At the top level (using boundary
and filters
), which affects both what categories
are included and how values are calculated
In the values
configuration, which only affects the values but keeps all categories
This two-level filtering is particularly useful when you want to compare subsets of data while maintaining consistent categories. For example, you might want to show the distribution of all building types in a city, but only count buildings built after 2000 in each category.
// Basic grouping: Count of buildings by type
const buildingsByType = await felt.getCategoryData({
layerId: "buildings",
attribute: "type"
});
// Filtered grouping: Only count buildings in downtown
const downtownBuildingsByType = await felt.getCategoryData({
layerId: "buildings",
attribute: "type",
boundary: [-122.43, 47.60, -122.33, 47.62] // downtown boundary
});
// Advanced: Show all building types, but only sum floor area of recent buildings
const recentBuildingAreaByType = await felt.getCategoryData({
layerId: "buildings",
attribute: "type",
values: {
filters: ["year_built", "gte", 2000],
aggregation: {
method: "sum",
attribute: "floor_area"
}
}
});
// Compare residential density across neighborhoods while only counting recent buildings
const newBuildingDensityByNeighborhood = await felt.getCategoryData({
layerId: "buildings",
attribute: "neighborhood",
values: {
filters: ["year_built", "gte", 2000],
aggregation: {
method: "avg",
attribute: "units_per_acre"
}
}
});
getHistogramData(
params
:GetLayerHistogramParams
):Promise
<GetLayerHistogramBin
[]>
Gets a histogram of values from a layer for a given attribute.
params
Promise
<GetLayerHistogramBin
[]>
Creates bins (ranges) for numeric data and counts how many features fall into each bin, or returns aggregated values for each bin.
You can control how the bins are created using the steps
parameter, choosing from
several methods like equal intervals, quantiles, or natural breaks (Jenks), or passing
in the step values directly if you know how you want to bin the data.
Like getCategoryData, you can apply filters in two ways:
At the top level (using boundary
and filters
), which affects both how the bins
are calculated and what features are counted in each bin
In the values
configuration, which only affects what gets counted but keeps the
bin ranges the same
This is particularly useful when you want to compare distributions while keeping consistent bin ranges. For example, you might want to compare the distribution of building heights in different years while using the same height ranges.
// Basic histogram: Building heights in 5 natural break bins
const buildingHeights = await felt.getHistogramData({
layerId: "buildings",
attribute: "height",
steps: { type: "jenks", count: 5 }
});
// Compare old vs new buildings using the same height ranges
const oldBuildingHeights = await felt.getHistogramData({
layerId: "buildings",
attribute: "height",
steps: [0, 20, 50, 100, 200, 500],
values: {
filters: ["year_built", "lt", 1950]
}
});
const newBuildingHeights = await felt.getHistogramData({
layerId: "buildings",
attribute: "height",
steps: [0, 20, 50, 100, 200, 500], // Same ranges as above
values: {
filters: ["year_built", "gte", 1950]
}
});
getAggregates<
T
>(params
:GetLayerCalculationParams
<T
>):Promise
<Record
<T
,null
|number
>>
Calculates a single aggregate value for a layer based on the provided configuration.
T
extends "avg"
| "max"
| "min"
| "sum"
| "median"
| "count"
params
<T
>
Promise
<Record
<T
, null
| number
>>
Performs statistical calculations on your data, like counting features or computing averages, sums, etc. You can focus your calculation on specific areas or subsets of your data using boundaries and filters.
When no aggregation is specified, it counts features. When an aggregation is provided, it performs that calculation (average, sum, etc.) on the specified attribute.
// Count all residential buildings
const residentialCount = await felt.getAggregates({
layerId: "buildings",
filters: ["type", "eq", "residential"]
});
// Calculate average home value in a specific neighborhood
const avgHomeValue = await felt.getAggregates({
layerId: "buildings",
boundary: [-122.43, 47.60, -122.33, 47.62], // neighborhood boundary
aggregation: {
method: "avg",
attribute: "assessed_value"
}
});
// Find the maximum building height for buildings built after 2000
const maxNewBuildingHeight = await felt.getAggregates({
layerId: "buildings",
filters: ["year_built", "gte", 2000],
aggregation: {
method: "max",
attribute: "height"
}
});
getLayerSchema(
layerId
:string
):Promise
<LayerSchema
>
Get the schema for a layer.
layerId
string
Promise
<LayerSchema
>
The schema describes the structure of the data in a layer, including the attributes that are available on the features in the layer.
This can be useful to build generic UIs that need to know the structure of the data in a layer, such as a dropdown to choose an attribute.
const schema = await felt.getLayerSchema("layer-1");
const attributeIds = schema.attributes.map((attr) => attr.id);
onLayerChange(
args
: {options
: {id
:string
; };handler
: (change
:LayerChangeCallbackParams
) =>void
; }):VoidFunction
Adds a listener for when a layer changes.
args
{ options
: { id
: string
; }; handler
: (change
: ) => void
; }
-
args.options
{ id
: string
; }
-
args.options.id
string
The id of the layer to listen for changes to.
args.handler
(change
: ) => void
The handler that is called when the layer changes.
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onLayerChange({
options: { id: "layer-1" },
handler: ({layer}) => console.log(layer.bounds),
});
// later on...
unsubscribe();
onLayerGroupChange(
args
: {options
: {id
:string
; };handler
: (change
:LayerGroupChangeCallbackParams
) =>void
; }):VoidFunction
Adds a listener for when a layer group changes.
args
{ options
: { id
: string
; }; handler
: (change
: ) => void
; }
args.options
{ id
: string
; }
args.options.id
string
args.handler
(change
: ) => void
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onLayerGroupChange({
options: { id: "layer-group-1" },
handler: ({layerGroup}) => console.log(layerGroup.id),
});
// later on...
unsubscribe();
onLegendItemChange(
args
: {options
:LegendItemIdentifier
;handler
: (change
:LegendItemChangeCallbackParams
) =>void
; }):VoidFunction
Adds a listener for when a legend item changes.
args
{ options
: ; handler
: (change
: ) => void
; }
args.options
args.handler
(change
: ) => void
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onLegendItemChange({
options: { layerId: "layer-1", id: "item-1-0" },
handler: ({legendItem}) => console.log(legendItem.visible),
});
// later on...
unsubscribe();
onLayerFiltersChange(
params
: {options
: {layerId
:string
; };handler
: (change
:LayerFilters
) =>void
; }):VoidFunction
Adds a listener for when a layer's filters change.
params
{ options
: { layerId
: string
; }; handler
: (change
: ) => void
; }
params.options
{ layerId
: string
; }
params.options.layerId
string
params.handler
(change
: ) => void
VoidFunction
A function to unsubscribe from the listener
This event fires whenever any type of filter changes on the layer, including ephemeral filters set via the SDK, style-based filters, or filters set through the Felt UI via Components.
const unsubscribe = felt.onLayerFiltersChange({
options: { layerId: "layer-1" },
handler: ({combined, ephemeral, style, components}) => {
console.log("Layer filters updated:", {
combined, // All filters combined
ephemeral, // Filters set via SDK
style, // Filters from layer style
components // Filters from UI components
});
},
});
// later on...
unsubscribe();
onLayerBoundariesChange(
params
: {options
: {layerId
:string
; };handler
: (boundaries
:null
|LayerBoundaries
) =>void
; }):VoidFunction
Adds a listener for when a layer's spatial boundaries change.
params
{ options
: { layerId
: string
; }; handler
: (boundaries
: null
| ) => void
; }
-
params.options
{ layerId
: string
; }
-
params.options.layerId
string
The id of the layer to listen for boundary changes on.
params.handler
(boundaries
: null
| ) => void
A function that is called when the boundaries change.
VoidFunction
A function to unsubscribe from the listener
This event fires whenever any type of spatial boundary changes on the layer, including ephemeral boundaries set via the SDK or boundaries set through the Felt UI via Spatial filter components.
const unsubscribe = felt.onLayerBoundariesChange({
options: { layerId: "layer-1" },
handler: ({combined, ephemeral, spatialFilters}) => {
console.log("Layer boundaries updated:", {
combined, // All boundaries combined
ephemeral, // Boundaries set via SDK
spatialFilters // Boundaries set via UI
});
},
});
// later on...
unsubscribe();
This is the main interface for interacting with a Felt map.
This interface is composed of the various controllers, each having a different area of responsibility.
All the methods are listed here, but each controller is documented on its own to make it easier to find related methods and events.
getElement(
id
:string
):Promise
<null
|Element
>
Get a single element from the map by its id.
id
string
The id of the element you want to get.
Promise
<null
| Element
>
The requested element.
const element = await felt.getElement("element-1");
getElementGeometry(
id
:string
):Promise
<null
|GeoJsonGeometry
>
Get the geometry of an element in GeoJSON geometry format.
For most element types, the geometry returned is based on the coordinates
property of the element, with some differences:
For Circle elements, the geometry is a Polygon drawn from the center
andradius
properties.
Path elements become MultiLineString geometries.
Marker elements return a MultiLineString of the path traced by the user as they drew the marker. Note that this is not the polygon formed by filled-in "pen" stroke, which doesn't exactly follow the path traced by the user as it is smoothed and interpolated to create a continuous line.
Text, Note and Image elements do not return geometry, so will return null
.
id
string
The id of the element you want to get the geometry of.
Promise
<null
| GeoJsonGeometry
>
const geometry = await felt.getElementGeometry("element-1");
console.log(geometry?.type, geometry?.coordinates);
getElements(
constraint
?:GetElementsConstraint
):Promise
<(null
|Element
)[]>
Gets elements from the map, according to the constraints supplied. If no constraints are supplied, all elements will be returned.
constraint
?
The constraints to apply to the elements returned from the map.
Promise
<(null
| Element
)[]>
All elements on the map.
The elements in the map, ordered by the order specified in Felt. This is not necessarily the order that they are drawn in, as Felt draws points above lines and lines above polygons, for instance.
const elements = await felt.getElements();
getElementGroup(
id
:string
):Promise
<null
|ElementGroup
>
Get an element group from the map by its id.
id
string
Promise
<null
| ElementGroup
>
The requested element group.
const elementGroup = await felt.getElementGroup("element-group-1");
getElementGroups(
constraint
?:GetElementGroupsConstraint
):Promise
<(null
|ElementGroup
)[]>
Gets element groups from the map, according to the filters supplied. If no constraints are supplied, all element groups will be returned in rendering order.
constraint
?
The constraints to apply to the element groups returned from the map.
Promise
<(null
| ElementGroup
)[]>
The requested element groups.
const elementGroups = await felt.getElementGroups({ ids: ["element-group-1", "element-group-2"] });
setElementGroupVisibility(
visibility
:SetVisibilityRequest
):Promise
<void
>
Hide or show element groups with the given ids.
visibility
Promise
<void
>
felt.setElementGroupVisibility({ show: ["element-group-1", "element-group-2"], hide: ["element-group-3"] });
createElement(
element
:ElementCreate
):Promise
<Element
>
Create a new element on the map.
element
Promise
<Element
>
const element = await felt.createElement({ type: "Place", coordinates: [10, 10] });
updateElement(
element
:ElementUpdate
):Promise
<Element
>
Update an element on the map.
element
Promise
<Element
>
// Update a place element's coordinates
await felt.updateElement({
id: "element-1",
coordinates: [10, 20]
});
// Update a polygon's style
await felt.updateElement({
id: "element-2",
color: "#ABC123",
fillOpacity: 0.5
});
deleteElement(
id
:string
):Promise
<void
>
Delete an element from the map.
id
string
Promise
<void
>
await felt.deleteElement("element-1");
getLayer(
id
:string
):Promise
<null
|Layer
>
Get a single layer from the map by its id.
id
string
The id of the layer you want to get.
Promise
<null
| Layer
>
The requested layer.
const layer = await felt.getLayer("layer-1");
getLayers(
constraint
?:GetLayersConstraint
):Promise
<(null
|Layer
)[]>
Gets layers from the map, according to the constraints supplied. If no constraints are supplied, all layers will be returned.
constraint
?
The constraints to apply to the layers returned from the map.
Promise
<(null
| Layer
)[]>
All layers on the map.
The layers in the map, ordered by the order specified in Felt. This is not necessarily the order that they are drawn in, as Felt draws points above lines and lines above polygons, for instance.
const layers = await felt.getLayers();
setLayerVisibility(
visibility
:SetVisibilityRequest
):Promise
<void
>
Hide or show layers with the given ids.
visibility
Promise
<void
>
felt.setLayerVisibility({ show: ["layer-1", "layer-2"], hide: ["layer-3"] });
setLayerStyle(
params
: {id
:string
;style
:object
; }):Promise
<void
>
Set the style for a layer using FSL, the Felt Style Language.
Changes are only for this session, and not persisted. This is useful to make temporary changes to a layer's style, such as to highlight a particular layer or feature.
See the FSL documentation for details on how to read and write styles.
If the style you set is invalid, you will receive an error explaining the problem in the rejected promise value.
params
{ id
: string
; style
: object
; }
-
params.id
string
The id of the layer to set the style for.
params.style
object
The style to set for the layer.
Promise
<void
>
// first get the current style
const oldStyle = (await felt.getLayer("layer-1")).style;
felt.setLayerStyle({ id: "layer-1", style: {
...oldStyle,
paint: {
...oldStyle.paint,
color: "red",
},
} });
setLayerLegendVisibility(
params
:SetVisibilityRequest
):Promise
<void
>
Hide or show layers with the given ids from the legend.
params
Promise
<void
>
felt.setLayerLegendVisibility({ show: ["layer-1", "layer-2"], hide: ["layer-3"] });
createLayersFromGeoJson(
params
:CreateLayersFromGeoJsonParams
):Promise
<null
| {layerGroup
:LayerGroup
;layers
:Layer
[]; }>
Adds layers to the map from file or URL sources.
params
Promise
<null
| { layerGroup
: LayerGroup
; layers
: Layer
[]; }>
The layer groups that were created.
This allows you to add temporary layers to the map that don't depend on any processing by Felt. This is useful for viewing data from external sources or remote files.
const layerFromFile = await felt.createLayersFromGeoJson({
source: {
type: "geoJsonFile",
file: someFile,
},
name: "Parcels",
});
const layerFromUrl = await felt.createLayersFromGeoJson({
source: {
sourceType: "geoJsonUrl",
url: "https://example.com/parcels.geojson",
},
name: "Parcels",
updateLayer(
params
:UpdateLayerParams
):Promise
<Layer
>
Update a layer by passing a subset of the layer's properties.
Note that not all properties can be updated, so check the UpdateLayerParams type to see which properties can be updated.
params
Promise
<Layer
>
await felt.updateLayer({
id: "layer-1",
name: "My Layer",
caption: "A description of the layer",
});
deleteLayer(
id
:string
):Promise
<void
>
Delete a layer from the map by its id.
id
string
Promise
<void
>
This only works for layers created via the SDK createLayersFromGeoJson
method, not layers added via the Felt UI.
await felt.deleteLayer("layer-1");
getLayerGroup(
id
:string
):Promise
<null
|LayerGroup
>
Get a layer group from the map by its id.
id
string
Promise
<null
| LayerGroup
>
The requested layer group.
const layerGroup = await felt.getLayerGroup("layer-group-1");
getLayerGroups(
constraint
?:GetLayerGroupsConstraint
):Promise
<(null
|LayerGroup
)[]>
Gets layer groups from the map, according to the constraints supplied. If no constraints are supplied, all layer groups will be returned in rendering order.
constraint
?
The constraints to apply to the layer groups returned from the map.
Promise
<(null
| LayerGroup
)[]>
The requested layer groups.
const layerGroups = await felt.getLayerGroups({ ids: ["layer-group-1", "layer-group-2"] });
setLayerGroupVisibility(
visibility
:SetVisibilityRequest
):Promise
<void
>
Hide or show layer groups with the given ids.
visibility
Promise
<void
>
felt.setLayerGroupVisibility({ show: ["layer-group-1", "layer-group-2"], hide: ["layer-group-3"] });
setLayerGroupLegendVisibility(
params
:SetVisibilityRequest
):Promise
<void
>
Hide or show layer groups with the given ids from the legend.
params
Promise
<void
>
felt.setLayerGroupLegendVisibility({ show: ["layer-1", "layer-2"], hide: ["layer-3"] });
getLegendItem(
id
:LegendItemIdentifier
):Promise
<null
|LegendItem
>
Allows you to get the state of a single legend item.
id
Promise
<null
| LegendItem
>
const legendItem = await felt.getLegendItem({
id: "legend-item-1",
layerId: "layer-1",
})
getLegendItems(
constraint
?:LegendItemsConstraint
):Promise
<(null
|LegendItem
)[]>
Allows you to obtain the state of several legend items, by passing in constraints describing which legend items you want.
If you do not pass any constraints, you will receive all legend items.
constraint
?
Promise
<(null
| LegendItem
)[]>
const legendItems = await felt.getLegendItems({layerId: "layer-1"});
setLegendItemVisibility(
visibility
: {show
:LegendItemIdentifier
[];hide
:LegendItemIdentifier
[]; }):Promise
<void
>
Hide or show legend items with the given identifiers.
visibility
{ show
: []; hide
: []; }
visibility.show
?
[]
visibility.hide
?
[]
Promise
<void
>
felt.setLegendItemVisibility({
show: [{layerId: "layer-group-1", id: "item-1-0"}],
hide: [{layerId: "layer-group-2", id: "item-2-0"}],
})
getLayerFilters(
layerId
:string
):Promise
<null
|LayerFilters
>
Get the filters for a layer.
layerId
string
Promise
<null
| LayerFilters
>
The return type gives you the filters split up into the various sources that make up the overall filters for a layer.
const filters = await felt.getLayerFilters("layer-1");
console.log(filters.combined, filters.style, filters.ephemeral, filters.components);
setLayerFilters(
params
: {layerId
:string
;filters
:Filters
;note
:string
; }):Promise
<void
>
Sets the ephemeral filters for a layer.
params
{ layerId
: string
; filters
: ; note
: string
; }
-
params.layerId
string
The layer that you want to set the filters for.
params.filters
The filters to set for the layer. This will replace any ephemeral filters that are currently set for the layer.
params.note
?
string
A note to display on the layer legend when this filter is applied. When the note is shown, a reset button will also be shown, allowing the user to clear the filter.
Promise
<void
>
await felt.setLayerFilters({
layerId: "layer-1",
filters: ["AREA", "gt", 30_000],
});
getLayerBoundaries(
layerId
:string
):Promise
<null
|LayerBoundaries
>
Get the spatial boundaries that are filtering a layer.
layerId
string
Promise
<null
| LayerBoundaries
>
The return type gives you the boundaries split up into the various sources that make up the overall boundary for a layer.
The combined boundary is the intersection of the other sources of boundaries.
const boundaries = await felt.getLayerBoundaries("layer-1");
console.log(boundaries?.combined);
console.log(boundaries?.spatialFilters);
console.log(boundaries?.ephemeral);
setLayerBoundary(
params
: {layerIds
:string
[];boundary
:null
|GeometryFilter
; }):Promise
<void
>
Set the `ephemeral` boundary for one or more layers.
params
{ layerIds
: string
[]; boundary
: null
| ; }
-
params.layerIds
string
[]
The ids of the layers to set the boundary for.
params.boundary
null
|
The boundary to set for the layer. Passing null
clears the ephemeral boundary for the layer.
Promise
<void
>
await felt.setLayerBoundary({
layerIds: ["layer-1", "layer-2"],
boundary: { type: "MultiPolygon", coordinates: [[[100, 0], [101, 0], [101, 1], [100, 1], [100, 0]]] }
});
getRenderedFeatures(
params
?:GetRenderedFeaturesConstraint
):Promise
<LayerFeature
[]>
Get the features that are currently rendered on the map in the viewport.
Note that this is explicitly about the features that are rendered, which isn't necessarily a complete list of all the features in the viewport. This is because of the way features are tiled: at low zoom levels or high feature densities, many features are omitted from what is rendered on the screen.
params
?
The constraints to apply to the features returned from the map.
Promise
<LayerFeature
[]>
const features = await felt.getRenderedFeatures();
getFeature(
params
: {id
:string
|number
;layerId
:string
; }):Promise
<null
|LayerFeature
>
Get a feature from the map by its ID and layer ID.
The response is a LayerFeature object, which does not include the geometry of the feature.
You may want to use this when you don't need the geometry of a feature, but you know the ID of the feature you need.
params
{ id
: string
| number
; layerId
: string
; }
params.id
string
| number
params.layerId
string
Promise
<null
| LayerFeature
>
const feature = await felt.getFeature({ layerId: "layer-1", id: 123 });
getFeatures(
params
: {layerId
:string
;filters
:Filters
;sorting
:SortConfig
;boundary
:GeometryFilter
;search
:string
;pagination
:null
|string
; }):Promise
<{features
:LayerFeature
[];count
:number
;previousPage
:null
|string
;nextPage
:null
|string
; }>
Get a list of layer features.
params
{ layerId
: string
; filters
: ; sorting
: ; boundary
: ; search
: string
; pagination
: null
| string
; }
-
params.layerId
string
The ID of the layer to get features from.
params.filters
?
Filters to be applied. These filters will merge with layer's own filters.
params.sorting
?
Attribute to sort by.
params.boundary
?
The spatial boundary to be applied.
params.search
?
string
Search term to search by. Search is case-insensitive and looks for matches across all feature properties.
params.pagination
?
null
| string
Pagination token. It comes from either the previousPage
or nextPage
properties of the previous response.
Promise
<{ features
: LayerFeature
[]; count
: number
; previousPage
: null
| string
; nextPage
: null
| string
; }>
The response is an object which contains:
features
: list of LayerFeature objects, which does not include
the geometry of the feature but it does include its bounding box.
count
: the total number of features that match the query.
previousPage
& nextPage
: The tokens to pass in the pagination
param
to navigate between pages.
This list is paginated in sets of 20 features for each page. In order to paginate
between pages, the response includes previousPage
and nextPage
that are tokens
that should be sent in the pagination
params for requesting sibling pages.
Text search is case-insensitive and looks for matches across all feature properties.
const page1Response = await felt.getFeatures({
layerId: "layer-1",
search: "abc123",
pagination: undefined,
});
// Note that the search term here matches the one for the first page.
if (page1Response.nextPage) {
const page2Response = await felt.getFeatures({
layerId: "layer-1",
search: "abc123",
pagination: page1Response.nextPage,
});
}
getGeoJsonFeature(
params
: {id
:string
|number
;layerId
:string
; }):Promise
<null
|GeoJsonFeature
>
Get a feature in GeoJSON format from the map by its ID and layer ID.
The response is a GeoJSON Feature object with the complete geometry of the feature. Note that for some very large geometries, the response may take a long time to return, and may return a very large object.
params
{ id
: string
| number
; layerId
: string
; }
params.id
string
| number
params.layerId
string
Promise
<null
| GeoJsonFeature
>
const feature = await felt.getGeoJsonFeature({ layerId: "layer-1", id: 123 });
getCategoryData(
params
:GetLayerCategoriesParams
):Promise
<GetLayerCategoriesGroup
[]>
Gets values from a layer grouped by a given attribute.
params
Promise
<GetLayerCategoriesGroup
[]>
Groups features in your layer by unique values in the specified attribute and calculates a value for each group. By default, this value is the count of features in each group.
You can apply filters in two ways:
At the top level (using boundary
and filters
), which affects both what categories
are included and how values are calculated
In the values
configuration, which only affects the values but keeps all categories
This two-level filtering is particularly useful when you want to compare subsets of data while maintaining consistent categories. For example, you might want to show the distribution of all building types in a city, but only count buildings built after 2000 in each category.
// Basic grouping: Count of buildings by type
const buildingsByType = await felt.getCategoryData({
layerId: "buildings",
attribute: "type"
});
// Filtered grouping: Only count buildings in downtown
const downtownBuildingsByType = await felt.getCategoryData({
layerId: "buildings",
attribute: "type",
boundary: [-122.43, 47.60, -122.33, 47.62] // downtown boundary
});
// Advanced: Show all building types, but only sum floor area of recent buildings
const recentBuildingAreaByType = await felt.getCategoryData({
layerId: "buildings",
attribute: "type",
values: {
filters: ["year_built", "gte", 2000],
aggregation: {
method: "sum",
attribute: "floor_area"
}
}
});
// Compare residential density across neighborhoods while only counting recent buildings
const newBuildingDensityByNeighborhood = await felt.getCategoryData({
layerId: "buildings",
attribute: "neighborhood",
values: {
filters: ["year_built", "gte", 2000],
aggregation: {
method: "avg",
attribute: "units_per_acre"
}
}
});
getHistogramData(
params
:GetLayerHistogramParams
):Promise
<GetLayerHistogramBin
[]>
Gets a histogram of values from a layer for a given attribute.
params
Promise
<GetLayerHistogramBin
[]>
Creates bins (ranges) for numeric data and counts how many features fall into each bin, or returns aggregated values for each bin.
You can control how the bins are created using the steps
parameter, choosing from
several methods like equal intervals, quantiles, or natural breaks (Jenks), or passing
in the step values directly if you know how you want to bin the data.
Like getCategoryData, you can apply filters in two ways:
At the top level (using boundary
and filters
), which affects both how the bins
are calculated and what features are counted in each bin
In the values
configuration, which only affects what gets counted but keeps the
bin ranges the same
This is particularly useful when you want to compare distributions while keeping consistent bin ranges. For example, you might want to compare the distribution of building heights in different years while using the same height ranges.
// Basic histogram: Building heights in 5 natural break bins
const buildingHeights = await felt.getHistogramData({
layerId: "buildings",
attribute: "height",
steps: { type: "jenks", count: 5 }
});
// Compare old vs new buildings using the same height ranges
const oldBuildingHeights = await felt.getHistogramData({
layerId: "buildings",
attribute: "height",
steps: [0, 20, 50, 100, 200, 500],
values: {
filters: ["year_built", "lt", 1950]
}
});
const newBuildingHeights = await felt.getHistogramData({
layerId: "buildings",
attribute: "height",
steps: [0, 20, 50, 100, 200, 500], // Same ranges as above
values: {
filters: ["year_built", "gte", 1950]
}
});
getAggregates<
T
>(params
:GetLayerCalculationParams
<T
>):Promise
<Record
<T
,null
|number
>>
Calculates a single aggregate value for a layer based on the provided configuration.
T
extends "avg"
| "max"
| "min"
| "sum"
| "median"
| "count"
params
<T
>
Promise
<Record
<T
, null
| number
>>
Performs statistical calculations on your data, like counting features or computing averages, sums, etc. You can focus your calculation on specific areas or subsets of your data using boundaries and filters.
When no aggregation is specified, it counts features. When an aggregation is provided, it performs that calculation (average, sum, etc.) on the specified attribute.
// Count all residential buildings
const residentialCount = await felt.getAggregates({
layerId: "buildings",
filters: ["type", "eq", "residential"]
});
// Calculate average home value in a specific neighborhood
const avgHomeValue = await felt.getAggregates({
layerId: "buildings",
boundary: [-122.43, 47.60, -122.33, 47.62], // neighborhood boundary
aggregation: {
method: "avg",
attribute: "assessed_value"
}
});
// Find the maximum building height for buildings built after 2000
const maxNewBuildingHeight = await felt.getAggregates({
layerId: "buildings",
filters: ["year_built", "gte", 2000],
aggregation: {
method: "max",
attribute: "height"
}
});
getLayerSchema(
layerId
:string
):Promise
<LayerSchema
>
Get the schema for a layer.
layerId
string
Promise
<LayerSchema
>
The schema describes the structure of the data in a layer, including the attributes that are available on the features in the layer.
This can be useful to build generic UIs that need to know the structure of the data in a layer, such as a dropdown to choose an attribute.
const schema = await felt.getLayerSchema("layer-1");
const attributeIds = schema.attributes.map((attr) => attr.id);
getMapDetails():
Promise
<MapDetails
>
Gets the details of the map.
Promise
<MapDetails
>
const details = await felt.getMapDetails();
console.log({
id: details.id,
title: details.title,
description: details.description,
});
getSelection():
Promise
<EntityNode
[]>
Gets the current selection as a list of entity identifiers.
Promise
<EntityNode
[]>
const selection = await felt.getSelection();
selectFeature(
params
:FeatureSelection
):Promise
<void
>
Selects a feature on a layer. This will show the feature's popup, modal or sidebar (if configured) and highlight the feature.
params
Promise
<void
>
felt.selectFeature({
id: 123,
layerId: "my-layer",
showPopup: true,
fitViewport: { maxZoom: 15 },
});
clearSelection(
params
?: {features
:boolean
;elements
:boolean
; }):Promise
<void
>
Clears the current selection. This clears the selection of
params
?
{ features
: boolean
; elements
: boolean
; }
The parameters to clear the selection. If this is not provided, both features and elements will be cleared.
params.features
?
boolean
Whether to clear the features from the selection.
params.elements
?
boolean
Whether to clear the elements from the selection.
Promise
<void
>
// Removes all features and elements from the selection
felt.clearSelection();
// Removes only features from the selection
felt.clearSelection({ features: true });
// Removes only elements from the selection
felt.clearSelection({ elements: true });
{ features: true, elements: true }
setTool(
tool
:null
|"text"
|"link"
|"note"
|"pin"
|"line"
|"route"
|"polygon"
|"circle"
|"marker"
|"highlighter"
):void
Sets the tool to use for drawing elements on the map.
tool
null
| "text"
| "link"
| "note"
| "pin"
| "line"
| "route"
| "polygon"
| "circle"
| "marker"
| "highlighter"
The tool to set.
void
// Set the tool to "marker"
await felt.setTool("marker");
// put down the tool
await felt.setTool(null);
getTool():
Promise
<null
|"text"
|"link"
|"note"
|"pin"
|"line"
|"route"
|"polygon"
|"circle"
|"marker"
|"highlighter"
>
Gets the current tool, if any is in use.
Promise
<null
| "text"
| "link"
| "note"
| "pin"
| "line"
| "route"
| "polygon"
| "circle"
| "marker"
| "highlighter"
>
The current tool, or null
if no tool is in use.
const tool = await felt.getTool(); // "marker", "polygon", etc.
onToolChange(
args
: {handler
: (tool
:null
|"text"
|"link"
|"note"
|"pin"
|"line"
|"route"
|"polygon"
|"circle"
|"marker"
|"highlighter"
) =>void
; }):VoidFunction
Listens for changes to the current tool.
args
{ handler
: (tool
: null
| "text"
| "link"
| "note"
| "pin"
| "line"
| "route"
| "polygon"
| "circle"
| "marker"
| "highlighter"
) => void
; }
-
args.handler
(tool
: null
| "text"
| "link"
| "note"
| "pin"
| "line"
| "route"
| "polygon"
| "circle"
| "marker"
| "highlighter"
) => void
This callback is called with the current tool whenever the tool changes.
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onToolChange({
handler: tool => console.log(tool),
});
// later on...
unsubscribe();
setToolSettings(
settings
:InputToolSettings
):void
Sets the settings for the current tool.
settings
The settings to set.
void
// Set the settings for the marker tool
await felt.setToolSettings({
tool: "marker",
color: "#FE17",
});
getToolSettings<
T
>(tool
:T
):Promise
<ToolSettingsMap
[T
]>
Gets the settings for the chosen tool
T
extends keyof
tool
T
Promise
<ToolSettingsMap
[T
]>
The settings for the chosen tool.
const settings = await felt.getToolSettings("marker");
onToolSettingsChange(
args
: {handler
: (settings
:ToolSettingsChangeEvent
) =>void
; }):VoidFunction
Listens for changes to the settings on all tools.
args
{ handler
: (settings
: ) => void
; }
args.handler
(settings
: ) => void
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onToolSettingsChange({
handler: settings => console.log(settings),
});
// later on...
unsubscribe();
updateUiControls(
controls
:UiControlsOptions
):void
Updates the UI controls on the embedded map.
controls
The controls to update.
void
// Show some UI controls
await felt.updateUiControls({
showLegend: true,
fullScreenButton: true,
});
// Disable some UI options
await felt.updateUiControls({
cooperativeGestures: false,
geolocation: false,
});
setOnMapInteractionsUi(
options
:OnMapInteractionsOptions
):void
Control the on-map UI shown when interacting with features and elements.
If you add your own click, selection or hover handlers you may want to disable various parts of the Felt UI. This method allows you to control the visibility of various parts of the UI that might otherwise be shown when people click or hover on things.
This does not affect selection. That means that selectable features and elements will still be selected when clicked.
options
void
// Disable UI when hovering or selecting features
await felt.setOnMapInteractionsUi({
featureSelectPanel: false,
featureHoverPanel: false,
});
showLayerDataTable(
params
?: {layerId
:string
;sorting
:SortConfig
; }):Promise
<void
>
Shows a data table view for the specified layer, optionally sorted by a given attribute.
params
?
{ layerId
: string
; sorting
: ; }
params.layerId
?
string
params.sorting
?
Promise
<void
>
// Show data table with default sorting
await felt.showLayerDataTable({
layerId: "layer-1",
});
// Show data table sorted by height in descending order
await felt.showLayerDataTable({
layerId: "layer-1",
sorting: {
attribute: "height",
direction: "desc",
},
});
// Show the data table pane with no table visible
await felt.showLayerDataTable();
hideLayerDataTable():
Promise
<void
>
Hides the data table.
Promise
<void
>
await felt.hideLayerDataTable();
getViewport():
Promise
<ViewportState
>
Gets the current state of the viewport.
Promise
<ViewportState
>
// Get current viewport state
const viewport = await felt.getViewport();
console.log({
center: viewport.center,
zoom: viewport.zoom,
});
setViewport(
viewport
:SetViewportCenterZoomParams
):void
Moves the map to the specified location.
viewport
void
felt.setViewport({
center: { latitude: 0, longitude: 0 },
zoom: 10,
});
getViewportConstraints():
Promise
<null
|ViewportConstraints
>
Gets the current state of the viewport constraints.
Promise
<null
| ViewportConstraints
>
// Get current viewport constraints
const constraints = await felt.getViewportConstraints();
if (constraints) {
console.log({
bounds: constraints.bounds,
minZoom: constraints.minZoom,
maxZoom: constraints.maxZoom
});
} else {
console.log("No viewport constraints set");
}
setViewportConstraints(
constraints
:null
|Partial
<ViewportConstraints
>):void
Constrains the map viewport so it stays inside certain bounds and/or certain zoom levels.
constraints
null
| Partial
<>
void
felt.setViewportConstraints({
bounds: [-122.5372532, 37.6652478, -122.1927016, 37.881707],
minZoom: 1,
maxZoom: 23,
});
every constraint is optional
felt.setViewportConstraints({
bounds: [-122.5372532, 37.6652478, -122.1927016, 37.881707],
});
if a constraint is null, it will be removed but keeping the others
felt.setViewportConstraints({ bounds: null });
if method receives null, it will remove the constraints
felt.setViewportConstraints(null);
fitViewportToBounds(
bounds
:ViewportFitBoundsParams
):void
Fits the map to the specified bounds.
bounds
void
const west = -122.4194;
const south = 37.7749;
const east = -122.4194;
const north = 37.7749;
felt.fitViewportToBounds({ bounds: [west, south, east, north] });
onElementCreate(
args
: {handler
: (change
:ElementChangeCallbackParams
) =>void
; }):VoidFunction
Adds a listener for when an element is created.
args
{ handler
: (change
: ) => void
; }
-
args.handler
(change
: ) => void
The handler that is called when an element is created. This will fire when elements are created programatically, or when the user starts creating an element with a drawing tool. When the user creates an element with a drawing tool, it can begin in an invalid state, such as if you've just placed a single point in a polygon. You can use the isBeingCreated
property to determine if the element is still being created by a drawing tool. If you want to know when the element is finished being created, you can use the listener.
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onElementCreate({
handler: (element) => console.log(element.id),
});
// later on...
unsubscribe();
onElementCreateEnd(
args
: {handler
: (params
: {element
:Element
; }) =>void
; }):VoidFunction
Listens for when a new element is finished being created by a drawing tool.
This differs from the `onElementCreate` listener, which fires whenever an element is first created. This fires when the user finishes creating an element which could be after a series of interactions.
For example, when creating a polygon, the user places a series of points then finishes by pressing Enter or Escape. Or when creating a Place element, they add the marker, type a label, then finally deselect the element.
args
{ handler
: (params
: { element
: ; }) => void
; }
-
args.handler
(params
: { element
: ; }) => void
The handler to call whenever this event fires.
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onToolCreatedElement({
handler: (params) => console.log(params),
});
// later on...
unsubscribe();
onElementChange(
args
: {options
: {id
:string
; };handler
: (change
:ElementChangeCallbackParams
) =>void
; }):VoidFunction
Adds a listener for when an element changes.
This will fire when an element is being edited, either on the map by the user or programatically.
Like the `onElementCreate` listener, this will fire when an element is still being created by a drawing tool.
You can check the `isBeingCreated` property to determine if the element is still being created by a drawing tool.
args
{ options
: { id
: string
; }; handler
: (change
: ) => void
; }
-
args.options
{ id
: string
; }
-
args.options.id
string
The id of the element to listen for changes to.
args.handler
(change
: ) => void
The handler that is called when the element changes.
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onElementChange({
options: { id: "element-1" },
handler: ({element}) => console.log(element.id),
});
// later on...
unsubscribe();
onElementDelete(
args
: {options
: {id
:string
; };handler
: () =>void
; }):VoidFunction
Adds a listener for when an element is deleted.
args
{ options
: { id
: string
; }; handler
: () => void
; }
-
args.options
{ id
: string
; }
-
args.options.id
string
The id of the element to listen for deletions of.
args.handler
() => void
The handler that is called when the element is deleted.
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onElementDelete({
options: { id: "element-1" },
handler: () => console.log("element-1 deleted"),
});
// later on...
unsubscribe();
onElementGroupChange(
args
: {options
: {id
:string
; };handler
: (change
:ElementGroupChangeCallbackParams
) =>void
; }):VoidFunction
Adds a listener for when an element group changes.
args
{ options
: { id
: string
; }; handler
: (change
: ) => void
; }
args.options
{ id
: string
; }
args.options.id
string
args.handler
(change
: ) => void
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onElementGroupChange({
options: { id: "element-group-1" },
handler: elementGroup => console.log(elementGroup.id),
});
// later on...
unsubscribe();
onPointerClick(
params
: {handler
: (event
:MapInteractionEvent
) =>void
; }):VoidFunction
Allows you to be notified the user clicks on the map.
params
{ handler
: (event
: ) => void
; }
params.handler
(event
: ) => void
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onPointerClick({
handler: (event) => console.log(event.center, event.features),
});
// later on...
unsubscribe();
onPointerMove(
params
: {handler
: (event
:MapInteractionEvent
) =>void
; }):VoidFunction
Allows you to be notified the user moves the mouse over the map.
params
{ handler
: (event
: ) => void
; }
Params for the listener
params.handler
(event
: ) => void
The handler function
VoidFunction
A function to unsubscribe from the listener
// Track mouse movement and features under cursor
const unsubscribe = felt.onPointerMove({
handler: (event) => {
console.log("Mouse position:", event.center);
console.log("Features under cursor:", event.features);
}
});
// later on...
unsubscribe();
onLayerChange(
args
: {options
: {id
:string
; };handler
: (change
:LayerChangeCallbackParams
) =>void
; }):VoidFunction
Adds a listener for when a layer changes.
args
{ options
: { id
: string
; }; handler
: (change
: ) => void
; }
-
args.options
{ id
: string
; }
-
args.options.id
string
The id of the layer to listen for changes to.
args.handler
(change
: ) => void
The handler that is called when the layer changes.
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onLayerChange({
options: { id: "layer-1" },
handler: ({layer}) => console.log(layer.bounds),
});
// later on...
unsubscribe();
onLayerGroupChange(
args
: {options
: {id
:string
; };handler
: (change
:LayerGroupChangeCallbackParams
) =>void
; }):VoidFunction
Adds a listener for when a layer group changes.
args
{ options
: { id
: string
; }; handler
: (change
: ) => void
; }
args.options
{ id
: string
; }
args.options.id
string
args.handler
(change
: ) => void
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onLayerGroupChange({
options: { id: "layer-group-1" },
handler: ({layerGroup}) => console.log(layerGroup.id),
});
// later on...
unsubscribe();
onLegendItemChange(
args
: {options
:LegendItemIdentifier
;handler
: (change
:LegendItemChangeCallbackParams
) =>void
; }):VoidFunction
Adds a listener for when a legend item changes.
args
{ options
: ; handler
: (change
: ) => void
; }
args.options
args.handler
(change
: ) => void
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onLegendItemChange({
options: { layerId: "layer-1", id: "item-1-0" },
handler: ({legendItem}) => console.log(legendItem.visible),
});
// later on...
unsubscribe();
onLayerFiltersChange(
params
: {options
: {layerId
:string
; };handler
: (change
:LayerFilters
) =>void
; }):VoidFunction
Adds a listener for when a layer's filters change.
params
{ options
: { layerId
: string
; }; handler
: (change
: ) => void
; }
params.options
{ layerId
: string
; }
params.options.layerId
string
params.handler
(change
: ) => void
VoidFunction
A function to unsubscribe from the listener
This event fires whenever any type of filter changes on the layer, including ephemeral filters set via the SDK, style-based filters, or filters set through the Felt UI via Components.
const unsubscribe = felt.onLayerFiltersChange({
options: { layerId: "layer-1" },
handler: ({combined, ephemeral, style, components}) => {
console.log("Layer filters updated:", {
combined, // All filters combined
ephemeral, // Filters set via SDK
style, // Filters from layer style
components // Filters from UI components
});
},
});
// later on...
unsubscribe();
onLayerBoundariesChange(
params
: {options
: {layerId
:string
; };handler
: (boundaries
:null
|LayerBoundaries
) =>void
; }):VoidFunction
Adds a listener for when a layer's spatial boundaries change.
params
{ options
: { layerId
: string
; }; handler
: (boundaries
: null
| ) => void
; }
-
params.options
{ layerId
: string
; }
-
params.options.layerId
string
The id of the layer to listen for boundary changes on.
params.handler
(boundaries
: null
| ) => void
A function that is called when the boundaries change.
VoidFunction
A function to unsubscribe from the listener
This event fires whenever any type of spatial boundary changes on the layer, including ephemeral boundaries set via the SDK or boundaries set through the Felt UI via Spatial filter components.
const unsubscribe = felt.onLayerBoundariesChange({
options: { layerId: "layer-1" },
handler: ({combined, ephemeral, spatialFilters}) => {
console.log("Layer boundaries updated:", {
combined, // All boundaries combined
ephemeral, // Boundaries set via SDK
spatialFilters // Boundaries set via UI
});
},
});
// later on...
unsubscribe();
onSelectionChange(
params
: {handler
: (change
: {selection
:EntityNode
[]; }) =>void
; }):VoidFunction
Adds a listener for when the selection changes.
params
{ handler
: (change
: { selection
: []; }) => void
; }
params.handler
(change
: { selection
: []; }) => void
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onSelectionChange({
handler: ({selection}) => console.log(selection),
});
// later on...
unsubscribe();
onViewportMove(
args
: {handler
: (viewport
:ViewportState
) =>void
; }):VoidFunction
Adds a listener for when the viewport changes.
args
{ handler
: (viewport
: ) => void
; }
-
args.handler
(viewport
: ) => void
This callback is called with the current viewport state whenever the viewport changes.
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onViewportMove({
handler: viewport => console.log(viewport.center.latitude),
});
// later on...
unsubscribe();
onViewportMoveEnd(
args
: {handler
: (viewport
:ViewportState
) =>void
; }):VoidFunction
Adds a listener for when the viewport move ends, which is when the user stops dragging or zooming the map, animations have finished, or inertial dragging ends.
args
{ handler
: (viewport
: ) => void
; }
args.handler
(viewport
: ) => void
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onViewportMoveEnd({
handler: viewport => console.log(viewport.center.latitude),
});
// later on...
unsubscribe();
onMapIdle(
args
: {handler
: () =>void
; }):VoidFunction
Adds a listener for when the map is idle, which is defined as:
No transitions are in progress
The user is not interacting with the map, e.g. by panning or zooming
All tiles for the current viewport have been loaded
Any fade transitions (e.g. for labels) have completed
args
{ handler
: () => void
; }
args.handler
() => void
VoidFunction
A function to unsubscribe from the listener
const unsubscribe = felt.onMapIdle({ handler: () => console.log("map is idle") });
// later on...
unsubscribe();
readonly
iframe:null
|HTMLIFrameElement
The iframe element containing the Felt map, if it is an embedded map.