@trailstash/ultra
Version:
A web based tool for making MapLibre GL maps with data from sources such as Overpass, GeoJSON, GPX, KML, TCX, etc
61 lines (58 loc) • 1.82 kB
JavaScript
import { layers, popupTemplate } from "./osm.js";
const popupContextBuilder = ({ properties, geometry }) => {
const templateContext = {
id: properties["@osmId"].split("/")[1],
type: properties["@osmType"],
meta: {
changeset: properties["@changesetId"],
version: properties["@version"],
lastEdit: properties["@lastEdit"],
snapshotTimestamp: properties["@snapshotTimestamp"],
},
tags: { ...properties },
};
delete templateContext.tags["@osmId"];
delete templateContext.tags["@osmType"];
delete templateContext.tags["@changesetId"];
delete templateContext.tags["@version"];
delete templateContext.tags["@lastEdit"];
delete templateContext.tags["@snapshotTimestamp"];
if (properties["@type"] === "node") {
templateContext.coordinates = geometry.coordinates;
}
return templateContext;
};
const ohsome = {
source: async function (query, controller, { server, bounds }) {
if (!server) {
server = "https://api.ohsome.org/v1";
}
const body = new FormData();
body.append(
"bboxes",
`${bounds.getWest()},${bounds.getSouth()},${bounds.getEast()},${bounds.getNorth()}`,
);
body.append("filter", query);
body.append("properties", "tags,metadata");
const resp = await fetch(`${server}/elements/geometry`, {
method: "POST",
body,
});
if (!resp.ok) {
throw new Error(`Ohsome API returned ${resp.status}`);
}
const data = await resp.json();
return {
type: "geojson",
data,
attribution:
'\u003Ca href="https://www.openstreetmap.org/copyright" target="_blank"\u003E© OpenStreetMap contributors\u003C/a\u003E',
generateId: true,
};
},
layers,
popupTemplate,
popupContextBuilder,
invalidateCacheOnBBox: true,
};
export default ohsome;