leaflet#LayersControlEvent TypeScript Examples
The following examples show how to use
leaflet#LayersControlEvent.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: index.tsx From aqualink-app with MIT License | 4 votes |
HomepageMap = ({
initialCenter,
initialZoom,
initialBounds,
collection,
showAlertLevelLegend,
showWaterMark,
geolocationEnabled,
defaultLayerName,
legendBottom,
legendLeft,
classes,
}: HomepageMapProps) => {
const [legendName, setLegendName] = useState<string>(defaultLayerName || "");
const [currentLocation, setCurrentLocation] = useState<[number, number]>();
const [currentLocationAccuracy, setCurrentLocationAccuracy] =
useState<number>();
const [currentLocationErrorMessage, setCurrentLocationErrorMessage] =
useState<string>();
const loading = useSelector(sitesListLoadingSelector);
const searchResult = useSelector(searchResultSelector);
const ref = useRef<Map>(null);
const onLocationSearch = () => {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
(position) => {
const latLng = [
position.coords.latitude,
position.coords.longitude,
] as [number, number];
setCurrentLocation(latLng);
setCurrentLocationAccuracy(position.coords.accuracy);
// zoom to user location
const { current } = ref;
if (current && current.leafletElement) {
const map = current.leafletElement;
const newZoom = Math.max(map.getZoom() || 6, 8);
map.flyTo(latLng, newZoom, { duration: 2 });
}
},
() => {
setCurrentLocationErrorMessage("Unable to find your location");
}
);
} else {
setCurrentLocationErrorMessage(
"Geolocation is not supported by your browser"
);
}
};
const onLocationErrorAlertClose = () =>
setCurrentLocationErrorMessage(undefined);
useEffect(() => {
const { current } = ref;
if (current && current.leafletElement) {
const map = current.leafletElement;
if (searchResult) {
map.fitBounds([
searchResult.bbox.southWest,
searchResult.bbox.northEast,
]);
}
}
}, [searchResult]);
const onBaseLayerChange = ({ name }: LayersControlEvent) => {
setLegendName(name);
};
return loading ? (
<div className={classes.loading}>
<CircularProgress size="4rem" thickness={1} />
</div>
) : (
<Map
id="sites-map"
ref={ref}
preferCanvas
maxBoundsViscosity={1.0}
className={classes.map}
center={initialCenter}
zoom={initialZoom}
minZoom={collection ? 1 : 2} // If we're on dashboard page, the map's wrapping div is smaller, so we need to allow higher zoom
worldCopyJump
onbaselayerchange={onBaseLayerChange}
bounds={initialBounds}
maxBounds={mapConstants.MAX_BOUNDS}
>
<Snackbar
open={Boolean(currentLocationErrorMessage)}
autoHideDuration={5000}
anchorOrigin={{ vertical: "top", horizontal: "right" }}
onClose={onLocationErrorAlertClose}
>
<Alert severity="error" onClose={onLocationErrorAlertClose}>
{currentLocationErrorMessage}
</Alert>
</Snackbar>
<TileLayer attribution={attribution} url={tileURL} />
<SofarLayers defaultLayerName={defaultLayerName} />
<SiteMarkers collection={collection} />
{currentLocation && (
<Marker icon={currentLocationMarker} position={currentLocation} />
)}
{currentLocation && currentLocationAccuracy && (
<Circle
center={{ lat: currentLocation[0], lng: currentLocation[1] }}
radius={currentLocationAccuracy}
/>
)}
<Legend legendName={legendName} bottom={legendBottom} left={legendLeft} />
{showAlertLevelLegend && <AlertLevelLegend />}
{showWaterMark && <div className="mapbox-wordmark" />}
{geolocationEnabled && (
<div className={classes.locationIconButton}>
<IconButton onClick={onLocationSearch}>
<MyLocationIcon color="primary" />
</IconButton>
</div>
)}
</Map>
);
}