@trailstash/ultra
Version:
A web based tool for making MapLibre GL maps with data from sources such as Overpass, GeoJSON, GPX, KML, TCX, etc
64 lines (60 loc) • 1.8 kB
JavaScript
import { layers } from "./osm.js";
export const popupTemplate = `
{%- if osm_type and osm_id %}
{%- if osm_type == "N" %}{% assign type = "node" %}
{%- elsif osm_type == "W" %}{% assign type = "way" %}
{%- elsif osm_type == "R" %}{% assign type = "relation" %}
{%- else %}{% assign type = osm_type %}
{%- endif %}
<h2>
{{ osm_type }}
<a href="https://openstreetmap.org/{{ type }}/{{ osm_id }}" target="_blank">{{ osm_id }}</a>
<a href="https://openstreetmap.org/edit?{{ type }}={{ osm_id }}" target="_blank">✏️</a>
</h2>
{%- endif %}
{%- for prop in properties %}
<code>{{ prop[0] }} = {{ prop[1] | json }}</code>
<br>
{%- endfor %}
`;
export const popupContextBuilder = ({ properties }) => {
const { osm_id, osm_type, ...rest } = properties;
return {
osm_id,
osm_type,
properties: Object.entries(rest),
};
};
const postpass = {
source: async function (query, controller, { server }) {
if (!server) {
server = "https://postpass.geofabrik.de/api/0.2/interpreter";
}
const resp = await fetch(server, {
method: "POST",
body: new URLSearchParams([["data", query]]),
signal: controller.signal,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json",
},
});
if (!resp.ok) {
throw new Error(
`Postpass API returned ${resp.status}:\n${await resp.text()}`,
);
}
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,
};
export default postpass;