@trailstash/ultra
Version:
A web based tool for making MapLibre GL maps with data from sources such as Overpass, GeoJSON, GPX, KML, TCX, etc
76 lines (67 loc) • 1.97 kB
JavaScript
import { layers } from "./osm.js";
import sparql2geojson from "../sparql2geojson.js";
export const popupTemplate = `
<h3>columns</h3>
{%- for prop in properties %}
{%- if prop[0] startswith "https://" %}
<code>{{ prop[0] }} = <a href="{{ prop[1] }}" target="_blank">{{ prop[1] }}</a></code>
{%- else %}
<code>{{ prop[0] }} = {{ prop[1] }}</code>
{%- endif %}
<br>
{%- endfor %}
`;
const SOPHOX = "https://sophox.org/sparql";
const QLEVER_ROOT = "https://qlever.cs.uni-freiburg.de/api/";
const OSM_SERVERS = new Set([
new URL("osm-planet", QLEVER_ROOT).toString(),
SOPHOX,
]);
const source = async function (query, controller, { server, bounds }) {
if (!server) {
throw new Error("No SPARQL server endpoint specified");
}
const resp = await fetch(server, {
method: "POST",
body: new URLSearchParams([["query", query]]),
signal: controller.signal,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Accept: "application/sparql-results+json",
},
});
if (!resp.ok) {
throw new Error(`SPARQL API returned ${resp.status}: ${await resp.text()}`);
}
const data = sparql2geojson(await resp.json());
let attribution = "";
if (OSM_SERVERS.has(server)) {
attribution =
'\u003Ca href="https://www.openstreetmap.org/copyright" target="_blank"\u003E© OpenStreetMap contributors\u003C/a\u003E';
}
return {
type: "geojson",
data,
attribution,
generateId: true,
};
};
export const sparql = {
source,
layers,
popupTemplate,
};
export default sparql;
export const sophox = {
...sparql,
source: (query, controller, { server, bounds }) =>
source(query, controller, { server: server || SOPHOX, bounds }),
};
export const qlever = {
...sparql,
source: (query, controller, { server, bounds }) =>
source(query, controller, {
server: new URL(server || "osm-planet", QLEVER_ROOT).toString(),
bounds,
}),
};