aboutsummaryrefslogtreecommitdiff
path: root/modern/src/map
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2021-09-04 19:52:16 -0700
committerAnton Tananaev <anton.tananaev@gmail.com>2021-09-04 19:52:16 -0700
commit9c1f8d9d23167cfac1c9d923e56eebbeb50c0d94 (patch)
tree428ac49bd454f13e6cbc15989f3d35e2d2c34893 /modern/src/map
parenteb8d026e884c83e93163a2d13dd5cbcd88ada869 (diff)
downloadetbsa-traccar-web-9c1f8d9d23167cfac1c9d923e56eebbeb50c0d94.tar.gz
etbsa-traccar-web-9c1f8d9d23167cfac1c9d923e56eebbeb50c0d94.tar.bz2
etbsa-traccar-web-9c1f8d9d23167cfac1c9d923e56eebbeb50c0d94.zip
Implement POI support
Diffstat (limited to 'modern/src/map')
-rw-r--r--modern/src/map/PoiMap.js71
1 files changed, 71 insertions, 0 deletions
diff --git a/modern/src/map/PoiMap.js b/modern/src/map/PoiMap.js
new file mode 100644
index 0000000..919805e
--- /dev/null
+++ b/modern/src/map/PoiMap.js
@@ -0,0 +1,71 @@
+import { useEffect, useState } from 'react';
+import { kml } from '@tmcw/togeojson';
+
+import { map } from './Map';
+import { useEffectAsync } from '../reactHelper';
+import { usePreference } from '../common/preferences';
+
+const PoiMap = () => {
+ const id = 'poi';
+
+ const poiLayer = usePreference('poiLayer');
+
+ const [data, setData] = useState(null);
+
+ useEffectAsync(async () => {
+ if (poiLayer) {
+ const file = await fetch(poiLayer);
+ const dom = new DOMParser().parseFromString(await file.text(), 'text/xml');
+ setData(kml(dom));
+ }
+ }, [poiLayer]);
+
+ useEffect(() => {
+ if (data) {
+ map.addSource(id, {
+ type: 'geojson',
+ data,
+ });
+ map.addLayer({
+ source: id,
+ id: 'poi-point',
+ type: 'circle',
+ paint: {
+ 'circle-radius': 5,
+ 'circle-color': '#3bb2d0',
+ },
+ });
+ map.addLayer({
+ source: id,
+ id: 'poi-title',
+ type: 'symbol',
+ layout: {
+ 'text-field': '{name}',
+ 'text-anchor': 'bottom',
+ 'text-offset': [0, -0.5],
+ 'text-font': ['Roboto Regular'],
+ 'text-size': 12,
+ },
+ paint: {
+ 'text-halo-color': 'white',
+ 'text-halo-width': 1,
+ },
+ });
+ return () => {
+ if (map.getLayer('poi-point')) {
+ map.removeLayer('poi-point');
+ }
+ if (map.getLayer('poi-title')) {
+ map.removeLayer('poi-title');
+ }
+ if (map.getSource(id)) {
+ map.removeSource(id);
+ }
+ };
+ }
+ }, [data]);
+
+ return null;
+};
+
+export default PoiMap;