svelte-maplibre-gl
Version:
Build interactive web maps effortlessly with MapLibre GL JS and Svelte
80 lines (79 loc) • 2.35 kB
JavaScript
let layerIdCounter = 0;
let sourceIdCounter = 0;
export function generateLayerID() {
return `svmlgl-layer-${layerIdCounter++}`;
}
export function generateSourceID() {
return `svmlgl-source-${sourceIdCounter++}`;
}
/**
* Set an event listener on an Evented object, and return a function that will remove the listener.
*
* Intended to be used within the $effect rune.
*/
export function resetEventListener(evented, type, listener) {
if (listener) {
evented?.on(type, listener);
}
const prevListener = listener;
return () => {
if (prevListener) {
evented?.off(type, prevListener);
}
};
}
/**
* Set a Layer event listener on the Map object, and return a function that will remove the listener.
*
* Intended to be used within the $effect rune.
*/
export function resetLayerEventListener(map, type, layer, listener) {
if (listener) {
map?.on(type, layer, listener);
}
const prevListener = listener;
return () => {
if (prevListener) {
map?.off(type, layer, prevListener);
}
};
}
/**
* Returns whichever object actually carries MapLibre's internal camera state,
* so the same call sites work on both MapLibre 5.x and 6.x. See {@link MapCamera}.
*/
export function getCamera(map) {
const m = map;
return m._camera ?? m;
}
/**
* Reads the pending "desired state" camera transform, bridging the 5.x
* `_getTransformForUpdate()` / 6.x `getTransformForUpdate()` rename.
*/
export function getUpdateTransform(camera) {
const resolve = camera.getTransformForUpdate ?? camera._getTransformForUpdate;
if (!resolve) {
throw new Error('svelte-maplibre-gl: neither getTransformForUpdate nor _getTransformForUpdate is available on the map camera');
}
return resolve.call(camera);
}
export function setTransformCameraUpdate(map, value) {
const m = map;
if (m.setTransformCameraUpdate) {
m.setTransformCameraUpdate(value);
}
else {
getCamera(map).transformCameraUpdate = value;
}
}
export function formatLngLat(target, lnglat) {
if (Array.isArray(target)) {
return [lnglat.lng, lnglat.lat];
}
else if ('lon' in target) {
return { lon: lnglat.lng, lat: lnglat.lat };
}
else {
return { lng: lnglat.lng, lat: lnglat.lat };
}
}