UNPKG

@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.95 kB
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.dev/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, }), };