diff options
author | Anton Tananaev <anton@traccar.org> | 2022-06-12 06:30:41 -0700 |
---|---|---|
committer | Anton Tananaev <anton@traccar.org> | 2022-06-12 06:30:41 -0700 |
commit | 127a8bfc5df8cbe66d5f60023fcf983e15ee13e8 (patch) | |
tree | 4df390424bd2671851fcb69121d4db36be757be9 /modern/src/map | |
parent | e7995f3b7a6b0828b81bebaf556ef7afb59bef61 (diff) | |
download | trackermap-web-127a8bfc5df8cbe66d5f60023fcf983e15ee13e8.tar.gz trackermap-web-127a8bfc5df8cbe66d5f60023fcf983e15ee13e8.tar.bz2 trackermap-web-127a8bfc5df8cbe66d5f60023fcf983e15ee13e8.zip |
Support map overlays
Diffstat (limited to 'modern/src/map')
-rw-r--r-- | modern/src/map/overlay/MapOverlay.js | 39 | ||||
-rw-r--r-- | modern/src/map/overlay/useMapOverlays.js | 29 |
2 files changed, 68 insertions, 0 deletions
diff --git a/modern/src/map/overlay/MapOverlay.js b/modern/src/map/overlay/MapOverlay.js new file mode 100644 index 00000000..ec51c7c9 --- /dev/null +++ b/modern/src/map/overlay/MapOverlay.js @@ -0,0 +1,39 @@ +import { useEffect } from 'react'; +import usePersistedState from '../../common/util/usePersistedState'; +import { map } from '../core/MapView'; +import useMapOverlays from './useMapOverlays'; + +const MapOverlay = () => { + const id = 'overlay'; + + const mapOverlays = useMapOverlays(); + const [selectedMapOverlay] = usePersistedState('selectedMapOverlay'); + + const activeOverlay = mapOverlays.filter((overlay) => overlay.available).find((overlay) => overlay.id === selectedMapOverlay); + + useEffect(() => { + if (activeOverlay) { + map.addSource(id, activeOverlay.source); + map.addLayer({ + id, + type: 'raster', + source: id, + layout: { + visibility: 'visible', + }, + }); + } + return () => { + if (map.getLayer(id)) { + map.removeLayer(id); + } + if (map.getSource(id)) { + map.removeSource(id); + } + }; + }); + + return null; +}; + +export default MapOverlay; diff --git a/modern/src/map/overlay/useMapOverlays.js b/modern/src/map/overlay/useMapOverlays.js new file mode 100644 index 00000000..ede1e5b9 --- /dev/null +++ b/modern/src/map/overlay/useMapOverlays.js @@ -0,0 +1,29 @@ +import { useSelector } from 'react-redux'; +import { useTranslation } from '../../common/components/LocalizationProvider'; + +const sourceCustom = (url) => ({ + type: 'raster', + tiles: [url], + tileSize: 256, +}); + +export default () => { + const t = useTranslation(); + + const customMapOverlay = useSelector((state) => state.session.server?.overlayUrl); + + return [ + { + id: 'openSeaMap', + title: t('mapOpenSeaMap'), + source: sourceCustom('http://tiles.openseamap.org/seamark/{z}/{x}/{y}.png'), + available: true, + }, + { + id: 'custom', + title: t('mapOverlayCustom'), + source: sourceCustom(customMapOverlay), + available: !!customMapOverlay, + }, + ]; +}; |