|
1 | 1 | import { useEffect } from "preact/hooks";
|
2 | 2 | import MapLibreGL, { MapMouseEvent } from "maplibre-gl";
|
3 | 3 | import { AppActionTypes, AppDispatch, AppState } from "../reducer";
|
| 4 | +import MaplibreGeocoder from "@maplibre/maplibre-gl-geocoder"; |
| 5 | +import "@maplibre/maplibre-gl-geocoder/dist/maplibre-gl-geocoder.css"; |
4 | 6 |
|
5 | 7 | interface MapProps {
|
6 | 8 | appState: AppState;
|
@@ -162,6 +164,45 @@ export function Map(props: MapProps) {
|
162 | 164 | },
|
163 | 165 | });
|
164 | 166 |
|
| 167 | + const geocoderApi = { |
| 168 | + forwardGeocode: async (config: { query: string }) => { |
| 169 | + const features = []; |
| 170 | + try { |
| 171 | + const request = `https://nominatim.openstreetmap.org/search?q=${config.query}&format=geojson&polygon_geojson=1&addressdetails=1`; |
| 172 | + const response = await fetch(request); |
| 173 | + const geojson = await response.json(); |
| 174 | + for (const feature of geojson.features) { |
| 175 | + const center = [ |
| 176 | + feature.bbox[0] + (feature.bbox[2] - feature.bbox[0]) / 2, |
| 177 | + feature.bbox[1] + (feature.bbox[3] - feature.bbox[1]) / 2, |
| 178 | + ]; |
| 179 | + const point = { |
| 180 | + type: "Feature", |
| 181 | + geometry: { |
| 182 | + type: "Point", |
| 183 | + coordinates: center, |
| 184 | + }, |
| 185 | + place_name: feature.properties.display_name, |
| 186 | + properties: feature.properties, |
| 187 | + text: feature.properties.display_name, |
| 188 | + place_type: ["place"], |
| 189 | + center, |
| 190 | + }; |
| 191 | + features.push(point); |
| 192 | + } |
| 193 | + } catch (e) { |
| 194 | + // eslint-disable-next-line no-console |
| 195 | + console.error(`Failed to forwardGeocode with error: ${e}`); |
| 196 | + } |
| 197 | + |
| 198 | + return { |
| 199 | + features, |
| 200 | + }; |
| 201 | + }, |
| 202 | + }; |
| 203 | + |
| 204 | + map.addControl(new MaplibreGeocoder(geocoderApi, { zoom: 10 })); |
| 205 | + |
165 | 206 | function onClick(e: MapMouseEvent) {
|
166 | 207 | // @ts-expect-error - MapMouseEvent doesn't know about features
|
167 | 208 | const features = e.features as GeoJSON.Feature[];
|
|
0 commit comments