Prefer this app's own GNSS receiver for "find my location"
LocateControl (public/js/locate.js) replaces MapLibre's own GeolocateControl -- same button, reusing its exact CSS/icon so it's a visual drop-in, but sourced differently. Checks GET /api/gnss/position once on click: if a fix is available (gpsd, possibly bin/gnss_simulator.rb's simulated one), tracks that instead of the browser's separate (and often less accurate) location service, which is now only a fallback. Only the first fix recenters the map; later updates just move the marker, unlike GeolocateControl's own default of recentering on every update, which would fight a pan/zoom made in the meantime. Verified end to end with the GNSS simulator running: clicking the button centered on the simulated position and dropped a marker, clicking again cleared both, no console errors.
This commit is contained in:
1 parent
64a85afe6a
commit
aec665179f
3 files changed
+176
-17
No files matched your search
+8
-10
@@ -1,7 +1,6 @@
|
||||
import {
|
||||
Map as MaplibreMap,
|
||||
NavigationControl,
|
||||
GeolocateControl,
|
||||
Popup,
|
||||
addProtocol,
|
||||
} from "/vendor/maplibre-gl/maplibre-gl.mjs";
|
||||
@@ -11,6 +10,7 @@ import { GnssControl } from "/js/gnss.js";
|
||||
import { LiveTrackPanelControl } from "/js/livetrack.js";
|
||||
import { TrackProfilePanel } from "/js/track_profile.js";
|
||||
import { MeasureControl } from "/js/measure.js";
|
||||
import { LocateControl } from "/js/locate.js";
|
||||
import { LAYERS_ICON } from "/js/icons.js";
|
||||
import { notifySidePanelOpen, onlyOneSidePanelOpen } from "/js/panels.js";
|
||||
import HomeButton from "/vendor/npmap-home-button/home-button.esm.js";
|
||||
@@ -349,7 +349,7 @@ const map = new MaplibreMap({
|
||||
// above), "current view" and "the default view" are no longer the same
|
||||
// thing, and a home button that resets to wherever you happened to load
|
||||
// the page wouldn't be a home button. This is *not* "go to my location" —
|
||||
// that's GeolocateControl, below.
|
||||
// that's LocateControl, below.
|
||||
const SLOVAKIA_BOUNDS = [
|
||||
[16.83, 47.73],
|
||||
[22.57, 49.61],
|
||||
@@ -360,14 +360,12 @@ map.addControl(new HomeButton({ bounds: SLOVAKIA_BOUNDS }), "top-left");
|
||||
map.addControl(new NavigationControl({ showCompass: false }), "top-left");
|
||||
map.addControl(new ZoomLevelControl(), "top-left");
|
||||
map.addControl(new MeasureControl(), "top-left");
|
||||
map.addControl(
|
||||
new GeolocateControl({
|
||||
positionOptions: { enableHighAccuracy: true },
|
||||
trackUserLocation: true,
|
||||
showAccuracyCircle: true,
|
||||
}),
|
||||
"top-left",
|
||||
);
|
||||
// Not MapLibre's own GeolocateControl (browser Geolocation API only) —
|
||||
// this app has its own GNSS receiver (gpsd, possibly a simulated one, see
|
||||
// bin/gnss_simulator.rb) and "find my location" should prefer that over a
|
||||
// device's separate, often less accurate location service when it has a
|
||||
// fix. See locate.js.
|
||||
map.addControl(new LocateControl(), "top-left");
|
||||
|
||||
// A small inset map showing where the current view sits in context — NPS's
|
||||
// own overview plugin (docs/nps-resources.adoc's "overview" entry, still on
|
||||
|
||||
Reference in new issue
Block a user