24 KiB
FacilMap client API
Properties
All objects that are received from the server are cached in properties of the client object.
All objects that can be part of a map have an id
. Note that when an object is updated, the whole object is replaced in
these properties, so be careful to not cache outdated versions of objects:
let myMarker = client.markers[myMarkerId];
setTimeout(() => {
// Bad! A client.markers[myMarkerId] might have been replaced if the marker
// has been changed in the meantime, and we are using the old version.
doSomethingWithMarker(myMarker);
}, 10000);
setTimeout(() => {
// Better! Always get objects directly from the client cache.
doSomethingWithMarker(client.markers[myMarkerId]);
});
// If you need to keep an object copy, make sure to keep it updated
client.on("marker", (marker) => {
if(marker.id == myMarkerId)
myMarker = marker;
});
padId
The ID under which the client is connected to the map. Can be the read-only or a read-write ID of an existing map.
Note that the ID can be changed in the settings. If in case of a padData
event, the ID of the pad has
changed, this property is updated automatically.
Type: string
readonly
true
if the map has been opened using its read-only ID. false
if the map is writable.
Type: boolean
writable
2
if the map has been opened using its admin ID, 1
if if has been opened using the writable ID, 0
if the map is read-only.
Type: number
padData
The current settings of the map. writeId
and/or adminId
is null if if has been opened using another ID than the admin ID.
Type: padData
markers
All markers that have been retrieved so far.
Type: {"<marker id>":
marker
}
lines
All lines and their track points that have been retrieved so far.
Type: {"<line id>":
line with trackPoints
}
views
All views that have been retrieved so far.
Type: {"<view id>":
view
}
types
All types that have been retrieved so far.
Type: {"<type id>":
type
}
history
All history entries that have been retrieved so far. Note that you have to subscribe to the history using
listenToHistory()
.
Type: {"<entry id>":
historyEntry
}
route
Information about the temporary route set using setRoute()
.
Type: route
serverError
If the opening the pad failed (setPadId(padId)
promise got rejected), the error message is stored
in this property.
Events
Subscribe to events using the on(eventName, function)
method. Example:
let client = new FacilMap.Client("https://facilmap.org/", "testPad");
client.on("padData", (padData) => {
document.title = padData.name;
});
connect
, connect_error
, connect_timeout
, reconnect
, reconnect_attempt
, reconnecting
, reconnect_error
, reconnect_failed
These events come from socket.io and are documented there under the section “Events”.
padData
The settings of the map have changed or are retrieved for the first time.
Note that when this event is fired, the read-only and/or the read-write ID of the map might have changed. The padId
property is updated automatically.
Type: padData
marker
An existing marker is retrieved for the first time, has been modified, or a new marker has been created in the current bbox.
Type: marker
deleteMarker
A marker has been removed. This event is emitted for all markers in the map, even if they are outside of the current bbox (in case that a marker outside of the current bbox is cached).
Type: {id: "<markerId>"}
line
An existing line is retrieved for the first time, has been modified, or a new line has been created. Note that line
objects only contain the line metadata, not its track points (those are handled separately as linePoints
). This is why
all line objects of the map are sent to the client, regardless of the current bbox.
Type: line without trackPoints
deleteLine
A line has been removed.
Type: {id: "<lineId>"}
linePoints
New track points for an existing line are retrieved after a change of bbox (reset == false
), or the line has been
modified, so the new track points are retrieved (reset == true
).
Type: {
- id (number): The ID of the line that these track points belong to
- reset (boolean): Whether to remove all cached track points for this line (
true
) or to merge these track points with the cached ones (false
). - trackPoints (Array<trackPoint>): The track points
}
view
A view is retrieved for the first time, has been modified, or a new view has been created.
Type: view
deleteView
A view has been removed.
Type: {id: "<viewId>"}
type
A type is retrieved for the first time, has been modified, or a new type has been created.
Type: type
deleteType
A type has been removed.
Type: {id: "<typeId>"}
history
An entry of the modification history is retrieved for the first time, or a new entry has been created due to something
being modified. Note that this event is only fired when the client has subscribed using listenToHistory()
.
Type: historyEntry
routePoints
New track points for the temporary route are retrieved after a change of bbox.
Type: Array<trackPoint>
loadStart
, loadEnd
This event is fired every time some request is sent to the server and when the response has arrived. It can be used to display a loading indicator to the user. Note that multiple things can be loading at the same time. Example code:
let loading = 0;
client.on("loadStart", () => {
++loading;
showLoadingIndicator();
});
client.on("loadEnd", () => {
if(--loading == 0)
hideLoadingIndicator();
});
Methods
constructor(server, padId)
Connects to the FacilMap server server
and optionally opens the collaborative map with the ID padId
. If the pad ID
is not set, it can be set later using setPadId(padId)
or using createPad(data)
.
Setting the padId causes the server to send several objects, such as the map settings, all views, all types, and all lines (just meta data, without line points).
If the connection to the server breaks down, a disconnect
event will be emitted and socket.io will attempt to reconnect.
On successful reconnection, a reconnect
and connect
event will be fired.
server
(string): The URL of the FacilMap server, for examplehttps://facilmap.org/
padId
(string, optional): The ID of the collaborative map to open
on(eventName, function)
Registers a new event handler.
eventName
(string): The name of the eventfunction
(function): The function that should be executed when the event occurs. If the event emits an object, it will be passed to the function as the first parameter.
removeListener(eventName, function)
Unregisters an event handler previously assigned using on(eventName, function)
.
eventName
(string): The name of the eventfunction
(function): The function that was passed toon(eventName, function)
when registering the handler
setPadId(padId)
Opens the collaborative map with the ID padId
.
This method can only be called once, and only if no padId
has been passed to the constructor. If you want to open
a different map, you need to create a new instance of the client.
Setting the padId causes the server to send several objects, such as the map settings, all views, and all lines (just meta data, without line points).
padId
(string): The ID of the collaborative map to open- returns (Promise): A promise that resolves when all objects have been received.
updateBbox(bbox)
Updates the bbox. This will cause all markers and line points within the bbox (except the ones that were already in the previous bbox, if there was one) to be received.
- bbox (bbox with zoom): The bbox that objects should be received for
- returns (Promise): A promise that resolves when all objects have been received.
createPad(data)
Creates a new collaborative map.
data
(padData): The data of the new map, including the desired read-only and writable ID- returns (Promise): A promise that resolves when the map has been created, returning the new padData.
editPad(data)
data
(padData): The data of the map that should be modified. Fields that are not defined will not be modified. To change the default view, set thedefaultViewId
property. ThedefaultView
property is ignored.- returns (Promise): The new padData.
listenToHistory()
Start listening to the modification history of the map. Calling this will cause multiple history
objects to be
received (that describe the modification history until now), and new history
objects will be received every time
something is modified (in addition to the modified object).
- returns (Promise): A promise that resolves when all history objects have been received
stopListeningToHistory()
Stop listening to the modification history of the map.
- returns (Promise): A promise that resolves when the command has completed.
revertHistoryEntry(data)
Undo a modification in the map. When a previously removed object is restored, it receives a new ID, and thus the object
IDs of all other history entries connected to this object are updated as well. This is why reverting a history entry
will cause the whole history to be received again (as if you were calling listenToHistory()
again).
data
({id: "<historyEntryId>"}
)): The history object that should be reverted- returns (Promise): A promise that resolves when the command has completed and all new history objects have been received
disconnect()
Empties all cached objects and disconnects from the server.
find(data)
Search for places.
data
(object): An object with the following properties:query
(string): The query stringloadUrls
(boolean): Whether to return the file ifquery
is a URLelevation
(boolean): Whether to find out the elevation of the result(s). Will make the search significantly slower.
- returns (Promise<string|Array<searchResult>>): If
data.query
is a URL to a GPX/KML/OSM/GeoJSON file, that file as a string, otherwise an array of search results.
getRoute(data)
Calculate a route between two or more points.
data
(object): An object with the following properties:destinations
(array): An array of at least two route points (objects with alat
andlon
property)mode
(string):"car"
,"bicycle"
or"pedestrian"
- returns (Promise<route>)
setRoute(data)
Calculate a route between two or more points, but but do not return the track points of the route but cache them on the
server side and send them according to the client bbox. The properties of the route are saved in the route
property and the trackPoints in route.trackPoints
. Only one temporary route like this can be set at a time, when
calling setRoute()
again, the existing route will be modified.
data
(object): An object with the following properties:routePoints
(array): An array of at least two route points (objects with alat
andlon
property)mode
(string):"car"
,"bicycle"
or"pedestrian"
elevation
(boolean):true
to get elevation data for the route
- returns (Promise<route>)
clearRoute()
Clear the temporary route set via setRoute(data)
.
- returns (Promise)
lineToRoute(data)
Call setRoute()
with the parameters of an existing line. Saves time, as the route does not need to be
recalculated.
data
(object): An object with the following properties:id
(string): The ID of the line
- returns (Promise<route>)
addMarker(data)
Create a marker.
data
(marker): The data of the marker to create. Anid
will be assigned by the server- returns (Promise<marker>): The marker as it is on the server, with an
id
assigned and possibly its styles modified by the settings of its type.
editMarker(data)
Update an existing marker.
data
(marker). The new marker data. Fields that are not defined will not be unmodified. Onlyid
needs to be defined.- returns (Promise<marker>): The new marker. Might have some styles modified due to the settings of its type
deleteMarker(data)
Delete an existing marker
data
({id: <markerId>}
): An object that contains the ID of the marker to be removed- returns (Promise): A promise that resolves when the operation has completed
getLineTemplate(data)
Get a fake line object for a line with the given type. This can be used so that while the user is drawing a new line, that line already has the right style.
data
({typeId: <typeId>}
): An object containing the type ID- returns (Promise<line): A fake line object with the styles of this type
addLine(data)
Create a line.
data
(line): The data of the line to create. Anid
will be assigned by the server- returns (Promise<line>): The line as it is on the server, with an
id
assigned and possibly its styles modified by the settings of its type.
editLine(data)
Update an existing line.
data
(line). The new line data. Fields that are not defined will not be unmodified. Onlyid
needs to be defined.- returns (Promise<line>): The new line. Might have some styles modified due to the settings of its type
deleteLine(data)
Delete an existing line
data
({id: <lineId>}
): An object that contains the ID of the line to be removed- returns (Promise): A promise that resolves when the operation has completed
addType(data)
Create a type.
data
(type): The data of the type to create. Anid
will be assigned by the server- returns (Promise<type>): The type as it is on the server, with an
id
assigned.
editType(data)
Update an existing type.
data
(type). The new type data. Fields that are not defined will not be unmodified. Onlyid
needs to be defined. To rename a field, set theoldName
property of the field object to the previous name and thename
property to the new name. To rename a dropdown entry, set theoldValue
property to the old value and thevalue
property to the new value.- returns (Promise<type>): The new type.
deleteType(data)
Delete an existing type
data
({id: <typeId>}
): An object that contains the ID of the type to be removed- returns (Promise): A promise that resolves when the operation has completed
addView(data)
Create a view.
data
(view): The data of the view to create. Anid
will be assigned by the server- returns (Promise<view>): The view as it is on the server, with an
id
assigned.
editView(data)
Update an existing view.
data
(view). The new view data. Fields that are not defined will not be unmodified. Onlyid
needs to be defined.- returns (Promise<view>): The new view.
deleteView(data)
Delete an existing view
data
({id: <viewId>}
): An object that contains the ID of the view to be removed- returns (Promise): A promise that resolves when the operation has completed
Types
bbox
A bounding box that describes which part of the map the user is currently viewing.
top
(number, min: -90, max: 90): The latitude of the north end of the boxbottom
(number, min: -90, max: 90): The latitude of the south end of the boxleft
(number, min: -180, max: 180): The longitude of the west end of the boxright
(number, min: -180, max: 180): The longitude of the east end of the boxzoom
(number, min: 1, max: 20): The current zoom level. This is relevant for the density of track points that should be received.
marker
id
(number): The ID of this markerlat
(number, min: -90, max: 90): The latitude of this markerlon
(number, min: -90, max: 90): The longitude of this markername
(string): The name of this markercolour
(string): The colour of this marker as a 6-digit hex value, for exampleff0000
size
(number, min: 15): The height of the marker in pixelssymbol
(string): The symbol code for the marker. Default is an empty string.elevation
(number): The elevation of this marker in metres (set by the server)typeId
(number): The ID of the type of this markerdata
({"key", "value"}
): The filled out form fields of the marker
line
Each line has routePoints
and trackPoints
. The routePoints
are the start, end and via points that the user created
for that line, the trackPoints
describe how the line should be drawn. If no routing is used, routePoints
and
trackPoints
are equal, but with routing, there will be a lot more trackPoints
than routePoints
.
When creating or updating a line, the trackPoints
, distance
and time
properties are automatically calculated by
the server. Only when the routing mode is track
, the trackPoints
can be specified by hand (meant for importing
existing tracks, for example from a GPX file). The idx
, zoom
and ele
properties of the track points are added by
the server automatically.
Note that line
objects coming from the server don’t contain the trackPoints
property, but the track points are sent
separately through linePoints
events.
id
(number): The ID of this lineroutePoints
([{lat, lon}]
): The route pointsmode
(string): The routing mode, an empty string for no routing, orcar
,bicycle
,pedestrian
, ortrack
colour
(string): The colour of this marker as a 6-digit hex value, for example0000ff
width
(number, min: 1): The width of the linename
(string): The name of the linedistance
(number): The distance of the line in kilometers (set by the server)ascent
,descent
(number): The total ascent/descent of the line in metres (set by the server)time
(number): The time it takes to travel the route in seconds (only if routing mode iscar
,bicycle
orpedestrian
) (set by the server)typeId
(number): The ID of the type of this linedata
({"key", "value"}
): The filled out form fields of the linetrackPoints
:- In the
lines
property of the client, an object of the format{"<idx>": trackPoint}
- When creating/updating a line with the routing mode
track
, an array of the format[trackPoint]
- In the
trackPoint
All track points have a zoom
level and are only received when the zoom level of the current bbox is at least that
level. This makes sure that at a small zoom level, only a low resolution of the line has to be downloaded. When zooming
in, only the additional track points are retrieved. They can be merged into the already retrieved track points using
their idx
property.
idx
(number): The index of this track point in the list of all track points of this linelat
(number, min: -90, max: 90): The latitude of this pointlon
(number, min: -180, max: 180): The longitude of this pointzoom
(number, min: 1, max: 20): The miminum zoom level from which this track point makes sense to showele
(number): The elevation of this track point in metres (set by the server). Not set for high zoom levels.
padData
id
(string): The read-only ID of this mapwriteId
(string): The read-write ID of this mapadminId
(string): The admin ID of this mapname
(string): The name of this mapsearchEngines
(boolean): Whether search engines may index the read-only version of this mapdescription
(string): The description for search enginesdefaultViewId
(number): The ID of the default view (if any)defaultView
(view): A copy of the default view object
view
id
(number): The ID of this viewname
(string): The name of this viewbaseLayer
(string): The key of the base layer in this viewlayers
([string]): An array of activated overlays in this viewtop
,bottom
,left
,right
: The bbox of this viewfilter
(string): If set, filter the objects according to this filtrex expression
historyEntry
id
(number): The ID of this history entrytime
(Date): The time when the modification was donetype
(string): The type of object that was modified, one ofMarker
,Line
,View
,Type
,Pad
action
(string): The action that was done, one ofcreate
,update,
delete`objectId
(number): The ID of the object that was modified (null if the object was the map itself)objectBefore
(object): The object before the modification (null ifaction
iscreate
)objectAfter
(object): The object after the modification (null ifaction
isdelete
)
type
id
(number): The ID of this typename
(string): The name of this typetype
(string):marker
orline
defaultColour
,defaultSize
,defaultSymbol
,defaultWidth
,defaultMode
(string/number): Default values for the different object propertiescolourFixed
,sizeFixed
,symbolFixed
,widthFixed
,modeFixed
(boolean): Whether those values are fixed and cannot be changed for an individual objectfields
([object]): The form fields for this type. Each field has the following properties:name
(string): The name of the field. This is at the same time the key in thedata
properties of markers and linesoldName
(string): When renaming a field (usingeditType(data)
), specify the former name heretype
(string): The type of field, one oftextarea
,dropdown
,checkbox
,input
controlColour
,controlSize
,controlSymbol
,controlWidth
(boolean): If this field is a dropdown, whether the different options set a specific property on the objectdefault
(string/boolean): The default value of this fieldoptions
([object]): If this field is a dropdown, an array of objects with the following properties:value
(string): The value of this option.oldValue
(string): When renaming a dropdown option (usingeditType(data)
), specify the former value herecolour
,size
,symbol
,width
(string/number): The property value if this field controls that property
searchResult
short_name
(string): Short display name of the resultdisplay_name
(string): Long display name of the resultboundingbox
(bbox): bbox that has a good view onto the result. Might be null ifzoom
is set.lat
,lon
(number): Position of the search result.zoom
(number): Zoom level at which there is a good view onto the result. Might be null ifboundingbox
is set.extratags
(object): Extra OSM tags that might be usefulgeojson
(object): GeoJSON if the result has a shapeicon
(string): Symbol key of the resulttype
(string): Type of the resultid
(string): If the result is an OSM object, the ID of the OSM object, prefixed byn
(node),w
(way) orr
(relation)ele
(number): Elevation in meters
route
routePoints
(array): Array of route points (objects withlon
andlat
properties)mode
(string): Route mode:"car"
,"bicycle"
,"pedestrian"
or an empty string""
for a direct linetrackPoints
(array): An array of track points (objects with alon
,lat
,ele
,idx
property and also azoom
property that indicates from which zoom level the track point should be shown (to avoid an unnecessarily high resolution))distance
(number): The distance of the route in kilometerstime
(number): The time it takes to travel the route in secondsascent
(number): The total meters of climbdescent
(number) The total meters of drop