11import React , { useRef , useMemo , useEffect , useState , useContext } from "react" ;
22import * 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
610import { MapboxLayer } from "@deck.gl/mapbox" ;
711import { IconLayer } from "@deck.gl/layers" ;
812
913import DeckGlContext from "../../deckgl_components/DeckGlContext" ;
1014import getShipType from "./utils/getShipType" ;
11- import Ships from "./assets/Ships_v2.png" ;
12-
15+ import Ships from "./assets/Ships.png" ;
1316
1417const 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