mirror of
https://github.com/searxng/searxng.git
synced 2026-07-18 14:01:24 +00:00
SPDX short-form identifiers to communicate license information in a simple, efficient, portable and machine-readable manner [1] [1] https://spdx.dev/learn/handling-license-info/
87 lines
2.0 KiB
TypeScript
87 lines
2.0 KiB
TypeScript
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
import { listen } from "../core/toolkit.ts";
|
|
|
|
listen("click", ".searxng_init_map", async function (this: HTMLElement, event: Event) {
|
|
event.preventDefault();
|
|
this.classList.remove("searxng_init_map");
|
|
|
|
const {
|
|
View,
|
|
OlMap,
|
|
TileLayer,
|
|
VectorLayer,
|
|
OSM,
|
|
VectorSource,
|
|
Style,
|
|
Stroke,
|
|
Fill,
|
|
Circle,
|
|
fromLonLat,
|
|
GeoJSON,
|
|
Feature,
|
|
Point
|
|
} = await import("../pkg/ol.ts");
|
|
import("ol/ol.css");
|
|
|
|
const { leafletTarget: target, mapLon, mapLat, mapGeojson } = this.dataset;
|
|
|
|
const lon = Number.parseFloat(mapLon || "0");
|
|
const lat = Number.parseFloat(mapLat || "0");
|
|
const view = new View({ maxZoom: 16, enableRotation: false });
|
|
const map = new OlMap({
|
|
target: target,
|
|
layers: [new TileLayer({ source: new OSM({ maxZoom: 16 }) })],
|
|
view: view
|
|
});
|
|
|
|
try {
|
|
const markerSource = new VectorSource({
|
|
features: [
|
|
new Feature({
|
|
geometry: new Point(fromLonLat([lon, lat]))
|
|
})
|
|
]
|
|
});
|
|
|
|
const markerLayer = new VectorLayer({
|
|
source: markerSource,
|
|
style: new Style({
|
|
image: new Circle({
|
|
radius: 6,
|
|
fill: new Fill({ color: "#3050ff" })
|
|
})
|
|
})
|
|
});
|
|
|
|
map.addLayer(markerLayer);
|
|
} catch (error) {
|
|
console.error("Failed to create marker layer:", error);
|
|
}
|
|
|
|
if (mapGeojson) {
|
|
try {
|
|
const geoSource = new VectorSource({
|
|
features: new GeoJSON().readFeatures(JSON.parse(mapGeojson), {
|
|
dataProjection: "EPSG:4326",
|
|
featureProjection: "EPSG:3857"
|
|
})
|
|
});
|
|
|
|
const geoLayer = new VectorLayer({
|
|
source: geoSource,
|
|
style: new Style({
|
|
stroke: new Stroke({ color: "#3050ff", width: 2 }),
|
|
fill: new Fill({ color: "#3050ff33" })
|
|
})
|
|
});
|
|
|
|
map.addLayer(geoLayer);
|
|
|
|
view.fit(geoSource.getExtent(), { padding: [20, 20, 20, 20] });
|
|
} catch (error) {
|
|
console.error("Failed to create GeoJSON layer:", error);
|
|
}
|
|
}
|
|
});
|