Skip to content

Commit e7cae4f

Browse files
committed
change ship size depending on the zoom level | add flyTo animation when ship is clicked
1 parent b7f1ae4 commit e7cae4f

File tree

1 file changed

+40
-6
lines changed

1 file changed

+40
-6
lines changed

src/components/MlIconLayer/MlIconLayer.js

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
import React, { useRef, useMemo, useEffect, useState, useContext } from "react";
22
import * as d3 from "d3";
33

4-
import { MapContext, SimpleDataContext } from "@mapcomponents/react-maplibre";
4+
import {
5+
MapContext,
6+
SimpleDataContext,
7+
useMapState,
8+
} from "@mapcomponents/react-maplibre";
59

610
import { MapboxLayer } from "@deck.gl/mapbox";
711
import { IconLayer } from "@deck.gl/layers";
812

913
import DeckGlContext from "../../deckgl_components/DeckGlContext";
1014
import getShipType from "./utils/getShipType";
11-
import Ships from "./assets/Ships_v2.png";
12-
15+
import Ships from "./assets/Ships.png";
1316

1417
const navStats = {
1518
0: "under way using engine",
@@ -54,6 +57,10 @@ const MlIconLayer = ({
5457
const [hoverInfo, setHoverInfo] = useState({});
5558
const [vesselInfo, setVesselInfo] = useState();
5659

60+
const [size, setSize] = useState(30);
61+
const mapState = useMapState({ mapId: undefined, watch: { viewport: true } });
62+
// console.log(mapState?.viewport?.zoom);
63+
5764
const getVesselInfo = (mmsi) => {
5865
fetch("https://meri.digitraffic.fi/api/ais/v1/vessels/" + mmsi)
5966
.then((response) => {
@@ -96,8 +103,34 @@ const MlIconLayer = ({
96103
getVesselInfo(ev.object.mmsi);
97104
setSelectedVessel(ev.object);
98105
setHoverInfo({}); // Hide tooltip
106+
107+
if (mapContext.map) {
108+
const currentZoom = mapState?.viewport?.zoom;
109+
110+
// Only set zoom to 9 if the current zoom is less than or equal to 9
111+
const zoomLevel = currentZoom <= 9 ? 9 : currentZoom;
112+
113+
mapContext.map.flyTo({
114+
center: [ev.object.longitude, ev.object.latitude],
115+
zoom: zoomLevel,
116+
speed: 1,
117+
});
118+
}
99119
};
100120

121+
useEffect(() => {
122+
const zoom = mapState?.viewport?.zoom;
123+
if (zoom <= 6) {
124+
setSize(30);
125+
} else if (zoom <= 11) {
126+
setSize(50);
127+
} else if (zoom <= 15) {
128+
setSize(75);
129+
} else {
130+
setSize(100);
131+
}
132+
}, [mapState?.viewport?.zoom]);
133+
101134
const deckLayerProps = useMemo(() => {
102135
return {
103136
id: layerName,
@@ -112,7 +145,7 @@ const MlIconLayer = ({
112145
width: 512,
113146
height: 512,
114147
},
115-
other: {
148+
notmoving: {
116149
x: 512,
117150
y: 0,
118151
width: 512,
@@ -125,7 +158,7 @@ const MlIconLayer = ({
125158
height: 512,
126159
},
127160
},
128-
sizeScale: 30,
161+
sizeScale: size,
129162
autoHighlight: true,
130163
onHover: (d) => {
131164
if (d.picked) {
@@ -148,7 +181,7 @@ const MlIconLayer = ({
148181
if (selectedVessel && d.mmsi === selectedVessel.mmsi) {
149182
return "selected";
150183
}
151-
return d.navStat === 0 ? "moving" : "other";
184+
return d.velocity === 0 ? "notmoving" : "moving";
152185
},
153186
getAngle: (d) => -d.true_track,
154187
getTooltip: (d) => {
@@ -167,6 +200,7 @@ const MlIconLayer = ({
167200
selectedVessel,
168201
hoverInfo,
169202
vesselInfo,
203+
size,
170204
showMovingVessels,
171205
showNotMovingVessels,
172206
]);

0 commit comments

Comments
 (0)