import React, { useEffect, useState, useRef } from "react"; import { useMap } from "../MapComponent"; import { ScaleLine } from "ol/control"; const Scale: React.FC = () => { const map = useMap(); const [zoomLevel, setZoomLevel] = useState(0); const [coordinates, setCoordinates] = useState<[number, number]>([0, 0]); const scaleLineRef = useRef(null); useEffect(() => { if (!map) return; const updateZoomLevel = () => { const zoom = map.getView().getZoom(); setZoomLevel(zoom ?? 0); // 如果 zoom 是 undefined,则使用默认值 0 }; const updateCoordinates = (event: any) => { const coords = event.coordinate; const transformedCoords = coords.map((c: number) => parseFloat(c.toFixed(4)) ); setCoordinates(transformedCoords); }; map.on("moveend", updateZoomLevel); map.on("pointermove", updateCoordinates); // Initialize values updateZoomLevel(); // ScaleLine control const scaleControl = new ScaleLine({ target: scaleLineRef.current || undefined, units: "metric", bar: false, steps: 4, text: true, minWidth: 64, }); map.addControl(scaleControl); return () => { map.un("moveend", updateZoomLevel); map.un("pointermove", updateCoordinates); map.removeControl(scaleControl); }; }, [map]); return ( <>
缩放: {zoomLevel.toFixed(1)}
坐标: {coordinates[0]}, {coordinates[1]}
); }; export default Scale;