summaryrefslogtreecommitdiff
path: root/client/simple/src/js/main/mapresult.ts
blob: 421b41f77d449f46b8cf828c791a8750d78d22ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import { searxng } from "./00_toolkit.ts";

searxng.ready(
  () => {
    searxng.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 = parseFloat(mapLon || "0");
      const lat = parseFloat(mapLat || "0");
      const view = new View({ maxZoom: 16, enableRotation: false });
      const map = new OlMap({
        target,
        layers: [new TileLayer({ source: new OSM({ maxZoom: 16 }) })],
        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);
        }
      }
    });
  },
  { on: [searxng.endpoint === "results"] }
);