@wenle_2523097/agri-map 2.0.1 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/components/ColorSwatch/__tests__/index.test.d.ts +5 -0
  2. package/dist/components/FullscreenControl/__tests__/index.test.d.ts +5 -0
  3. package/dist/components/Marker/useEditHandlers.d.ts +2 -2
  4. package/dist/components/Measurement/__tests__/toolbar.test.d.ts +2 -2
  5. package/dist/components/Notification/__tests__/index.test.d.ts +1 -1
  6. package/dist/components/PerformanceDashboard/__tests__/index.test.d.ts +1 -1
  7. package/dist/components/PlotLayer/__tests__/index.test.d.ts +2 -3
  8. package/dist/components/Popup/__tests__/index.test.d.ts +5 -0
  9. package/dist/components/Road/hooks/useRoadEvents.d.ts +4 -0
  10. package/dist/components/SelectIcon/__tests__/index.test.d.ts +4 -0
  11. package/dist/components/StyleSelector/__tests__/index.test.d.ts +5 -0
  12. package/dist/components/TrackPlayer/__tests__/index.test.d.ts +5 -0
  13. package/dist/components/irrigation.esm.js +12 -2
  14. package/dist/components/irrigation.esm.js.map +1 -1
  15. package/dist/components/marker.esm.js.map +1 -1
  16. package/dist/components/plotgrouplayer.esm.js +3 -1
  17. package/dist/components/plotgrouplayer.esm.js.map +1 -1
  18. package/dist/components/road.esm.js +41 -13
  19. package/dist/components/road.esm.js.map +1 -1
  20. package/dist/hooks/__tests__/useRenderOptimization.test.d.ts +0 -1
  21. package/dist/hooks/index.esm.js +3 -2
  22. package/dist/hooks/index.esm.js.map +1 -1
  23. package/dist/hooks/usePolylineDraw.d.ts +75 -0
  24. package/dist/hooks/usePolylineEdit.d.ts +70 -0
  25. package/dist/hooks/usePolylineRenderer.d.ts +1 -1
  26. package/dist/hooks/useSnapManager.d.ts +50 -0
  27. package/dist/hooks/useVertexMarkers.d.ts +51 -0
  28. package/dist/index.esm.js +53 -14
  29. package/dist/index.esm.js.map +1 -1
  30. package/dist/index.js +53 -14
  31. package/dist/index.js.map +1 -1
  32. package/dist/index.umd.js +53 -14
  33. package/dist/index.umd.js.map +1 -1
  34. package/dist/tests/setup/antd-mock.d.ts +34 -0
  35. package/dist/tests/setup/browser-mock.d.ts +53 -0
  36. package/dist/tests/setup/index.d.ts +22 -0
  37. package/dist/tests/setup/leaflet-mock.d.ts +28 -0
  38. package/dist/types/index.d.ts +1 -0
  39. package/dist/types/irrigation.d.ts +4 -123
  40. package/dist/types/marker.d.ts +12 -113
  41. package/dist/types/mixins/DataSourceMixin.d.ts +56 -0
  42. package/dist/types/mixins/EditableMixin.d.ts +124 -0
  43. package/dist/types/mixins/InteractionMixin.d.ts +43 -0
  44. package/dist/types/mixins/LifecycleMixin.d.ts +23 -0
  45. package/dist/types/mixins/LoadingMixin.d.ts +44 -0
  46. package/dist/types/mixins/SelectableMixin.d.ts +52 -0
  47. package/dist/types/mixins/StyleMixin.d.ts +49 -0
  48. package/dist/types/mixins/ViewControlMixin.d.ts +36 -0
  49. package/dist/types/mixins/index.d.ts +13 -0
  50. package/dist/types/plot.d.ts +13 -67
  51. package/dist/types/road.d.ts +11 -157
  52. package/dist/types/track.d.ts +5 -15
  53. package/dist/utils/__tests__/RTreeIndex.test.d.ts +0 -1
  54. package/dist/utils/drawContext.d.ts +65 -0
  55. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../../src/hooks/useLatestRef.ts","../../src/hooks/useSyncRef.ts","../../src/hooks/useMapLifecycle.ts","../../src/context/MapContext.tsx","../../src/context/ThemeContext.tsx","../../src/context/ConfigContext.tsx","../../src/utils/darkThemeFilter.ts","../../src/components/TianDiTuLayer/index.tsx","../../src/components/DualScaleControl/index.tsx","../../src/components/MapSizeHandler/index.tsx","../../src/components/ZoomControl/index.tsx","../../src/components/FullscreenControl/index.tsx","../../src/utils/pulseIcon.ts","../../src/constants/icon.ts","../../src/constants/styles.ts","../../src/components/Loading/index.tsx","../../src/components/MapContainer/index.tsx","../../src/constants/theme.ts","../../src/hooks/useTheme.ts","../../src/hooks/useLifecycle.ts","../../src/hooks/useEditMode.ts","../../src/hooks/usePolylineRenderer.ts","../../src/hooks/usePolylineEditor.ts","../../src/hooks/useLoadingOverlay.tsx","../../src/hooks/useRenderOptimization.ts","../../src/utils/errorHandling.ts","../../src/hooks/usePerformanceMonitor.ts","../../src/hooks/useWorker.ts","../../src/hooks/plotStateMachine/types.ts","../../src/hooks/plotStateMachine/plotStateMachine.ts","../../src/hooks/plotStateMachine/hooks/usePlotDraw.ts","../../src/hooks/plotStateMachine/hooks/usePlotClip.ts","../../src/utils/area.ts","../../src/hooks/plotStateMachine/hooks/usePlotMove.ts","../../src/hooks/plotStateMachine/hooks/usePlotRedraw.ts","../../src/hooks/plotStateMachine/index.ts","../../src/hooks/useVertexStyleFix.ts","../../src/utils/geometry.ts","../../src/utils/leafletIcons.ts","../../src/hooks/useDistanceLabels.ts","../../src/hooks/useIncrementalUpdate.ts","../../src/utils/rafThrottle.ts","../../src/hooks/useViewportDebounce.ts","../../src/hooks/useLayerIncrementalUpdate.ts","../../src/hooks/useEnhancedVirtualization.ts","../../src/hooks/useIsomorphicLayoutEffect.ts","../../src/types/basic.ts","../../src/hooks/useBoxZoomSelection.ts","../../src/constants/common.ts","../../src/hooks/useUnifiedFitBounds.ts","../../src/hooks/useNormalizedDataSource.ts","../../src/hooks/useDataNormalizer.ts","../../src/hooks/useAutoFit.ts"],"sourcesContent":["/**\n * 保持 ref 始终指向最新值的 Hook\n * @description 用于在回调中访问最新值,避免闭包陷阱\n */\n\nimport { useRef, useEffect } from 'react';\n\n/**\n * 返回一个 ref,其 current 始终指向传入的最新值\n * @param value 需要保持引用的值\n * @returns React.MutableRefObject<T>\n *\n * @example\n * ```ts\n * const onClickRef = useLatestRef(onClick);\n * // 在回调中使用 onClickRef.current\n * ```\n */\nexport function useLatestRef<T>(value: T) {\n const ref = useRef(value);\n useEffect(() => {\n ref.current = value;\n }, [value]);\n return ref;\n}\n\nexport default useLatestRef;\n","/**\n * 统一 ref 同步 Hook\n * @description 将值同步到 ref,避免多处重复编写相同的同步逻辑\n *\n * 使用场景:\n * - 需要在事件回调中访问最新 state 值\n * - 避免闭包陷阱导致的 stale closure 问题\n * - 替代多处重复的 useEffect + ref 同步逻辑\n *\n * @packageDocumentation\n */\n\nimport { useRef, useEffect, useState } from 'react';\n\n/**\n * 将值同步到 ref 的通用 Hook\n *\n * @param ref 目标 ref\n * @param value 需要同步的值\n *\n * @example\n * ```tsx\n * import { useRef } from 'react';\n * import { useSyncRef } from './hooks';\n *\n * function MyComponent({ value }) {\n * const valueRef = useRef(null);\n * useSyncRef(valueRef, value);\n *\n * const handleClick = () => {\n * // 访问最新值\n * console.log(valueRef.current);\n * };\n *\n * return <button onClick={handleClick}>Click</button>;\n * }\n * ```\n *\n * @see {@link https://react.dev/reference/react/useRef}\n */\nexport function useSyncRef<T>(ref: React.MutableRefObject<T | null>, value: T): void {\n useEffect(() => {\n ref.current = value;\n }, [ref, value]);\n}\n\n/**\n * 自动创建 ref 并同步值的 Hook\n *\n * @template T - 值类型\n * @param initialValue - 初始值\n * @returns [ref, currentValue] - ref 对象和当前值的元组\n *\n * @example\n * ```tsx\n * import { useAutoSyncRef } from './hooks';\n *\n * function MyComponent({ data }) {\n * const [dataRef, currentData] = useAutoSyncRef(initialData);\n *\n * // currentData 始终与 data 同步\n * // dataRef.current 可在回调中访问最新值\n *\n * return <div>{currentData}</div>;\n * }\n * ```\n */\nexport function useAutoSyncRef<T>(initialValue: T): [React.MutableRefObject<T | null>, T] {\n const ref = useRef<T | null>(null);\n const [value, _setValue] = useState(initialValue);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return [ref, value] as const;\n}\n\nexport default useSyncRef;\n","/**\n * @fileoverview 地图生命周期管理 Hook(极简方案)\n * @description 为 MapContainer 提供极简的生命周期管理\n * @since 1.4.0\n * @module hooks/useMapLifecycle\n *\n * @example\n * ```tsx\n * useMapLifecycle({\n * map,\n * lifecycle: {\n * onMapReady: ({ map }) => console.log('地图就绪'),\n * onViewportChange: (data) => saveViewport(data),\n * },\n * isReady: true,\n * });\n * ```\n */\n\n/* eslint-disable react-hooks/exhaustive-deps -- ref 回调稳定 */\n\nimport { useEffect, useRef } from 'react';\nimport type L from 'leaflet';\nimport type { MapLifecycleConfig } from '../types/mapLifecycle';\n\n/**\n * useMapLifecycle 配置选项\n */\nexport interface UseMapLifecycleOptions {\n /** 地图实例 */\n map: L.Map | null;\n /** 生命周期配置 */\n lifecycle?: MapLifecycleConfig;\n /** 地图是否已就绪 */\n isReady: boolean;\n}\n\n/**\n * 地图生命周期管理 Hook(极简方案)\n * @description 只管理两个核心生命周期事件:onMapReady 和 onViewportChange\n *\n * @param options - 配置选项\n *\n * @example\n * ```tsx\n * function MapProvider({ lifecycle, children }) {\n * const [map, setMap] = useState(null);\n * const [isReady, setIsReady] = useState(false);\n *\n * // 初始化地图\n * useEffect(() => {\n * const newMap = L.map(containerRef.current);\n * setMap(newMap);\n * setIsReady(true);\n * }, []);\n *\n * // 生命周期管理\n * useMapLifecycle({ map, lifecycle, isReady });\n *\n * return <div>{children}</div>;\n * }\n * ```\n */\nexport function useMapLifecycle(options: UseMapLifecycleOptions): void {\n const { map, lifecycle, isReady } = options;\n const hasReadyFired = useRef(false);\n const prevViewportRef = useRef<{ center: L.LatLng; zoom: number } | null>(null);\n const rafIdRef = useRef<number | null>(null);\n\n // ========== MOUNT: onMapReady ==========\n useEffect(() => {\n // 必须地图实例存在且已就绪\n if (!map || !isReady) {\n return;\n }\n\n // 防止重复触发\n if (hasReadyFired.current) {\n return;\n }\n\n hasReadyFired.current = true;\n\n // 触发 onMapReady 回调\n lifecycle?.onMapReady?.({ map });\n\n // 注意:不在这里监听 'load' 事件\n // 因为现代浏览器和 Leaflet 版本中,'load' 事件可能不会触发\n // 如果需要知道瓦片加载完成,应该在 TileLayer 中监听\n }, [map, isReady]);\n\n // ========== UPDATE: onViewportChange ==========\n useEffect(() => {\n // 必须地图实例存在且已就绪\n if (!map || !isReady || !lifecycle?.onViewportChange) {\n return;\n }\n\n /**\n * 视口变化处理函数\n * @description 使用 RAF 防抖,避免高频触发\n */\n const handleViewportChange = (_triggerEvent: 'moveend' | 'zoomend') => {\n // 如果已有 RAF 待执行,跳过\n if (rafIdRef.current !== null) {\n return;\n }\n\n rafIdRef.current = requestAnimationFrame(() => {\n const center = map.getCenter();\n const zoom = map.getZoom();\n const bounds = map.getBounds();\n\n // 检测是否真的发生了变化(避免重复触发)\n const prev = prevViewportRef.current;\n const hasChanged =\n !prev ||\n Math.abs(prev.center.lat - center.lat) > 0.0001 ||\n Math.abs(prev.center.lng - center.lng) > 0.0001 ||\n Math.abs(prev.zoom - zoom) > 0.001;\n\n if (hasChanged) {\n // 触发回调\n lifecycle.onViewportChange?.({\n center,\n zoom,\n bounds,\n });\n\n // 更新上一个视口引用\n prevViewportRef.current = { center, zoom };\n }\n\n // 清除 RAF ID\n rafIdRef.current = null;\n });\n };\n\n // 监听移动和缩放事件\n map.on('moveend', () => handleViewportChange('moveend'));\n map.on('zoomend', () => handleViewportChange('zoomend'));\n\n // 清理函数\n return () => {\n // 清除待执行的 RAF\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n\n // 移除事件监听\n map.off('moveend');\n map.off('zoomend');\n };\n }, [map, isReady, lifecycle?.onMapReady, lifecycle?.onViewportChange]);\n\n // ========== UNMOUNT: 清理 ==========\n useEffect(() => {\n return () => {\n // 清除待执行的 RAF\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n };\n }, []);\n}\n\nexport default useMapLifecycle;\n","/**\n * @fileoverview 地图上下文 - 替代 react-leaflet 的 MapContainer 和 useMap\n * @description 提供地图实例的上下文管理和访问 Hook,API 与 react-leaflet 保持一致\n * @module context/MapContext\n * @since 2.0.0\n * @since 1.4.0 添加极简生命周期管理支持\n */\n\n/* eslint-disable react-hooks/exhaustive-deps -- 地图配置选项变更频率低 */\n\nimport React, { createContext, useContext, useRef, useEffect, useState, useMemo } from 'react';\nimport L from 'leaflet';\nimport { useMapLifecycle } from '../hooks/useMapLifecycle';\nimport type { MapLifecycleConfig } from '../types/mapLifecycle';\n\n// ========== 类型定义 ==========\n\n/**\n * 地图上下文值\n */\nexport interface MapContextValue {\n /** Leaflet 地图实例 */\n map: L.Map | null;\n /** 地图实例 ref(用于命令式访问) */\n mapRef: React.MutableRefObject<L.Map | null>;\n /** 地图是否已初始化完成 */\n isReady: boolean;\n}\n\n/**\n * MapProvider 组件属性\n */\nexport interface MapProviderProps {\n /** 子组件 */\n children: React.ReactNode;\n /** 初始中心点 */\n center: [number, number];\n /** 初始缩放级别 */\n zoom: number;\n /** Leaflet 地图选项 */\n options?: L.MapOptions;\n /** 地图初始化完成回调 */\n onReady?: (map: L.Map) => void;\n /** 容器样式 */\n style?: React.CSSProperties;\n /** 容器类名 */\n className?: string;\n /** 是否在组件卸载时销毁地图 */\n destroyOnUnmount?: boolean;\n /**\n * 地图生命周期回调配置\n * @since 1.4.0\n * @description 极简方案:只保留 onMapReady 和 onViewportChange\n * @example\n * ```tsx\n * lifecycle={{\n * onMapReady: ({ map }) => console.log('地图就绪'),\n * onViewportChange: (data) => saveViewport(data),\n * }}\n * ```\n */\n lifecycle?: MapLifecycleConfig;\n}\n\n// ========== Context 创建 ==========\n\nconst MapContext = createContext<MapContextValue>({\n map: null,\n mapRef: { current: null },\n isReady: false,\n});\n\nMapContext.displayName = 'MapContext';\n\n// ========== Hook 导出 ==========\n\n/**\n * 获取地图实例的 Hook\n * @description 与 react-leaflet 的 useMap API 保持一致,方便迁移\n * @returns Leaflet 地图实例,如果地图未初始化则返回 null\n * @example\n * ```tsx\n * const map = useMap();\n *\n * useEffect(() => {\n * if (!map) return;\n * // 使用地图实例\n * map.fitBounds(bounds);\n * }, [map]);\n * ```\n */\nexport const useMap = (): L.Map | null => {\n const { map } = useContext(MapContext);\n return map;\n};\n\n/**\n * 获取地图实例(保证非空)\n * @description 如果地图未初始化则抛出错误,用于确定地图一定存在的场景\n * @returns 地图实例\n * @throws 如果地图未初始化\n * @example\n * ```tsx\n * function MyComponent() {\n * // 组件在 MapProvider 内部,map 一定存在\n * const map = useMapGuaranteed();\n * // TypeScript 知道 map 不是 null\n * map.fitBounds(bounds);\n * }\n * ```\n */\nexport const useMapGuaranteed = (): L.Map => {\n const map = useMap();\n if (!map) {\n throw new Error(\n 'Map is not available. Make sure you are inside a MapProvider and the map has been initialized.'\n );\n }\n return map;\n};\n\n/**\n * 获取地图实例 ref 的 Hook\n * @description 用于在事件处理器中获取最新地图实例(避免闭包问题)\n * @returns 地图实例 ref\n */\nexport const useMapRef = (): React.MutableRefObject<L.Map | null> => {\n const { mapRef } = useContext(MapContext);\n return mapRef;\n};\n\n/**\n * 判断地图是否就绪的 Hook\n * @returns 地图是否已初始化完成\n */\nexport const useMapReady = (): boolean => {\n const { isReady } = useContext(MapContext);\n return isReady;\n};\n\n/**\n * 获取完整上下文值的 Hook\n * @description 用于需要同时访问 map、mapRef、isReady 的场景\n * @returns 地图上下文值\n */\nexport const useMapContext = (): MapContextValue => {\n return useContext(MapContext);\n};\n\n// ========== Provider 组件 ==========\n\n/**\n * 地图容器 Provider 组件\n * @description 替代 react-leaflet 的 MapContainer,提供地图实例上下文\n * @example\n * ```tsx\n * import { MapProvider, useMapInstance } from 'agri-map-components';\n *\n * function MyMapComponent() {\n * return (\n * <MapProvider center={[30, 120]} zoom={10}>\n * <MyLayer />\n * </MapProvider>\n * );\n * }\n *\n * function MyLayer() {\n * const map = useMapInstance();\n * // 使用 map...\n * return null;\n * }\n * ```\n */\nexport const MapProvider: React.FC<MapProviderProps> = ({\n children,\n center,\n zoom,\n options = {},\n onReady,\n style,\n className,\n destroyOnUnmount = true,\n lifecycle,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const mapRef = useRef<L.Map | null>(null);\n const [isReady, setIsReady] = useState(false);\n const onReadyRef = useRef(onReady);\n const lifecycleRef = useRef(lifecycle);\n\n // 保持 lifecycle 最新\n useEffect(() => {\n lifecycleRef.current = lifecycle;\n }, [lifecycle]);\n\n // 给 zoom 添加默认值\n const effectiveZoom = zoom ?? 12;\n\n // 保持 onReady 回调最新\n useEffect(() => {\n onReadyRef.current = onReady;\n }, [onReady]);\n\n // 初始化地图\n useEffect(() => {\n if (!containerRef.current) return;\n\n // 防止重复初始化\n if (mapRef.current) return;\n\n // 地图选项 - 必须包含 center 和 zoom 用于初始化\n // 注意:不要使用 ...options 展开,因为 undefined 值会覆盖默认值\n const mapOptions: L.MapOptions = {\n center,\n zoom: effectiveZoom,\n zoomControl: options.zoomControl ?? true,\n attributionControl: options.attributionControl ?? true,\n };\n\n // 只添加有值的选项,避免 undefined 覆盖默认值\n if (options.crs !== undefined) mapOptions.crs = options.crs;\n if (options.maxZoom !== undefined) mapOptions.maxZoom = options.maxZoom;\n if (options.minZoom !== undefined) mapOptions.minZoom = options.minZoom;\n if (options.scrollWheelZoom !== undefined) mapOptions.scrollWheelZoom = options.scrollWheelZoom;\n if (options.maxBounds !== undefined) mapOptions.maxBounds = options.maxBounds;\n if (options.layers !== undefined) mapOptions.layers = options.layers;\n if (options.preferCanvas !== undefined) mapOptions.preferCanvas = options.preferCanvas;\n\n // 创建地图\n const map = L.map(containerRef.current, mapOptions);\n\n mapRef.current = map;\n setIsReady(true);\n\n // 触发 onReady 回调\n if (onReadyRef.current) {\n // 使用 RAF 确保地图渲染完成\n requestAnimationFrame(() => {\n onReadyRef.current?.(map);\n });\n }\n\n // 清理函数\n return () => {\n if (destroyOnUnmount && mapRef.current) {\n mapRef.current.remove();\n mapRef.current = null;\n setIsReady(false);\n }\n };\n }, []); // 只在挂载时执行一次\n\n // ========== 生命周期管理 ==========\n useMapLifecycle({\n map: mapRef.current,\n lifecycle: lifecycleRef.current,\n isReady,\n });\n\n // 更新 center 和 zoom(如果需要)\n // 如果需要受控模式,可以取消注释以下代码\n // const updateCenterZoom = useCallback(() => {\n // if (!mapRef.current || !isReady) return;\n // const currentCenter = mapRef.current.getCenter();\n // const currentZoom = mapRef.current.getZoom();\n // if (currentCenter.lat !== center[0] || currentCenter.lng !== center[1] || currentZoom !== zoom) {\n // mapRef.current.setView(center, zoom, { animate: false });\n // }\n // }, [center, zoom, isReady]);\n\n // 响应 center/zoom 变化(可选行为,默认不响应)\n // 如果需要受控模式,可以取消注释以下代码\n // useEffect(() => {\n // updateCenterZoom();\n // }, [updateCenterZoom]);\n\n const contextValue: MapContextValue = useMemo(\n () => ({\n map: mapRef.current,\n mapRef,\n isReady,\n }),\n // 只依赖 isReady,因为 mapRef 是稳定的 ref 对象\n // 修复记录 (2024-06-08): 使用 useMemo 缓存 contextValue,避免每次渲染创建新对象\n // 问题:原始代码在每次渲染时创建新对象 { map: mapRef.current, mapRef, isReady },\n // 导致使用 useContext(MapContext) 的组件重新渲染\n [isReady]\n );\n\n return (\n <MapContext.Provider value={contextValue}>\n <div\n ref={containerRef}\n className={className}\n style={{\n position: 'relative',\n ...(style || {}),\n }}\n data-map-container-style={JSON.stringify(style)}\n >\n {isReady && children}\n </div>\n </MapContext.Provider>\n );\n};\n\nMapProvider.displayName = 'MapProvider';\n\n// ========== 工具 Hook ==========\n\n/**\n * 地图事件监听 Hook\n * @description 简化地图事件的绑定和解绑\n * @param eventType 事件类型\n * @param handler 事件处理函数\n * @example\n * ```tsx\n * useMapEvent('click', (e) => {\n * console.log('点击位置:', e.latlng);\n * });\n * ```\n */\nexport const useMapEvent = <K extends keyof L.LeafletEventHandlerFnMap>(\n eventType: K,\n handler: L.LeafletEventHandlerFnMap[K]\n): void => {\n const map = useMap();\n const handlerRef = useRef(handler);\n\n useEffect(() => {\n handlerRef.current = handler;\n }, [handler]);\n\n useEffect(() => {\n if (!map) return;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wrappedHandler = (e: any) => {\n handlerRef.current?.(e);\n };\n\n map.on(eventType, wrappedHandler as L.LeafletEventHandlerFn);\n\n return () => {\n map.off(eventType, wrappedHandler as L.LeafletEventHandlerFn);\n };\n }, [map, eventType]);\n};\n\n/**\n * 多事件监听 Hook\n * @description 同时监听多个地图事件,与 react-leaflet 的 useMapEvents API 一致\n * @param events 事件处理函数映射对象\n * @returns 地图实例\n * @example\n * ```tsx\n * const map = useMapEvents({\n * click: (e) => {\n * console.log('点击位置:', e.latlng);\n * },\n * zoomend: (e) => {\n * console.log('缩放结束:', map.getZoom());\n * },\n * moveend: (e) => {\n * console.log('移动结束:', map.getCenter());\n * },\n * });\n * ```\n */\nexport const useMapEvents = <K extends keyof L.LeafletEventHandlerFnMap>(\n events: Partial<L.LeafletEventHandlerFnMap>\n): L.Map | null => {\n const map = useMap();\n const eventsRef = useRef(events);\n\n // 保持 events 最新\n useEffect(() => {\n eventsRef.current = events;\n }, [events]);\n\n useEffect(() => {\n if (!map) return;\n\n // 为每个事件类型注册监听器\n const registeredEvents: K[] = [];\n\n for (const eventType in eventsRef.current) {\n if (eventsRef.current[eventType as K]) {\n const handler = eventsRef.current[eventType as K]!;\n const wrappedHandler = (e: L.LeafletEvent) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (handler as any)(e);\n };\n map.on(eventType, wrappedHandler as L.LeafletEventHandlerFn);\n registeredEvents.push(eventType as K);\n }\n }\n\n return () => {\n // 清理所有注册的事件\n for (const eventType of registeredEvents) {\n map.off(eventType);\n }\n };\n }, [map]);\n\n return map;\n};\n\n/**\n * 地图视口变化监听 Hook\n * @description 监听地图 zoom 和 move 事件\n * @param callback 视口变化回调\n * @example\n * ```tsx\n * useMapViewportChange(({ center, zoom, bounds }) => {\n * console.log('视口变化:', center, zoom);\n * });\n * ```\n */\nexport const useMapViewportChange = (\n callback: (viewport: { center: L.LatLng; zoom: number; bounds: L.LatLngBounds }) => void\n): void => {\n const map = useMap();\n const callbackRef = useRef(callback);\n\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n useEffect(() => {\n if (!map) return;\n\n const handleChange = () => {\n callbackRef.current({\n center: map.getCenter(),\n zoom: map.getZoom(),\n bounds: map.getBounds(),\n });\n };\n\n map.on('zoomend', handleChange);\n map.on('moveend', handleChange);\n\n return () => {\n map.off('zoomend', handleChange);\n map.off('moveend', handleChange);\n };\n }, [map]);\n};\n\nexport { MapContext };\n","/**\n * 主题上下文\n * @description 提供全局主题状态管理,支持 MapContainer 等组件自动同步主题\n * @since 2.0.0\n */\n\n/* eslint-disable @typescript-eslint/no-empty-function */\nimport React, { createContext, useContext, useState, useEffect, useCallback, useMemo } from 'react';\n\n// ========== 类型定义 ==========\n\nexport type ThemeMode = 'light' | 'dark';\n\nexport interface ThemeContextValue {\n /** 当前主题 */\n theme: ThemeMode;\n /** 设置主题 */\n setTheme: (theme: ThemeMode) => void;\n /** 是否为深色主题 */\n isDark: boolean;\n}\n\n// ========== 上下文 ==========\n\nconst ThemeContext = createContext<ThemeContextValue>({\n theme: 'light',\n setTheme: () => {},\n isDark: false,\n});\n\n/**\n * 获取主题上下文的 Hook\n * @returns 主题上下文值\n */\nexport const useTheme = (): ThemeContextValue => {\n return useContext(ThemeContext);\n};\n\n// ========== Provider 组件 ==========\n\nexport interface ThemeProviderProps {\n /** 子组件 */\n children: React.ReactNode;\n /** 初始主题,默认从 localStorage 读取或使用 'light' */\n defaultTheme?: ThemeMode;\n /** 主题变化回调 */\n onThemeChange?: (theme: ThemeMode) => void;\n}\n\n/**\n * 主题 Provider 组件\n * @description 提供全局主题状态,自动同步 localStorage 和 DOM 属性\n *\n * @example\n * ```tsx\n * // 在应用入口包裹\n * <ThemeProvider defaultTheme=\"dark\">\n * <App />\n * </ThemeProvider>\n *\n * // 在组件中使用\n * const { theme, setTheme, isDark } = useTheme();\n * ```\n */\nexport function ThemeProvider({\n children,\n defaultTheme,\n onThemeChange,\n}: ThemeProviderProps): JSX.Element {\n // 初始化主题:优先使用 props,其次 localStorage,最后默认 'light'\n const [theme, setThemeState] = useState<ThemeMode>(() => {\n if (defaultTheme) return defaultTheme;\n // 检查是否在浏览器环境中\n if (typeof window !== 'undefined' && window.localStorage) {\n const stored = localStorage.getItem('theme');\n if (stored === 'light' || stored === 'dark') return stored;\n }\n return 'light';\n });\n\n // 同步到 DOM 和 localStorage\n useEffect(() => {\n document.documentElement.setAttribute('data-theme', theme);\n document.body.setAttribute('data-theme', theme);\n if (typeof window !== 'undefined' && window.localStorage) {\n localStorage.setItem('theme', theme);\n }\n }, [theme]);\n\n // 设置主题\n const setTheme = useCallback(\n (newTheme: ThemeMode) => {\n setThemeState(newTheme);\n onThemeChange?.(newTheme);\n },\n [onThemeChange]\n );\n\n const value = useMemo(\n () => ({\n theme,\n setTheme,\n isDark: theme === 'dark',\n }),\n [theme, setTheme]\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nexport default ThemeProvider;\n","/**\n * 配置上下文\n * @description 用于在子组件中获取 MapContainer 的配置\n * @module context/ConfigContext\n * @since 2.0.0\n */\n\nimport { createContext, useContext } from 'react';\nimport type {\n DualScaleControlConfig,\n MapSizeHandlerConfig,\n TianDiTuLayerConfig,\n PathOptions,\n IconConfig,\n AntPathConfig,\n TrackStyle,\n ClusterIconConfig,\n} from '../types';\n\n// ========== 类型定义 ==========\n\n/**\n * PlotLayer 配置\n */\nexport interface PlotLayerConfig {\n /** 编辑模式样式 */\n editing?: PathOptions | null | false;\n}\n\n/**\n * Marker 配置\n */\nexport interface MarkerConfig {\n /** 编辑中状态图标配置 */\n editing?: IconConfig | null | false;\n /** 聚合气泡图标 - undefined|null|false|{} → 使用 CLUSTER_DEFAULT_ICON */\n cluster?: ClusterIconConfig | null | false;\n}\n\n/**\n * Road 配置\n */\nexport interface RoadConfig {\n /** 编辑态样式配置 */\n editing?: PathOptions | null | false;\n /** 蚁行路径配置 */\n antPath?: AntPathConfig | null | false;\n}\n\n/**\n * Irrigation 配置\n */\nexport interface IrrigationConfig {\n /** 编辑态样式配置 */\n editing?: PathOptions | null | false;\n /** 蚁行路径配置 */\n antPath?: AntPathConfig | null | false;\n /** 进水口图标配置 */\n inlet?: IconConfig | null | false;\n /** 出水口图标配置 */\n outlet?: IconConfig | null | false;\n}\n\n/**\n * Track 配置\n * @since 2.0.0 使用 TRACK_STYLE.default 替代 working,使用 TRACK_STYLE.nonWorking 替代 nonWorking\n */\nexport interface TrackConfig {\n /** 作业中轨迹样式 - undefined|null|false|{} → 使用 TRACK_STYLE.default */\n default?: TrackStyle | null | false;\n /** 非作业/路上轨迹样式 - undefined|null|false|{} → 使用 TRACK_STYLE.nonWorking */\n nonWorking?: TrackStyle | null | false;\n /** 选中轨迹样式 - undefined|null|false|{} → 使用 TRACK_STYLE.selected */\n selected?: TrackStyle | null | false;\n /** 起点图标 - undefined|null|false|{} → 使用 TRACK_DEFAULT_START_ICON */\n start?: IconConfig | null | false;\n /** 终点图标 - undefined|null|false|{} → 使用 TRACK_DEFAULT_END_ICON */\n end?: IconConfig | null | false;\n /** 聚合气泡图标 - undefined|null|false|{} → 使用 CLUSTER_DEFAULT_ICON */\n cluster?: ClusterIconConfig | null | false;\n}\n\n/**\n * 配置上下文值\n */\nexport interface ConfigContextValue {\n /** 主题模式 */\n theme: 'light' | 'dark';\n /** 双向标尺配置 */\n dualScaleControl?: DualScaleControlConfig | false;\n /** 天地图图层配置 */\n tianDiTuLayer?: TianDiTuLayerConfig | false;\n /** 地图尺寸处理器配置 */\n mapSizeHandler?: MapSizeHandlerConfig | false;\n /** PlotLayer 配置 */\n plotLayer?: PlotLayerConfig;\n /** Marker 配置 */\n marker?: MarkerConfig;\n /** Road 配置 */\n road?: RoadConfig;\n /** Irrigation 配置 */\n irrigation?: IrrigationConfig;\n /** Track 配置 */\n track?: TrackConfig;\n}\n\n// ========== Context 创建 ==========\n\n/**\n * 配置上下文\n */\nconst ConfigContext = createContext<ConfigContextValue>({\n theme: 'light',\n});\n\nConfigContext.displayName = 'ConfigContext';\n\n// ========== Hook 导出 ==========\n\n/**\n * 获取配置上下文的 Hook\n * @returns 配置对象\n * @example\n * ```tsx\n * const { theme, tianDiTuLayer } = useConfig();\n * ```\n */\nexport const useConfig = (): ConfigContextValue => {\n return useContext(ConfigContext);\n};\n\nexport { ConfigContext };\n","/**\n * 深色主题 SVG 滤镜工具\n * @description 为 Leaflet 地图组件提供深色主题支持\n */\n\nexport const FILTER_CONTAINER_ID = 'map-theme-filters';\nexport const DARK_FILTER_ID = 'tianditu-dark-filter';\n\nlet svgFilterInjected = false;\n\n/**\n * 确保深色滤镜已注入 DOM\n * 仅在首次调用时注入,全局只注入一次\n */\nexport function ensureDarkFilterInjected(): void {\n if (svgFilterInjected) return;\n if (document.getElementById(FILTER_CONTAINER_ID)) {\n svgFilterInjected = true;\n return;\n }\n\n const svgFilters = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svgFilters.setAttribute('id', FILTER_CONTAINER_ID);\n svgFilters.setAttribute('aria-hidden', 'true');\n svgFilters.setAttribute('style', 'position: absolute; width: 0; height: 0; overflow: hidden;');\n svgFilters.setAttribute('version', '1.1');\n\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n\n const darkFilter = document.createElementNS('http://www.w3.org/2000/svg', 'filter');\n darkFilter.setAttribute('id', DARK_FILTER_ID);\n darkFilter.setAttribute('x', '-20%');\n darkFilter.setAttribute('y', '-20%');\n darkFilter.setAttribute('width', '140%');\n darkFilter.setAttribute('height', '140%');\n darkFilter.setAttribute('filterUnits', 'objectBoundingBox');\n darkFilter.setAttribute('primitiveUnits', 'userSpaceOnUse');\n darkFilter.setAttribute('color-interpolation-filters', 'sRGB');\n\n const colorMatrix = document.createElementNS('http://www.w3.org/2000/svg', 'feColorMatrix');\n colorMatrix.setAttribute('type', 'matrix');\n colorMatrix.setAttribute('values', '1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0');\n colorMatrix.setAttribute('in', 'SourceGraphic');\n colorMatrix.setAttribute('result', 'colormatrix');\n\n const componentTransfer = document.createElementNS(\n 'http://www.w3.org/2000/svg',\n 'feComponentTransfer'\n );\n componentTransfer.setAttribute('in', 'colormatrix');\n componentTransfer.setAttribute('result', 'componentTransfer');\n\n const feFuncR = document.createElementNS('http://www.w3.org/2000/svg', 'feFuncR');\n feFuncR.setAttribute('type', 'table');\n feFuncR.setAttribute('tableValues', '0.12 0.18 0.35');\n\n const feFuncG = document.createElementNS('http://www.w3.org/2000/svg', 'feFuncG');\n feFuncG.setAttribute('type', 'table');\n feFuncG.setAttribute('tableValues', '0.12 0.18 0.35');\n\n const feFuncB = document.createElementNS('http://www.w3.org/2000/svg', 'feFuncB');\n feFuncB.setAttribute('type', 'table');\n feFuncB.setAttribute('tableValues', '0.2 0.25 0.45');\n\n const feFuncA = document.createElementNS('http://www.w3.org/2000/svg', 'feFuncA');\n feFuncA.setAttribute('type', 'table');\n feFuncA.setAttribute('tableValues', '0 0.3 1');\n\n componentTransfer.appendChild(feFuncR);\n componentTransfer.appendChild(feFuncG);\n componentTransfer.appendChild(feFuncB);\n componentTransfer.appendChild(feFuncA);\n\n darkFilter.appendChild(colorMatrix);\n darkFilter.appendChild(componentTransfer);\n defs.appendChild(darkFilter);\n svgFilters.appendChild(defs);\n\n document.body.appendChild(svgFilters);\n svgFilterInjected = true;\n}\n","/**\n * 天地图图层组件\n * @description 封装天地图的矢量图层和标注图层,支持多种图层风格和自定义瓦片 URL\n * @since 2.0.0 已移除 react-leaflet 依赖,改用原生 Leaflet API\n * @since 2.1.0 重构:分离图层创建和 URL 更新逻辑,学习 react-leaflet 的设计模式\n *\n * ## 重构说明 (2024-06-08)\n *\n * **问题**: 原始实现在单个 useEffect 中处理图层创建和更新,导致任何 props 变化都会删除并重建图层,\n * 触发大量瓦片请求。\n *\n * **解决方案**: 学习 react-leaflet 的设计模式,分离关注点:\n * 1. 图层创建 useEffect - 只依赖 `map`,只执行一次\n * 2. URL 更新 useEffect - 依赖 URL 相关 props,使用 `layer.setUrl()` 更新\n * 3. 选项更新 useEffect - 依赖选项 props,使用 `layer.setOptions()` 更新\n *\n * **优势**:\n * - URL 变化时不会删除重建图层,只调用 `setUrl()` 更新\n * - 减少不必要的瓦片请求\n * - 代码更清晰,每个 useEffect 职责单一\n *\n * ## 使用示例\n *\n * ```tsx\n * <MapContainer center={[30, 120]} zoom={12}>\n * <TianDiTuLayer apiKey=\"your-api-key\" />\n * <Marker dataSource={markers} />\n * </MapContainer>\n * ```\n *\n * ## 性能优化要点\n *\n * 1. **图层实例复用** - 图层一旦创建,就通过 ref 存储,避免重复创建\n * 2. **setUrl() 更新** - URL 变化时调用 setUrl() 而非删除重建\n * 3. **缩小依赖范围** - 每个 useEffect 只依赖必要的 props\n */\n\nimport { useEffect, useState, useRef, memo, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport L from 'leaflet';\nimport { useMap } from '../../context/MapContext';\nimport { useConfig } from '../../context/ConfigContext';\nimport { ensureDarkFilterInjected } from '../../utils/darkThemeFilter';\nimport type { LayerType, TianDiTuLayerProps } from '../../types';\n\n// ========== 图层配置 ==========\n\n// 图层类型配置\nexport const LAYER_TYPES = {\n VECTOR: 'vector', // 矢量图层(默认)\n SATELLITE: 'satellite', // 卫星影像图层\n TERRAIN: 'terrain', // 地形图层\n} as const;\n\n// 图层类型标签\nconst LAYER_LABELS: Record<LayerType, string> = {\n [LAYER_TYPES.VECTOR]: '矢量',\n [LAYER_TYPES.SATELLITE]: '影像',\n [LAYER_TYPES.TERRAIN]: '地形',\n};\n\n// 天地图图层 URL 配置\nconst LAYER_URLS: Record<LayerType, { base: string; annotation: string }> = {\n // 矢量图层(浅色)\n [LAYER_TYPES.VECTOR]: {\n base: 'https://t{s}.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk={key}',\n annotation:\n 'https://t{s}.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk={key}',\n },\n // 卫星影像图层\n [LAYER_TYPES.SATELLITE]: {\n base: 'https://t{s}.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk={key}',\n annotation:\n 'https://t{s}.tianditu.gov.cn/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk={key}',\n },\n // 地形图层\n [LAYER_TYPES.TERRAIN]: {\n base: 'https://t{s}.tianditu.gov.cn/ter_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=ter&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk={key}',\n annotation:\n 'https://t{s}.tianditu.gov.cn/cta_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cta&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk={key}',\n },\n};\n\n// ========== TianDiTuLayer 组件 ==========\n\n/**\n * 天地图图层组件\n */\nexport const TianDiTuLayer = memo<TianDiTuLayerProps>(function TianDiTuLayer({\n apiKey,\n showAnnotation = true,\n layerType: layerTypeProp = LAYER_TYPES.VECTOR,\n tileUrl,\n annotationUrl,\n overlayUrl,\n // subdomains, maxZoom, minZoom 在当前实现中未使用,保留用于未来扩展或 API 兼容\n subdomains: _subdomains = ['0', '1', '2', '3', '4', '5', '6', '7'],\n maxZoom: _maxZoom = 18,\n minZoom: _minZoom = 0,\n attribution = null,\n theme: themeProp,\n showLayerSelector = false,\n onLayerTypeChange,\n}: TianDiTuLayerProps): JSX.Element | null {\n // 从 ConfigProvider 获取 theme,优先使用 props 传入的 theme\n const config = useConfig();\n const theme = themeProp || config.theme || 'light';\n const map = useMap();\n const [currentLayerType, setCurrentLayerType] = useState<LayerType>(layerTypeProp as LayerType);\n const [selectorVisible, setSelectorVisible] = useState(false);\n\n // 同步外部传入的 layerType prop\n useEffect(() => {\n setCurrentLayerType(layerTypeProp as LayerType);\n }, [layerTypeProp]);\n\n // 图层引用\n const baseLayerRef = useRef<L.TileLayer | null>(null);\n const annotationLayerRef = useRef<L.TileLayer | null>(null);\n const overlayLayerRef = useRef<L.TileLayer | null>(null);\n\n // 图层类型切换\n const handleLayerChange = useCallback(\n (type: LayerType) => {\n setCurrentLayerType(type);\n setSelectorVisible(false);\n onLayerTypeChange?.(type);\n },\n [onLayerTypeChange]\n );\n\n // 深色模式:仅对矢量图应用滤镜\n const isDarkTheme = theme === 'dark' && currentLayerType === LAYER_TYPES.VECTOR;\n\n // 根据主题切换地图容器的 data-theme 属性\n useEffect(() => {\n if (!map) return;\n\n const mapContainer = map.getContainer();\n\n if (isDarkTheme) {\n ensureDarkFilterInjected();\n mapContainer.setAttribute('data-theme', 'dark');\n } else {\n mapContainer.removeAttribute('data-theme');\n }\n }, [map, isDarkTheme]);\n\n // ============================================================================\n // 图层管理(学习 react-leaflet 的设计模式:分离创建和更新)\n // ============================================================================\n\n // ========== 1. 图层创建(只在 map 变化时执行,只执行一次) ==========\n // 设计思想:图层实例一旦创建,就应该尽可能复用,避免频繁创建/销毁\n // 依赖项:只依赖 [map, showAnnotation, attribution],确保只在地图实例初始化时执行一次\n useEffect(() => {\n if (!map) return;\n\n // 创建底图图层(初始为空 URL,URL 由后续的 useEffect 更新)\n const baseLayer = L.tileLayer('', {\n subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],\n maxZoom: 18,\n minZoom: 0,\n attribution: attribution === null ? undefined : attribution,\n }).addTo(map);\n baseLayerRef.current = baseLayer;\n\n // 创建标注图层\n if (showAnnotation) {\n const annotationLayer = L.tileLayer('', {\n subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],\n maxZoom: 18,\n minZoom: 0,\n attribution: attribution === null ? undefined : attribution,\n }).addTo(map);\n annotationLayerRef.current = annotationLayer;\n }\n\n // 清理函数:只在组件卸载时执行\n return () => {\n if (baseLayerRef.current) {\n baseLayerRef.current.remove();\n baseLayerRef.current = null;\n }\n if (annotationLayerRef.current) {\n annotationLayerRef.current.remove();\n annotationLayerRef.current = null;\n }\n if (overlayLayerRef.current) {\n overlayLayerRef.current.remove();\n overlayLayerRef.current = null;\n }\n };\n }, [map, showAnnotation, attribution]); // 依赖 map, showAnnotation, attribution\n\n // ========== 2. 底图 URL 更新(独立于创建逻辑) ==========\n // 设计思想:URL 变化时,使用 layer.setUrl() 更新,而不是删除重建图层\n // 优势:避免触发大量瓦片请求,提升性能\n // 依赖项:只依赖 URL 相关的 props [tileUrl, currentLayerType, apiKey]\n useEffect(() => {\n if (!baseLayerRef.current) return;\n\n const useCustomUrl = !!tileUrl;\n const layerConfig = LAYER_URLS[currentLayerType] || LAYER_URLS[LAYER_TYPES.VECTOR];\n const url = useCustomUrl && tileUrl ? tileUrl : layerConfig.base.replace('{key}', apiKey || '');\n\n // 使用 setUrl() 更新图层 URL,Leaflet 会自动处理瓦片过渡\n baseLayerRef.current.setUrl(url);\n }, [tileUrl, currentLayerType, apiKey]); // 只依赖 URL 相关的 props\n\n // ========== 3. 标注 URL 更新 ==========\n // 设计思想:与底图 URL 更新相同,使用 setUrl() 而非重建\n // 依赖项:[annotationUrl, tileUrl, currentLayerType, apiKey, showAnnotation]\n useEffect(() => {\n if (!annotationLayerRef.current || !showAnnotation) return;\n\n const useCustomUrl = !!tileUrl;\n const layerConfig = LAYER_URLS[currentLayerType] || LAYER_URLS[LAYER_TYPES.VECTOR];\n const url =\n useCustomUrl && annotationUrl\n ? annotationUrl\n : layerConfig.annotation.replace('{key}', apiKey || '');\n\n if (url) {\n annotationLayerRef.current.setUrl(url);\n } else if (annotationLayerRef.current) {\n // 如果没有标注 URL,移除标注图层\n annotationLayerRef.current.remove();\n annotationLayerRef.current = null;\n }\n }, [annotationUrl, tileUrl, currentLayerType, apiKey, showAnnotation]);\n\n // ========== 4. 叠加图层处理 ==========\n // 设计思想:叠加图层(overlay)独立管理,因为它的 URL 模式不同\n // 依赖项:[map, overlayUrl]\n useEffect(() => {\n if (!map) return;\n\n // 清理旧的叠加图层\n if (overlayLayerRef.current) {\n overlayLayerRef.current.remove();\n overlayLayerRef.current = null;\n }\n\n // 创建新的叠加图层\n if (overlayUrl) {\n const overlayLayer = L.tileLayer(`${overlayUrl}/{z}/{x}/{y}.webp`, {\n subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],\n maxZoom: 18,\n minZoom: 0,\n }).addTo(map);\n overlayLayerRef.current = overlayLayer;\n }\n }, [map, overlayUrl]);\n\n // 图层选择器组件\n const LayerSelector = showLayerSelector && map && (\n <div className=\"tianditu-layer-selector\" data-theme={theme}>\n <div\n className=\"tianditu-layer-selector-btn\"\n onClick={() => setSelectorVisible(!selectorVisible)}\n >\n <div className=\"tianditu-layer-selector-preview\" data-type={currentLayerType} />\n <span className=\"tianditu-layer-selector-label\">{LAYER_LABELS[currentLayerType]}</span>\n </div>\n {selectorVisible && (\n <div className=\"tianditu-layer-selector-dropdown\">\n {([LAYER_TYPES.VECTOR, LAYER_TYPES.SATELLITE, LAYER_TYPES.TERRAIN] as LayerType[]).map(\n type => (\n <div\n key={type}\n className={`tianditu-layer-selector-item ${currentLayerType === type ? 'active' : ''}`}\n onClick={() => handleLayerChange(type)}\n >\n <div className=\"tianditu-layer-selector-preview\" data-type={type} />\n <span className=\"tianditu-layer-selector-label\">{LAYER_LABELS[type]}</span>\n </div>\n )\n )}\n </div>\n )}\n </div>\n );\n\n // 如果地图未初始化,返回 null\n if (!map) return null;\n\n return <>{LayerSelector && createPortal(LayerSelector, map.getContainer())}</>;\n});\n\nTianDiTuLayer.displayName = 'TianDiTuLayer';\n\nexport default TianDiTuLayer;\n\n// 重新导出深色滤镜工具函数供其他组件使用\nexport { ensureDarkFilterInjected } from '../../utils/darkThemeFilter';\n","/**\n * 双向标尺组件\n * @description 在地图上同时显示水平和垂直两个标尺,覆盖整个地图窗口\n * @since 2.0.0 已移除 react-leaflet 依赖\n * @since 2.0.0 缩放控件已独立为 ZoomControl 组件\n */\n\nimport { useEffect, useRef, type MutableRefObject } from 'react';\nimport L from 'leaflet';\nimport { useMap } from '../../context/MapContext';\nimport { useConfig } from '../../context/ConfigContext';\nimport type { DualScaleControlProps, DualScaleControlConfig } from '../../types';\nimport { LAYER_TYPES } from '../TianDiTuLayer';\n\n// 将十六进制颜色转换为 rgba 字符串\nconst hexToRgba = (hex: string): string => {\n // 处理 #rrggbb 格式\n if (hex.length === 7) {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, 1)`;\n }\n // 处理 #rrggbbaa 格式(带透明度)\n if (hex.length === 9) {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n const a = parseInt(hex.slice(7, 9), 16) / 255;\n return `rgba(${r}, ${g}, ${b}, ${a.toFixed(2)})`;\n }\n // 如果是 rgba 或 rgb 格式,直接返回\n return hex;\n};\n\n/**\n * 双向标尺组件\n */\nconst DualScaleControl = ({\n config: configProp,\n theme: themeProp,\n layerType,\n scaleColor: scaleColorProp,\n controlBg: controlBgProp,\n controlText: controlTextProp,\n}: DualScaleControlProps): null => {\n // 从 ConfigProvider 获取配置\n const configContext = useConfig();\n\n // 获取 map 实例\n const map = useMap();\n\n // 解析配置:优先使用 props,其次使用 ConfigProvider\n const getConfig = (config: DualScaleControlConfig | undefined): DualScaleControlConfig => {\n return {\n metric: config?.metric ?? true,\n imperial: config?.imperial ?? false,\n scaleColor: config?.scaleColor,\n controlBg: config?.controlBg,\n controlText: config?.controlText,\n };\n };\n\n // 判断是否显示\n // - 如果 props 传了 config,则按 props 显示(包括空对象 {} 也会显示默认配置)\n // - 如果 props 没传 config,则看 ConfigProvider 的 dualScaleControl\n // - 如果 dualScaleControl 为 false,不显示\n // - 如果 dualScaleControl 为 undefined(没配置),显示默认\n // - 如果 dualScaleControl 为对象,使用该配置\n const shouldShow = () => {\n if (configProp !== undefined) {\n return true; // props 传了配置就显示\n }\n const contextConfig = configContext.dualScaleControl;\n return contextConfig !== false; // undefined 或对象都显示\n };\n\n // 如果不显示,返回 null\n if (!shouldShow()) {\n return null;\n }\n\n // 获取最终配置\n const finalConfig =\n configProp !== undefined\n ? configProp\n : configContext.dualScaleControl === false\n ? undefined\n : configContext.dualScaleControl;\n\n const { metric, imperial } = getConfig(finalConfig);\n\n // 主题:优先使用 props,其次使用 ConfigProvider\n const theme = themeProp || configContext.theme || 'light';\n\n // 提前初始化 refs,避免条件调用\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const containerRef: MutableRefObject<HTMLElement | null> = useRef(null);\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const scaleRef: MutableRefObject<HTMLElement | null> = useRef(null);\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const textRef: MutableRefObject<HTMLElement | null> = useRef(null);\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useEffect(() => {\n // null 检查\n if (!map) return;\n\n // 使用局部变量避免闭包中的 null 检查问题\n const mapInstance = map;\n let animationFrameId: number | null = null;\n let isCleanup = false;\n\n // 获取地图容器\n const mapContainer = mapInstance.getContainer();\n\n // 清理所有已存在的旧 container(防止重复)\n const existingContainers = mapContainer.querySelectorAll('.leaflet-control-dual-scale');\n existingContainers.forEach(el => {\n el.remove();\n });\n\n // 创建覆盖层容器,添加主题类名\n const container = L.DomUtil.create(\n 'div',\n `leaflet-control-dual-scale${theme === 'dark' ? ' dark' : ''}`\n );\n containerRef.current = container;\n\n // 创建 scale 容器(覆盖整个地图窗口)\n const scale = L.DomUtil.create('div', 'scale', container);\n scaleRef.current = scale;\n\n // 创建文本显示\n const textEl = L.DomUtil.create('div', 'scale-text', container);\n textRef.current = textEl;\n\n // 直接设置样式确保生效(避免 CSS 缓存问题)\n // 根据图层类型和主题组合确定颜色\n // satellite 在 light 主题下需要深色(卫星影像较暗)\n // terrain 在 dark 主题下需要浅色(地形图层较亮)\n // 优先级:props > config > 自动计算\n const getControlColors = () => {\n // 如果用户配置了颜色,直接使用\n if (scaleColorProp || controlBgProp || controlTextProp) {\n return {\n bg:\n controlBgProp ||\n (theme === 'dark' ? 'rgba(0, 0, 0, 0.7)' : 'rgba(255, 255, 255, 0.85)'),\n text: controlTextProp || (theme === 'dark' ? '#fff' : '#333'),\n scaleColor: scaleColorProp\n ? hexToRgba(scaleColorProp)\n : theme === 'dark'\n ? 'rgba(255, 255, 255, 0.7)'\n : 'rgba(51, 51, 51, 0.7)',\n };\n }\n\n // 如果 config 中配置了颜色,使用 config\n if (finalConfig?.scaleColor || finalConfig?.controlBg || finalConfig?.controlText) {\n return {\n bg:\n finalConfig.controlBg ||\n (theme === 'dark' ? 'rgba(0, 0, 0, 0.7)' : 'rgba(255, 255, 255, 0.85)'),\n text: finalConfig.controlText || (theme === 'dark' ? '#fff' : '#333'),\n scaleColor: finalConfig.scaleColor\n ? hexToRgba(finalConfig.scaleColor)\n : theme === 'dark'\n ? 'rgba(255, 255, 255, 0.7)'\n : 'rgba(51, 51, 51, 0.7)',\n };\n }\n\n // 否则根据图层类型和主题自动计算\n const isSatelliteLight = layerType === LAYER_TYPES.SATELLITE && theme === 'light';\n const isTerrainDark = layerType === LAYER_TYPES.TERRAIN && theme === 'dark';\n\n // 需要深色控件的情况:dark 主题 或 satellite + light(但 terrain + dark 除外)\n const needDarkControl = (theme === 'dark' || isSatelliteLight) && !isTerrainDark;\n\n if (needDarkControl) {\n return {\n bg: 'rgba(0, 0, 0, 0.7)',\n text: '#fff',\n scaleColor: 'rgba(255, 255, 255, 0.7)',\n };\n } else {\n return {\n bg: 'rgba(255, 255, 255, 0.85)',\n text: '#333',\n scaleColor: 'rgba(51, 51, 51, 0.7)',\n };\n }\n };\n\n const { bg: controlBg, text: controlText, scaleColor } = getControlColors();\n textEl.style.backgroundColor = controlBg;\n textEl.style.color = controlText;\n // 直接设置 scale 元素的颜色变量\n scale.style.setProperty('--scale-color', scaleColor);\n\n // 添加到地图容器\n mapContainer.appendChild(container);\n\n // 获取合适的刻度距离值(1, 2, 5 的倍数)\n const getRoundNum = (distance: number): number => {\n if (distance <= 0 || !isFinite(distance)) return 1;\n\n const exponent = Math.floor(Math.log(distance) / Math.LN10);\n const fraction = distance / Math.pow(10, exponent);\n let roundedFraction: number;\n\n if (fraction < 1.5) {\n roundedFraction = 1;\n } else if (fraction < 3.5) {\n roundedFraction = 2;\n } else if (fraction < 7.5) {\n roundedFraction = 5;\n } else {\n roundedFraction = 10;\n }\n\n return roundedFraction * Math.pow(10, exponent);\n };\n\n // 获取所有候选的 Nice Meters\n const getCandidateMeters = (targetMeters: number): number[] => {\n if (targetMeters <= 0 || !isFinite(targetMeters)) return [1];\n\n const exponent = Math.floor(Math.log(targetMeters) / Math.LN10);\n const base = Math.pow(10, exponent);\n\n // 返回 1, 2, 5 倍数的候选值\n return [\n base * 0.5, // 小一级的 5\n base * 1, // 当前级的 1\n base * 2, // 当前级的 2\n base * 5, // 当前级的 5\n base * 10, // 大一级的 1\n ].filter(m => m > 0);\n };\n\n // 更新函数\n const update = (): void => {\n // 检查是否已清理或销毁\n if (isCleanup || isDestroyed) return;\n\n // 检查地图是否已完全初始化\n const mapAny = mapInstance as L.Map & { _loaded?: boolean; _mapPane?: HTMLElement };\n if (!mapAny._loaded || !mapAny._mapPane) return;\n\n // 检查地图容器是否存在(防止在销毁后调用)\n try {\n const mapContainer = mapInstance.getContainer();\n if (!mapContainer || !document.contains(mapContainer)) return;\n } catch {\n // 如果获取容器失败,说明地图可能已被销毁\n return;\n }\n\n const mapSize = mapInstance.getSize();\n const bounds = mapInstance.getBounds();\n\n // 计算地图可视范围的实际距离\n const west = bounds.getWest();\n const east = bounds.getEast();\n const centerLat = bounds.getCenter().lat;\n const point1 = L.latLng(centerLat, west);\n const point2 = L.latLng(centerLat, east);\n const maxMeters = mapInstance.distance(point1, point2);\n\n // 计算每像素对应的米数\n const metersPerPixel = maxMeters / mapSize.x;\n\n // 计算合适的刻度间隔(像素)\n // 目标:每个刻度间隔在 40-80 像素之间\n const targetPixels = 60;\n const targetMeters = metersPerPixel * targetPixels;\n\n // 获取候选值并选择最接近目标的\n const candidates = getCandidateMeters(targetMeters);\n let bestMeters = candidates[0];\n let bestDiff = Infinity;\n\n candidates.forEach(meters => {\n const pixels = meters / metersPerPixel;\n const diff = Math.abs(pixels - targetPixels);\n if (diff < bestDiff) {\n bestDiff = diff;\n bestMeters = meters;\n }\n });\n\n const tickInterval = Math.max(30, Math.min(100, Math.round(bestMeters / metersPerPixel)));\n\n // 设置 CSS 变量到 scale 和 textEl\n if (scaleRef.current) {\n scaleRef.current.style.setProperty('--tick-interval', tickInterval + 'px');\n }\n if (textRef.current) {\n textRef.current.style.setProperty('--tick-interval', tickInterval + 'px');\n }\n\n // 计算显示距离\n const displayDistance = getRoundNum(maxMeters * 0.1); // 显示约 1/10 地图宽度的距离\n\n let displayText = '';\n if (metric) {\n displayText = getMetricText(displayDistance);\n }\n if (imperial) {\n if (displayText) displayText += ' / ';\n displayText += getImperialText(displayDistance);\n }\n if (textRef.current) {\n textRef.current.textContent = displayText;\n }\n };\n\n const getMetricText = (distance: number): string => {\n if (distance >= 1000) {\n return (distance / 1000).toFixed(1) + ' km';\n }\n if (distance < 1) {\n return (distance * 100).toFixed(0) + ' cm';\n }\n if (distance < 10) {\n return distance.toFixed(1) + ' m';\n }\n return distance.toFixed(0) + ' m';\n };\n\n const getImperialText = (distance: number): string => {\n const feet = distance * 3.28084;\n if (feet >= 5280) {\n return (feet / 5280).toFixed(1) + ' mi';\n }\n if (feet < 1) {\n return (feet * 12).toFixed(0) + ' in';\n }\n return feet.toFixed(0) + ' ft';\n };\n\n // 标记是否已销毁\n let isDestroyed = false;\n\n // 包装 update 函数,在调用前检查是否已销毁\n const safeUpdate = () => {\n if (!isDestroyed && !isCleanup) {\n update();\n }\n };\n\n // 初始化 - 使用 RAF 确保地图已完全渲染\n animationFrameId = requestAnimationFrame(() => {\n if (!isDestroyed && !isCleanup) {\n const mapAny = mapInstance as L.Map & { _loaded?: boolean; _mapPane?: HTMLElement };\n if (mapAny._loaded && mapAny._mapPane) {\n update();\n }\n }\n });\n\n // 监听地图事件\n mapInstance.on('moveend', safeUpdate);\n mapInstance.on('zoomend', safeUpdate);\n mapInstance.on('resize', safeUpdate);\n\n // 清理函数\n return () => {\n isCleanup = true;\n isDestroyed = true;\n if (animationFrameId) {\n cancelAnimationFrame(animationFrameId);\n }\n mapInstance.off('moveend', safeUpdate);\n mapInstance.off('zoomend', safeUpdate);\n mapInstance.off('resize', safeUpdate);\n if (container && mapContainer.contains(container)) {\n mapContainer.removeChild(container);\n }\n };\n }, [\n map,\n metric,\n imperial,\n theme,\n layerType,\n scaleColorProp,\n controlBgProp,\n controlTextProp,\n finalConfig,\n ]);\n\n return null;\n};\n\nexport default DualScaleControl;\n","/**\n * 地图尺寸处理器组件\n * @description 解决地图容器尺寸变化后(如抽屉/对话框打开),地图不自动刷新的问题\n * @module components/MapSizeHandler\n * @since 2.0.0 已移除 react-leaflet 依赖\n *\n * ## 解决的问题\n *\n * 当地图容器的 DOM 尺寸发生变化时,Leaflet 地图**不会自动重新计算和渲染**,\n * 导致地图显示异常(如:瓦片缺失、只显示一部分、标尺位置错误等)。\n *\n * 常见触发场景:\n * - 抽屉/侧边栏打开或关闭\n * - 对话框弹出\n * - 窗口大小调整\n * - Tab 切换导致容器从隐藏变为显示\n * - 父容器动态改变尺寸\n *\n * ## 核心原理\n *\n * 调用 Leaflet 的 `map.invalidateSize()` 方法,通知地图重新计算容器尺寸并刷新视图。\n *\n * ## 配置参数\n *\n * | 参数 | 说明 | 类型 | 默认值 |\n * |------|------|------|--------|\n * | enabled | 是否启用尺寸处理 | boolean | true |\n * | delay | 每次刷新的间隔时间(毫秒) | number | 100 |\n * | retries | 调用 invalidateSize 的次数 | number | 3 |\n *\n * ## 工作流程\n *\n * 组件挂载后会多次调用 invalidateSize:\n * - 延迟 100ms → invalidateSize()\n * - 延迟 200ms → invalidateSize()\n * - 延迟 300ms → invalidateSize()\n * - (共重试 retries 次,确保容器完全渲染)\n *\n * **为什么需要多次重试?**\n * 因为某些 CSS 动画或布局变化需要时间完成,单次调用可能无法捕获最终尺寸。\n *\n * @example\n * // 方式1:通过 MapContainer 的 mapSizeHandler 属性(推荐)\n * <MapContainer\n * center={[30, 120]}\n * zoom={10}\n * mapSizeHandler // 启用默认配置\n * />\n *\n * // 方式2:自定义配置\n * <MapContainer\n * center={[30, 120]}\n * zoom={10}\n * mapSizeHandler={{ delay: 200, retries: 5 }}\n * />\n *\n * // 方式3:禁用\n * <MapContainer\n * center={[30, 120]}\n * zoom={10}\n * mapSizeHandler={false}\n * />\n *\n * // 方式4:在 ConfigProvider 中配置(用于 MapProvider + MapContent 模式)\n * <ConfigProvider mapSizeHandler={{ delay: 200, retries: 5 }}>\n * <MapProvider center={[30, 120]} zoom={10}>\n * <MapContent />\n * </MapProvider>\n * </ConfigProvider>\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useMap } from '../../context/MapContext';\nimport type { MapSizeHandlerConfig } from '../../types';\n\n/**\n * 地图尺寸处理器组件\n * @description 通过多次调用 invalidateSize 确保地图在容器尺寸变化后正确渲染\n *\n * @example\n * // 在 MapContent 中自动使用,通过 ConfigProvider 配置\n * <ConfigProvider mapSizeHandler>\n * <MapProvider center={[30, 120]} zoom={10}>\n * <MapContent />\n * </MapProvider>\n * </ConfigProvider>\n *\n * // 自定义配置\n * <ConfigProvider mapSizeHandler={{ delay: 200, retries: 5 }}>\n * ...\n * </ConfigProvider>\n */\nconst MapSizeHandler = ({\n enabled = true,\n delay = 100,\n retries = 3,\n}: MapSizeHandlerConfig = {}): null => {\n const map = useMap();\n const initialized = useRef(false);\n\n useEffect(() => {\n if (!enabled || !map || initialized.current) return;\n initialized.current = true;\n\n // 多次调用 invalidateSize 以确保容器已完全渲染\n const timers = Array.from({ length: retries }, (_, i) =>\n setTimeout(() => map!.invalidateSize(), delay * (i + 1))\n );\n\n return () => timers.forEach(clearTimeout);\n }, [map, enabled, delay, retries]);\n\n return null;\n};\n\nexport default MapSizeHandler;\n","/**\n * 缩放控件组件\n * @description 提供放大、缩小按钮和缩放级别显示\n * @module components/ZoomControl\n * @since 2.0.0\n */\n\nimport { useEffect, useMemo, useRef, type MutableRefObject } from 'react';\nimport L from 'leaflet';\nimport { useMap } from '../../context/MapContext';\nimport { useConfig } from '../../context/ConfigContext';\nimport type { ZoomControlPosition } from '../../types';\n\n/**\n * 缩放控件配置\n */\nexport interface ZoomControlConfig {\n /** 控件位置 */\n position?: ZoomControlPosition;\n /** 控件背景色 */\n controlBg?: string;\n /** 控件文字颜色 */\n controlText?: string;\n}\n\n/**\n * 缩放控件属性\n */\nexport interface ZoomControlProps {\n /** 控件位置,默认 'bottomleft' */\n position?: ZoomControlPosition;\n /** 控件背景色 */\n controlBg?: string;\n /** 控件文字颜色 */\n controlText?: string;\n /** 主题模式 */\n theme?: 'light' | 'dark';\n}\n\n/**\n * ZoomControl 缩放控件组件\n *\n * @description\n * 提供地图缩放控制功能:\n * - 放大/缩小按钮\n * - 当前缩放级别显示\n * - 支持四个位置:topleft、topright、bottomleft、bottomright\n * - 自动适配主题(light/dark)\n *\n * @example\n * ```tsx\n * import { ZoomControl } from 'agri-map-components';\n *\n * // 基础用法\n * <ZoomControl />\n *\n * // 自定义位置\n * <ZoomControl position=\"topright\" />\n *\n * // 自定义颜色\n * <ZoomControl controlBg=\"rgba(0, 0, 0, 0.8)\" controlText=\"#fff\" />\n * ```\n */\nconst ZoomControl: React.FC<ZoomControlProps> = ({\n position = 'bottomleft',\n controlBg: controlBgProp,\n controlText: controlTextProp,\n theme: themeProp,\n}): null => {\n const map = useMap();\n const configContext = useConfig();\n const zoomControlRef: MutableRefObject<HTMLElement | null> = useRef(null);\n const zoomLevelRef: MutableRefObject<HTMLElement | null> = useRef(null);\n\n // 主题:优先使用 props,其次使用 ConfigProvider\n const theme = themeProp || configContext.theme || 'light';\n\n // 获取控件颜色\n const controlColors = useMemo(() => {\n if (controlBgProp || controlTextProp) {\n return {\n bg:\n controlBgProp || (theme === 'dark' ? 'rgba(0, 0, 0, 0.7)' : 'rgba(255, 255, 255, 0.85)'),\n text: controlTextProp || (theme === 'dark' ? '#fff' : '#333'),\n };\n }\n return {\n bg: theme === 'dark' ? 'rgba(0, 0, 0, 0.7)' : 'rgba(255, 255, 255, 0.85)',\n text: theme === 'dark' ? '#fff' : '#333',\n };\n }, [theme, controlBgProp, controlTextProp]);\n\n useEffect(() => {\n // 确保 map 实例已准备好\n if (!map) return;\n\n const mapContainer = map.getContainer();\n const { bg: controlBg, text: controlText } = controlColors;\n\n // 清理已存在的旧控件(防止重复)\n const existingControls = mapContainer.querySelectorAll('.agri-zoom-control');\n existingControls.forEach(el => el.remove());\n\n // 创建缩放控件容器\n const zoomControl = L.DomUtil.create(\n 'div',\n `agri-zoom-control${theme === 'dark' ? ' dark' : ''}`\n );\n zoomControlRef.current = zoomControl;\n\n // 检测图层选择器是否可见(在右下角)\n const layerSelector = mapContainer.querySelector('.tianditu-layer-selector');\n const hasLayerSelector = layerSelector && layerSelector.checkVisibility();\n\n // 根据位置设置样式\n // 注意:左侧位置(topleft、bottomleft)需要为垂直标尺留出空间(30px)\n // bottomright 位置如果有图层选择器,需要向上移动避免遮挡(100px)\n const positionStyles: Record<ZoomControlPosition, React.CSSProperties> = {\n topleft: {\n top: '10px',\n left: '30px',\n bottom: 'auto',\n right: 'auto',\n },\n topright: {\n top: '10px',\n right: '10px',\n bottom: 'auto',\n left: 'auto',\n },\n bottomleft: {\n bottom: '50px', // 为底部水平标尺留出空间\n left: '30px', // 为左侧垂直标尺留出空间\n top: 'auto',\n right: 'auto',\n },\n bottomright: {\n bottom: hasLayerSelector ? '100px' : '10px',\n right: '10px',\n top: 'auto',\n left: 'auto',\n },\n };\n\n Object.assign(zoomControl.style, positionStyles[position]);\n\n // 放大按钮\n const zoomIn = L.DomUtil.create('button', 'zoom-btn zoom-in', zoomControl);\n zoomIn.innerHTML = '+';\n zoomIn.title = '放大';\n zoomIn.style.backgroundColor = controlBg;\n zoomIn.style.color = controlText;\n\n // 缩放级别显示\n const zoomLevel = L.DomUtil.create('div', 'zoom-level', zoomControl);\n zoomLevelRef.current = zoomLevel;\n zoomLevel.style.backgroundColor = controlBg;\n zoomLevel.style.color = controlText;\n\n // 缩小按钮\n const zoomOut = L.DomUtil.create('button', 'zoom-btn zoom-out', zoomControl);\n zoomOut.innerHTML = '−';\n zoomOut.title = '缩小';\n zoomOut.style.backgroundColor = controlBg;\n zoomOut.style.color = controlText;\n\n // 绑定事件\n L.DomEvent.on(zoomIn, 'click', e => {\n L.DomEvent.stopPropagation(e);\n L.DomEvent.preventDefault(e);\n map.zoomIn();\n });\n\n L.DomEvent.on(zoomOut, 'click', e => {\n L.DomEvent.stopPropagation(e);\n L.DomEvent.preventDefault(e);\n map.zoomOut();\n });\n\n // 更新缩放级别显示\n const updateZoomLevel = (): void => {\n if (zoomLevelRef.current) {\n zoomLevelRef.current.textContent = String(map.getZoom());\n }\n };\n updateZoomLevel();\n map.on('zoomend', updateZoomLevel);\n\n // 添加到地图容器\n mapContainer.appendChild(zoomControl);\n\n // 监听图层选择器的可见性变化,动态调整位置\n let layerSelectorObserver: MutationObserver | null = null;\n if (layerSelector) {\n layerSelectorObserver = new MutationObserver(() => {\n const isVisible = layerSelector.checkVisibility();\n if (zoomControlRef.current && position === 'bottomright') {\n zoomControlRef.current.style.bottom = isVisible ? '100px' : '10px';\n }\n });\n\n layerSelectorObserver.observe(layerSelector, {\n attributes: true,\n attributeFilter: ['style', 'class'],\n subtree: true,\n });\n }\n\n // 清理函数\n return () => {\n map.off('zoomend', updateZoomLevel);\n if (layerSelectorObserver) {\n layerSelectorObserver.disconnect();\n }\n if (zoomControl && mapContainer.contains(zoomControl)) {\n mapContainer.removeChild(zoomControl);\n }\n };\n }, [map, position, theme, controlColors]);\n\n return null;\n};\n\nexport default ZoomControl;\n","/**\n * 全屏控件组件\n * @description 提供地图全屏切换功能\n * @module components/FullscreenControl\n * @since 2.1.0\n */\n\nimport { useEffect, useRef, type MutableRefObject } from 'react';\nimport L from 'leaflet';\nimport { useMap } from '../../context/MapContext';\nimport { useConfig } from '../../context/ConfigContext';\nimport type { FullscreenControlPosition } from '../../types';\n\n// 空函数,用于清理事件监听器\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst noop = () => {};\n\n/**\n * 全屏控件属性\n */\nexport interface FullscreenControlProps {\n /** 控件位置,默认 'topleft' */\n position?: FullscreenControlPosition;\n /** 控件背景色 */\n controlBg?: string;\n /** 控件文字颜色 */\n controlText?: string;\n /** 主题模式 */\n theme?: 'light' | 'dark';\n}\n\n/**\n * FullscreenControl 全屏控件组件\n *\n * @description\n * 提供地图全屏切换功能:\n * - 点击按钮进入/退出全屏\n * - 支持四个位置:topleft、topright、bottomleft、bottomright\n * - 自动适配主题(light/dark)\n * - 全屏状态自动更新按钮图标\n *\n * @example\n * ```tsx\n * import { FullscreenControl } from 'agri-map-components';\n *\n * // 基础用法\n * <FullscreenControl />\n *\n * // 自定义位置\n * <FullscreenControl position=\"topright\" />\n *\n * // 自定义颜色\n * <FullscreenControl controlBg=\"rgba(0, 0, 0, 0.8)\" controlText=\"#fff\" />\n * ```\n */\nconst FullscreenControl: React.FC<FullscreenControlProps> = ({\n position = 'topleft',\n controlBg: controlBgProp,\n controlText: controlTextProp,\n theme: themeProp,\n}): null => {\n const map = useMap();\n const configContext = useConfig();\n const fullscreenControlRef: MutableRefObject<HTMLElement | null> = useRef(null);\n\n // 主题:优先使用 props,其次使用 ConfigProvider\n const theme = themeProp || configContext.theme || 'light';\n\n // 计算控件颜色\n const controlBg =\n controlBgProp || (theme === 'dark' ? 'rgba(0, 0, 0, 0.7)' : 'rgba(255, 255, 255, 0.85)');\n const controlText = controlTextProp || (theme === 'dark' ? '#fff' : '#333');\n\n useEffect(() => {\n // 确保 map 实例已准备好\n if (!map) return;\n\n const mapContainer = map.getContainer();\n\n // 清理已存在的旧控件(防止重复)\n const existingControls = mapContainer.querySelectorAll('.agri-fullscreen-control');\n existingControls.forEach(el => el.remove());\n\n // 创建全屏控件容器\n const fullscreenControl = L.DomUtil.create('div', 'agri-fullscreen-control');\n fullscreenControlRef.current = fullscreenControl;\n\n // 检测图层选择器是否可见(在右下角)\n const layerSelector = mapContainer.querySelector('.tianditu-layer-selector');\n const hasLayerSelector = layerSelector && layerSelector.checkVisibility();\n\n // 根据位置设置样式\n const positionStyles: Record<FullscreenControlPosition, React.CSSProperties> = {\n topleft: {\n position: 'absolute',\n top: '10px',\n left: '10px',\n bottom: 'auto',\n right: 'auto',\n zIndex: 1000,\n },\n topright: {\n position: 'absolute',\n top: '10px',\n right: '10px',\n bottom: 'auto',\n left: 'auto',\n zIndex: 1000,\n },\n bottomleft: {\n position: 'absolute',\n bottom: '10px',\n left: '10px',\n top: 'auto',\n right: 'auto',\n zIndex: 1000,\n },\n bottomright: {\n position: 'absolute',\n bottom: hasLayerSelector ? '100px' : '10px',\n right: '10px',\n top: 'auto',\n left: 'auto',\n zIndex: 1000,\n },\n };\n\n Object.assign(fullscreenControl.style, positionStyles[position]);\n\n // 设置控件基础样式\n Object.assign(fullscreenControl.style, {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n backgroundColor: controlBg,\n borderRadius: '4px',\n cursor: 'pointer',\n boxShadow: '0 1px 3px rgba(0, 0, 0, 0.3)',\n transition: 'background-color 0.2s',\n });\n\n // 鼠标悬停效果\n fullscreenControl.addEventListener('mouseenter', () => {\n fullscreenControl.style.backgroundColor =\n theme === 'dark' ? 'rgba(0, 0, 0, 0.9)' : 'rgba(255, 255, 255, 0.95)';\n });\n\n fullscreenControl.addEventListener('mouseleave', () => {\n fullscreenControl.style.backgroundColor = controlBg;\n });\n\n // 创建图标容器\n const iconContainer = L.DomUtil.create('div', 'agri-fullscreen-icon', fullscreenControl);\n Object.assign(iconContainer.style, {\n width: '20px',\n height: '20px',\n color: controlText,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n });\n\n // 渲染图标\n const renderIcon = (isFullscreen: boolean) => {\n iconContainer.innerHTML = isFullscreen\n ? `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"${controlText}\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 3v3a2 2 0 0 1-2 2H3m13 0h3a2 2 0 0 1 2 2v3m0 13v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3\"/></svg>`\n : `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"${controlText}\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\"/></svg>`;\n };\n\n // 初始渲染图标\n const isCurrentlyFullscreen = !!document.fullscreenElement;\n renderIcon(isCurrentlyFullscreen);\n\n // 监听全屏状态变化\n const handleFullscreenChange = () => {\n const isFullscreen = !!document.fullscreenElement;\n renderIcon(isFullscreen);\n };\n\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n\n // 点击事件\n const handleClick = (e: Event) => {\n L.DomEvent.stopPropagation(e);\n L.DomEvent.preventDefault(e);\n\n if (!document.fullscreenElement) {\n // 进入全屏\n mapContainer.requestFullscreen?.().catch(err => {\n console.error('全屏模式启用失败:', err);\n });\n } else {\n // 退出全屏\n document.exitFullscreen?.().catch(err => {\n console.error('全屏模式退出失败:', err);\n });\n }\n };\n\n fullscreenControl.addEventListener('click', handleClick);\n\n // 添加到地图容器\n mapContainer.appendChild(fullscreenControl);\n\n // 监听图层选择器的可见性变化,动态调整位置\n let layerSelectorObserver: MutationObserver | null = null;\n if (layerSelector) {\n layerSelectorObserver = new MutationObserver(() => {\n const isVisible = layerSelector.checkVisibility();\n if (fullscreenControlRef.current && position === 'bottomright') {\n fullscreenControlRef.current.style.bottom = isVisible ? '100px' : '10px';\n }\n });\n\n layerSelectorObserver.observe(layerSelector, {\n attributes: true,\n attributeFilter: ['style', 'class'],\n subtree: true,\n });\n }\n\n // 清理函数\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n fullscreenControl.removeEventListener('click', handleClick);\n fullscreenControl.removeEventListener('mouseenter', noop);\n fullscreenControl.removeEventListener('mouseleave', noop);\n if (layerSelectorObserver) {\n layerSelectorObserver.disconnect();\n }\n if (fullscreenControl && mapContainer.contains(fullscreenControl)) {\n mapContainer.removeChild(fullscreenControl);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, position, theme, controlBgProp, controlTextProp]);\n\n return null;\n};\n\nexport default FullscreenControl;\n","/**\n * 同心圆脉冲图标 SVG 生成器\n * @description 生成带扩散/收缩脉冲动画的同心圆地图标记 SVG\n */\n\nimport type { PresetIconName } from '../types/icon';\n\n/** 脉冲图标颜色配置 */\nconst PULSE_COLORS: Record<string, { outer: string; inner: string }> = {\n 'pulse-blue': { outer: '#D7EDFE', inner: '#409FFF' },\n 'pulse-green': { outer: '#D4EDDA', inner: '#52C41A' },\n 'pulse-red': { outer: '#F8D7DA', inner: '#E53935' },\n 'pulse-orange': { outer: '#FFE0B2', inner: '#FB8C00' },\n 'pulse-purple': { outer: '#E8DAEF', inner: '#7C4DFF' },\n 'pulse-arrow': { outer: '#FFB199', inner: '#FF6C35' },\n};\n\n/**\n * 生成同心圆脉冲图标 SVG\n * @param iconType - 标记类型(pulse/pulse-blue/green/red/orange/purple/arrow)\n * @param width - SVG 宽度\n * @param height - SVG 高度\n * @param animated - 是否启用脉冲动画\n * @param color - 可选的自定义颜色,当 iconType 为 'pulse' 时使用此颜色\n * @returns SVG HTML 字符串,非脉冲图标返回空字符串\n */\nexport function generatePulseSvg(\n iconType: PresetIconName,\n width: number,\n height: number,\n animated: boolean,\n color?: string\n): string {\n // 'pulse' 类型使用传入的 color 生成双色脉冲\n if (iconType === 'pulse') {\n const pulseColor = color || '#52c41a';\n return generateUniversalPulseSvg(width, height, animated, pulseColor);\n }\n\n const colors = PULSE_COLORS[iconType];\n if (!colors) return '';\n\n // pulse-arrow 特殊处理:带箭头的脉冲图标\n if (iconType === 'pulse-arrow') {\n return generatePulseArrowSvg(width, height, animated, colors);\n }\n\n // 外圈扩散动画:从 r=256 放大到 r=384 同时 opacity 从 1→0,模拟波纹\n const outerAnim = animated\n ? `<circle cx=\"512\" cy=\"512\" r=\"256\" fill=\"${colors.outer}\">\n <animate attributeName=\"r\" values=\"256;384;256\" dur=\"2s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n <animate attributeName=\"opacity\" values=\"1;0;1\" dur=\"2s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>\n <circle cx=\"512\" cy=\"512\" r=\"256\" fill=\"${colors.outer}\" opacity=\"0.6\">\n <animate attributeName=\"r\" values=\"256;384;256\" dur=\"2s\" begin=\"0.7s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n <animate attributeName=\"opacity\" values=\"0.6;0;0.6\" dur=\"2s\" begin=\"0.7s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>`\n : `<circle cx=\"512\" cy=\"512\" r=\"320\" fill=\"${colors.outer}\"/>`;\n\n // 内圈收缩动画:从 r=160 缩小到 r=120 再恢复\n const innerAnim = animated\n ? `<circle cx=\"512\" cy=\"512\" r=\"160\" fill=\"${colors.inner}\">\n <animate attributeName=\"r\" values=\"160;120;160\" dur=\"2s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>`\n : `<circle cx=\"512\" cy=\"512\" r=\"160\" fill=\"${colors.inner}\"/>`;\n\n return `\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" width=\"${width}\" height=\"${height}\" style=\"overflow:visible;display:block;\">\n ${outerAnim}\n ${innerAnim}\n </svg>\n `;\n}\n\n/**\n * 生成通用脉冲图标 SVG(使用自定义颜色)\n * @param width - SVG 宽度\n * @param height - SVG 高度\n * @param animated - 是否启用脉冲动画\n * @param color - 自定义颜色\n * @returns SVG HTML 字符串\n */\nfunction generateUniversalPulseSvg(\n width: number,\n height: number,\n animated: boolean,\n color: string\n): string {\n // 将颜色转换为外圈浅色版本(添加透明度)\n const outerColor = `${color}30`; // 约 20% 透明度\n\n // 外圈扩散动画\n const outerAnim = animated\n ? `<circle cx=\"512\" cy=\"512\" r=\"256\" fill=\"${outerColor}\">\n <animate attributeName=\"r\" values=\"256;384;256\" dur=\"2s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n <animate attributeName=\"opacity\" values=\"1;0;1\" dur=\"2s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>\n <circle cx=\"512\" cy=\"512\" r=\"256\" fill=\"${outerColor}\" opacity=\"0.6\">\n <animate attributeName=\"r\" values=\"256;384;256\" dur=\"2s\" begin=\"0.7s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n <animate attributeName=\"opacity\" values=\"0.6;0;0.6\" dur=\"2s\" begin=\"0.7s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>`\n : `<circle cx=\"512\" cy=\"512\" r=\"320\" fill=\"${outerColor}\"/>`;\n\n // 内圈收缩动画\n const innerAnim = animated\n ? `<circle cx=\"512\" cy=\"512\" r=\"160\" fill=\"${color}\">\n <animate attributeName=\"r\" values=\"160;120;160\" dur=\"2s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>`\n : `<circle cx=\"512\" cy=\"512\" r=\"160\" fill=\"${color}\"/>`;\n\n return `\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" width=\"${width}\" height=\"${height}\" style=\"overflow:visible;display:block;\">\n ${outerAnim}\n ${innerAnim}\n </svg>\n `;\n}\n\n/**\n * 生成带箭头的脉冲图标 SVG\n * @description 圆形脉冲 + 中间箭头向前动画\n */\nfunction generatePulseArrowSvg(\n width: number,\n height: number,\n animated: boolean,\n colors: { outer: string; inner: string }\n): string {\n // 外圈脉冲动画:与普通脉冲图标保持一致(r=256)\n const outerPulse = animated\n ? `<circle cx=\"512\" cy=\"512\" r=\"256\" fill=\"${colors.outer}\">\n <animate attributeName=\"r\" values=\"256;384;256\" dur=\"1.5s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n <animate attributeName=\"opacity\" values=\"1;0;1\" dur=\"1.5s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>\n <circle cx=\"512\" cy=\"512\" r=\"256\" fill=\"${colors.outer}\" opacity=\"0.6\">\n <animate attributeName=\"r\" values=\"256;384;256\" dur=\"1.5s\" begin=\"0.5s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n <animate attributeName=\"opacity\" values=\"0.6;0;0.6\" dur=\"1.5s\" begin=\"0.5s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>`\n : `<circle cx=\"512\" cy=\"512\" r=\"320\" fill=\"${colors.outer}\"/>`;\n\n // 内圈脉冲动画:与普通脉冲图标保持一致(r=160)\n const innerPulse = animated\n ? `<circle cx=\"512\" cy=\"512\" r=\"160\" fill=\"${colors.inner}\">\n <animate attributeName=\"r\" values=\"160;120;160\" dur=\"1.5s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>`\n : `<circle cx=\"512\" cy=\"512\" r=\"160\" fill=\"${colors.inner}\"/>`;\n\n // 箭头向前动画:向右平移(三角形箭头,适配内圈 r=160)\n const arrowAnim = animated\n ? `<g>\n <animateTransform attributeName=\"transform\" type=\"translate\" values=\"0 0;18 0;0 0\" dur=\"0.8s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n <path d=\"M460 440 L580 512 L460 584 Z\" fill=\"#FFFFFF\"/>\n </g>`\n : `<path d=\"M460 440 L580 512 L460 584 Z\" fill=\"#FFFFFF\"/>`;\n\n return `\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" width=\"${width}\" height=\"${height}\" style=\"overflow:visible;display:block;\">\n ${outerPulse}\n ${innerPulse}\n ${arrowAnim}\n </svg>\n `;\n}\n\n/** 所有脉冲图标名称列表 */\nexport const PULSE_ICONS: PresetIconName[] = [\n 'pulse',\n 'pulse-blue',\n 'pulse-green',\n 'pulse-red',\n 'pulse-orange',\n 'pulse-purple',\n 'pulse-arrow',\n];\n\n/**\n * 生成 Loading Spinner 图标 SVG\n * @description 旋转圆环加载动画\n */\nexport function generateLoadingSpinnerSvg(\n width: number,\n height: number,\n animated: boolean\n): string {\n const rotateAnim = animated\n ? '<animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 512 512\" to=\"360 512 512\" dur=\"1s\" repeatCount=\"indefinite\"/>'\n : '';\n\n return `\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" width=\"${width}\" height=\"${height}\" style=\"overflow:visible;display:block;\">\n <g>${rotateAnim}\n <circle cx=\"512\" cy=\"512\" r=\"360\" fill=\"none\" stroke=\"#E0E0E0\" stroke-width=\"40\"/>\n <path d=\"M512 152 A360 360 0 0 1 872 512\" fill=\"none\" stroke=\"#1890FF\" stroke-width=\"40\" stroke-linecap=\"round\"/>\n </g>\n </svg>\n `;\n}\n\n/**\n * 生成 Loading Dots 图标 SVG\n * @description 跳动圆点加载动画\n */\nexport function generateLoadingDotsSvg(width: number, height: number, animated: boolean): string {\n const dotRadius = 60;\n const spacing = 180;\n const centerX = 512 - spacing;\n const centerY = 512;\n const colors = ['#1890FF', '#52C41A', '#FAAD14'];\n const dots: string[] = [];\n\n for (let i = 0; i < 3; i++) {\n const x = centerX + i * spacing;\n const bounceAnim = animated\n ? `<animate attributeName=\"cy\" values=\"${centerY};${centerY - 80};${centerY}\" dur=\"0.6s\" begin=\"${i * 0.15}s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>`\n : '';\n dots.push(\n `<circle cx=\"${x}\" cy=\"${centerY}\" r=\"${dotRadius}\" fill=\"${colors[i]}\" opacity=\"0.9\">${bounceAnim}</circle>`\n );\n }\n\n return `\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" width=\"${width}\" height=\"${height}\" style=\"overflow:visible;display:block;\">\n ${dots.join('\\n ')}\n </svg>\n `;\n}\n\n/** 所有 Loading 图标名称列表 */\nexport const LOADING_ICONS: PresetIconName[] = ['loading-spinner', 'loading-dots'];\n","/**\n * 图标常量集中管理\n * @description 所有图标相关的常量统一在此文件定义\n */\n\nimport type { IconConfig, ClusterIconConfig } from '../types/icon';\n\n// ==================== 预设图标 ====================\n\n/**\n * 所有预设图标名称列表\n */\nexport const PRESET_ICONS = [\n 'marker',\n 'marker-red',\n 'marker-blue',\n 'marker-green',\n 'marker-orange',\n 'marker-yellow',\n 'pulse',\n 'pulse-red',\n 'pulse-blue',\n 'pulse-green',\n 'pulse-orange',\n 'pulse-purple',\n 'pulse-arrow',\n 'point',\n 'position',\n 'position-red',\n 'drone',\n 'down',\n 'tractor',\n 'tractor-2',\n 'tractorTopdown',\n 'truck',\n 'truck-2',\n 'agri-drone',\n 'agri-drone-side',\n 'loading-spinner',\n 'loading-dots',\n 'monitor',\n 'alert',\n 'flag',\n 'target',\n 'wind',\n 'flag-double',\n] as const;\n\n/** SVG 彩色图标(水滴形 pin) */\nexport const SVG_MARKER_ICONS = [\n 'marker-red',\n 'marker-blue',\n 'marker-green',\n 'marker-orange',\n 'marker-yellow',\n] as const;\n\n/** SVG 脉冲图标(带扩散动画) */\nexport const PULSE_ICONS = [\n 'pulse',\n 'pulse-red',\n 'pulse-blue',\n 'pulse-green',\n 'pulse-orange',\n 'pulse-purple',\n 'pulse-arrow',\n] as const;\n\n/** Loading 加载图标 */\nexport const LOADING_ICONS = ['loading-spinner', 'loading-dots'] as const;\n\n/**\n * SelectIcon 组件中支持自定义颜色的图标\n * @description 用于控制哪些图标在 SelectIcon 中显示颜色选择器\n */\nexport const COLOR_ENABLED_ICONS = [\n 'marker',\n 'pulse',\n 'monitor',\n 'alert',\n 'flag',\n 'target',\n 'wind',\n 'flag-double',\n] as const;\n\n/** 支持自定义颜色的图标(全量) */\nexport const COLOR_SUPPORTED_ICONS = [\n 'marker',\n 'pulse',\n 'tractor',\n 'tractor-2',\n 'truck',\n 'truck-2',\n 'agri-drone',\n 'agri-drone-side',\n 'monitor',\n 'alert',\n 'flag',\n 'target',\n 'wind',\n 'flag-double',\n] as const;\n\n// ==================== 图标分组 ====================\n\n/** 图标分组类型 */\nexport type IconGroupType = 'color' | 'sprite' | 'vehicle';\n\n/** 图标分组项 */\nexport interface IconGroupItem {\n type: string;\n name: string;\n}\n\n/** 图标分组 */\nexport interface IconGroup {\n label: string;\n icons: IconGroupItem[];\n}\n\n/** 默认图标分组 */\nexport const DEFAULT_ICON_GROUPS: IconGroup[] = [\n {\n label: '颜色标记',\n icons: [\n { type: 'marker', name: '颜色位置' },\n { type: 'pulse', name: '颜色脉冲' },\n { type: 'monitor', name: '监测站' },\n { type: 'alert', name: '警示警报' },\n { type: 'flag', name: '旗帜' },\n { type: 'target', name: '靶心' },\n { type: 'wind', name: '风向' },\n { type: 'flag-double', name: '双旗帜' },\n ],\n },\n {\n label: '精灵图',\n icons: [\n { type: 'point', name: '圆点' },\n { type: 'position', name: '定位' },\n { type: 'position-red', name: '红点' },\n { type: 'drone', name: '无人机' },\n { type: 'down', name: '下行' },\n ],\n },\n {\n label: '农机设备',\n icons: [\n { type: 'tractor', name: '拖拉机' },\n { type: 'tractor-2', name: '收割机' },\n { type: 'tractorTopdown', name: '农机(俯视)' },\n { type: 'truck', name: '货车' },\n { type: 'truck-2', name: '三轮货车' },\n { type: 'agri-drone', name: '农业无人机' },\n { type: 'agri-drone-side', name: '无人机(侧视)' },\n ],\n },\n];\n\n/** 所有预设图标的名称映射 */\nexport const ICON_NAME_MAP: Record<string, string> = (() => {\n const map: Record<string, string> = {};\n for (const group of DEFAULT_ICON_GROUPS) {\n for (const icon of group.icons) {\n map[icon.type] = icon.name;\n }\n }\n return map;\n})();\n\n// ==================== 预设尺寸 ====================\n\n/** 预设尺寸列表 - 12的倍数 */\nexport const PRESET_SIZES = [24, 36, 48, 60, 72, 84, 96, 108] as const;\n\n// ==================== 预设颜色 ====================\n\n/** DOMPurify 配置:允许 SVG 动画元素 */\nexport const DOMPURIFY_CONFIG = {\n ADD_TAGS: ['animate', 'animateTransform', 'animateMotion', 'set', 'mpath'],\n ADD_ATTR: [\n 'attributeName',\n 'type',\n 'from',\n 'to',\n 'dur',\n 'repeatCount',\n 'begin',\n 'values',\n 'keyTimes',\n 'keySplines',\n 'calcMode',\n ],\n};\n\n// ==================== 默认图标配置 ====================\n\n/** 标注点默认图标 */\nexport const MARKER_DEFAULT_ICON: IconConfig = {\n icon: 'marker-blue',\n iconSize: [48, 48],\n animated: true,\n};\n\n/** 标注点选中图标 */\nexport const MARKER_DEFAULT_SELECTED_ICON: IconConfig = {\n icon: 'marker-red',\n iconSize: [48, 48],\n animated: true,\n};\n\n/** 标注点编辑中图标 */\nexport const MARKER_DEFAULT_EDIT_ICON: IconConfig = {\n icon: 'marker-yellow',\n iconSize: [48, 48],\n animated: true,\n};\n\n/** 聚合气泡图标 */\nexport const CLUSTER_DEFAULT_ICON: ClusterIconConfig = {\n icon: 'pulse-red',\n iconSize: [48, 48],\n animated: true,\n showCount: false,\n};\n\n/** 轨迹起点图标 */\nexport const TRACK_DEFAULT_START_ICON: IconConfig = {\n icon: 'pulse',\n iconSize: 48,\n iconAnchor: [24, 24],\n animated: true,\n};\n\n/** 轨迹终点图标 */\nexport const TRACK_DEFAULT_END_ICON: IconConfig = {\n icon: 'pulse',\n iconSize: 48,\n iconAnchor: [24, 24],\n animated: true,\n};\n\n/** 轨迹播放图标 */\nexport const TRACKPLAYER_DEFAULT_ICON: IconConfig = {\n icon: 'tractorTopdown',\n iconSize: [48, 48],\n};\n\n/** 灌溉渠进水口图标 */\nexport const DEFAULT_INLET_ICON: IconConfig = {\n icon: 'pulse-green',\n iconSize: [48, 48],\n animated: true,\n};\n\n/** 灌溉渠出水口图标 */\nexport const DEFAULT_OUTLET_ICON: IconConfig = {\n icon: 'pulse-orange',\n iconSize: [48, 48],\n animated: true,\n};\n","/**\n * 默认 PathOptions 样式常量\n * @description 集中管理各组件的默认视觉样式,便于全局统一调整\n *\n * ⚠️ 颜色值必须与 src/styles/_variables.scss 中的语义色变量保持同步:\n * PLOT_DEFAULT_PATH.color/fillColor → $color-plot (#1668dc)\n * PLOT_DEFAULT_SELECTED_PATH.color/fillColor → $color-plot-selected (#d32029)\n * PLOT_DEFAULT_EDIT_PATH.color/fillColor → $color-plot-edit (#faad14)\n * PLOT_DEFAULT_HIGHLIGHT_PATH.color/fillColor → $color-plot-highlight (#fa8c16)\n * PLOT_CLIP_FRAGMENT_*.color → $color-success (#52c41a)\n *\n * @since 2.0.0 线段组件样式(Road、Irrigation、Track、TrackPlayer)已迁移到 constants/polylineStyles.ts\n * @since 2.0.0 TrackStyle 类型已迁移到 types/polyline.ts\n * @since 2.1.0 图标常量已迁移到 constants/icon.ts\n */\n\nimport type { PathOptions } from '../types';\n\n// ==================== 图标常量(从 constants/icon.ts 导入)===================\nexport {\n MARKER_DEFAULT_ICON,\n MARKER_DEFAULT_SELECTED_ICON,\n MARKER_DEFAULT_EDIT_ICON,\n CLUSTER_DEFAULT_ICON,\n TRACK_DEFAULT_START_ICON,\n TRACK_DEFAULT_END_ICON,\n TRACKPLAYER_DEFAULT_ICON,\n DEFAULT_INLET_ICON,\n DEFAULT_OUTLET_ICON,\n} from './icon';\nexport type { IconConfig, ClusterIconConfig } from '../types/icon';\n\n// ==================== 地块 PlotLayer ====================\n\n/** 地块默认样式 */\nexport const PLOT_DEFAULT_PATH: PathOptions = {\n color: '#1668dc',\n opacity: 1,\n weight: 2,\n fillColor: '#1668dc',\n fillOpacity: 0.2,\n};\n\n/** 地块选中样式 */\nexport const PLOT_DEFAULT_SELECTED_PATH: PathOptions = {\n color: '#d32029',\n opacity: 1,\n weight: 2,\n fillColor: '#d32029',\n fillOpacity: 0.2,\n};\n\n/** 地块编辑样式 */\nexport const PLOT_DEFAULT_EDIT_PATH: PathOptions = {\n color: '#faad14',\n opacity: 1,\n weight: 2,\n fillColor: '#faad14',\n fillOpacity: 0.2,\n dashArray: '5, 5',\n // 顶点样式默认值\n vertexBorderColor: '#ffffff',\n vertexFillColor: '#d32029',\n vertexFillOpacity: 0.5,\n};\n\n/** 地块高亮样式(分组高亮) */\nexport const PLOT_DEFAULT_HIGHLIGHT_PATH: PathOptions = {\n color: '#fa8c16',\n fillColor: '#fa8c16',\n fillOpacity: 0.4,\n weight: 2,\n};\n\n/** 地块无类型时的回退样式 */\nexport const PLOT_FALLBACK_PATH: PathOptions = {\n fillColor: '#ccc',\n color: '#999',\n weight: 2,\n opacity: 0.8,\n fillOpacity: 0.5,\n};\n\n/** 地块新建绘制时的 PM 样式 */\nexport const PLOT_PM_CREATE_OPTIONS: PathOptions = {\n color: '#1890ff',\n fillColor: '#1890ff',\n fillOpacity: 0.3,\n weight: 2,\n};\n\n/** 地块剪切碎片默认样式 */\nexport const PLOT_CLIP_FRAGMENT_DEFAULT: PathOptions = {\n color: '#52c41a',\n weight: 2,\n fillColor: '#52c41a',\n fillOpacity: 0.3,\n dashArray: '8, 6',\n};\n\n/** 地块剪切碎片选中样式 */\nexport const PLOT_CLIP_FRAGMENT_SELECTED: PathOptions = {\n color: '#52c41a',\n weight: 3,\n fillColor: '#52c41a',\n fillOpacity: 0.4,\n dashArray: '',\n};\n\n// ==================== 公共 PM 绘制样式 ====================\n\n/** PM 绘制时的临时线样式(templineStyle) */\nexport const PM_TEMPLATE_LINE_STYLE: PathOptions = {\n color: '#1677ff',\n weight: 4,\n dashArray: '10, 10',\n};\n\n/** PM 绘制时的提示线样式(hintlineStyle) */\nexport const PM_HINT_LINE_STYLE: PathOptions = {\n color: '#1677ff',\n weight: 2,\n dashArray: '5, 5',\n};\n\n/** 灌溉渠 PM 编辑器全局样式 */\nexport const IRRIGATION_PM_PATH_OPTIONS: PathOptions = {\n color: '#1E90FF',\n weight: 4,\n};\n\n// ==================== Loading 加载组件 ====================\n\n/** Loading 遮罩默认背景色 */\nexport const LOADING_DEFAULT_MASK_BACKGROUND = 'rgba(0, 0, 0, 0.5)';\n\n/** Loading 遮罩默认层级 */\nexport const LOADING_DEFAULT_MASK_ZINDEX = 1000;\n\n/** Loading 遮罩默认配置 */\nexport const LOADING_DEFAULT_MASK = {\n background: LOADING_DEFAULT_MASK_BACKGROUND,\n zIndex: LOADING_DEFAULT_MASK_ZINDEX,\n} as const;\n","/**\n * @fileoverview Loading 加载组件\n * @description 显示加载状态的组件,支持多种加载图标和自定义配置\n * @module components/Loading\n */\n\nimport { useMemo } from 'react';\nimport type { LoadingProps, LoadingMaskConfig } from '../../types';\nimport { generateLoadingSpinnerSvg, generateLoadingDotsSvg } from '../../utils/pulseIcon';\nimport {\n LOADING_DEFAULT_MASK_BACKGROUND,\n LOADING_DEFAULT_MASK_ZINDEX,\n} from '../../constants/styles';\n\n/**\n * Loading 加载组件\n *\n * @description\n * 显示加载状态,支持以下功能:\n * - 多种加载图标:loading-spinner(旋转圆圈)、loading-dots(跳动圆点)\n * - 自定义尺寸:small、default、large 或数字\n * - 描述文案:可选的加载提示文字\n * - 遮罩配置:支持自定义背景色、层级等\n *\n * @example\n * ```tsx\n * import { Loading } from 'agri-map-components';\n *\n * // 基础用法\n * <Loading />\n *\n * // 自定义图标和描述\n * <Loading icon=\"loading-dots\" description=\"加载中...\" />\n *\n * // 自定义尺寸\n * <Loading size=\"large\" />\n * <Loading size={64} />\n *\n * // 带遮罩\n * <Loading mask />\n * <Loading mask={{ background: 'rgba(0, 0, 0, 0.5)', zIndex: 999 }} />\n *\n * // 在 Marker 中使用\n * <Marker loading={true} />\n * ```\n */\nconst Loading: React.FC<LoadingProps> = ({\n icon = 'loading-spinner',\n description,\n size = 'default',\n mask,\n className,\n style,\n}) => {\n // 计算图标尺寸\n const iconSize = useMemo(() => {\n const sizeMap: Record<string, number> = {\n small: 24,\n default: 32,\n large: 48,\n };\n\n if (typeof size === 'number') {\n return size;\n }\n return sizeMap[size] || sizeMap.default;\n }, [size]);\n\n // 解析遮罩配置\n const maskConfig = useMemo((): LoadingMaskConfig => {\n // 明确禁用遮罩\n if (mask === false || mask === null) {\n return { enabled: false };\n }\n // mask 为 true 或未设置时,默认启用遮罩\n if (mask === true || mask === undefined) {\n return { enabled: true };\n }\n // 传入对象时,除非明确设置 enabled: false,否则启用\n return {\n enabled: mask.enabled ?? true,\n background: mask.background,\n zIndex: mask.zIndex,\n };\n }, [mask]);\n\n // 生成 SVG\n const svgContent = useMemo(() => {\n switch (icon) {\n case 'loading-dots':\n return generateLoadingDotsSvg(iconSize, iconSize, true);\n case 'loading-spinner':\n default:\n return generateLoadingSpinnerSvg(iconSize, iconSize, true);\n }\n }, [icon, iconSize]);\n\n const content = (\n <div\n className={`agri-loading ${className || ''}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: description ? 8 : 0,\n ...style,\n }}\n >\n <div\n className=\"agri-loading-icon\"\n dangerouslySetInnerHTML={{ __html: svgContent }}\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n />\n {description && (\n <span className=\"agri-loading-description\" style={{ color: '#666', fontSize: 14 }}>\n {description}\n </span>\n )}\n </div>\n );\n\n // 如果启用遮罩,包裹遮罩层\n if (maskConfig.enabled) {\n return (\n <div\n className=\"agri-loading-mask\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: maskConfig.background || LOADING_DEFAULT_MASK_BACKGROUND,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: maskConfig.zIndex ?? LOADING_DEFAULT_MASK_ZINDEX,\n pointerEvents: 'none',\n }}\n >\n {content}\n </div>\n );\n }\n\n return content;\n};\n\nexport default Loading;\n","/**\n * 地图容器组件\n * @description 集成 MapProvider 和自动渲染功能,提供一站式地图容器\n * @since 2.0.0\n * @since 2.0.0 使用自定义 ZoomControl 替代 Leaflet 原生缩放控件\n * @since 2.1.0 使用 memo 包装,避免父组件状态变化导致不必要的重新渲染\n *\n * ## 修复记录 (2024-06-08)\n *\n * **问题**: 当父组件状态变化时(如修改 Marker 图标配置),MapContainer 会重新渲染,\n * 导致 TianDiTuLayer 的 useEffect 重新执行,瓦片图层被删除并重新创建,触发大量瓦片请求。\n *\n * **原因**: MapContainer 没有使用 memo 包装,即使 props 没有变化,也会在父组件重新渲染时重新渲染。\n *\n * **修复方案**: 使用 `memo<MapContainerProps>(function MapContainer(...) {...})` 包装组件,\n * 只有当 props 变化时才重新渲染。\n */\n\nimport React, { useMemo, memo } from 'react';\nimport type L from 'leaflet';\nimport { MapProvider } from '../../context/MapContext';\nimport { useTheme } from '../../context/ThemeContext';\nimport { ConfigContext, type ConfigContextValue } from '../../context/ConfigContext';\nimport DualScaleControl from '../DualScaleControl';\nimport TianDiTuLayer from '../TianDiTuLayer';\nimport MapSizeHandler from '../MapSizeHandler';\nimport ZoomControl from '../ZoomControl';\nimport FullscreenControl from '../FullscreenControl';\nimport Loading from '../Loading';\nimport type {\n DualScaleControlConfig,\n MapSizeHandlerConfig,\n TianDiTuLayerConfig,\n LoadingProps,\n ZoomControlPosition,\n FullscreenControlPosition,\n MapLifecycleConfig,\n PathOptions,\n PolylineStyle,\n IconConfig,\n AntPathConfig,\n ClusterIconConfig,\n} from '../../types';\n\n// 重导出 useConfig,保持 API 兼容\nexport { useConfig } from '../../context/ConfigContext';\n\n// ========== 类型定义 ==========\n\n/**\n * 缩放控件配置\n */\nexport interface ZoomControlConfig {\n /** 控件位置 */\n position?: ZoomControlPosition;\n /** 控件背景色 */\n controlBg?: string;\n /** 控件文字颜色 */\n controlText?: string;\n}\n\n/**\n * 全屏控件配置\n * @since 2.1.0\n */\nexport interface FullscreenControlConfig {\n /** 控件位置,默认 'topleft' */\n position?: FullscreenControlPosition;\n /** 控件背景色 */\n controlBg?: string;\n /** 控件文字颜色 */\n controlText?: string;\n}\n\n/**\n * 地图容器属性\n */\nexport interface MapContainerProps {\n /** 子组件 */\n children?: React.ReactNode;\n // ========== 地图基础配置 ==========\n /** 中心点 */\n center: [number, number];\n /**\n * 缩放级别\n * @default 12\n */\n zoom?: number;\n /** 样式 */\n style?: React.CSSProperties;\n /** 类名 */\n className?: string;\n /**\n * 容器宽度\n * @description 支持数字(默认单位 px)或字符串(如 '100%', '800px')\n * @default '100%'\n */\n width?: string | number;\n /**\n * 容器高度\n * @description 支持数字(默认单位 px)或字符串(如 '480px', '100vh')\n * @default 480\n */\n height?: string | number;\n /**\n * 容器圆角\n * @description 支持数字(默认单位 px)或字符串(如 '8px', '50%')\n * @default 8\n */\n radius?: string | number;\n /** CRS 坐标系 */\n crs?: L.CRS;\n /** 最大缩放 */\n maxZoom?: number;\n /** 最小缩放 */\n minZoom?: number;\n /** 是否启用滚轮缩放 */\n scrollWheelZoom?: boolean;\n /**\n * 缩放控件配置\n * @description 传入 true 显示默认自定义缩放控件,传入对象自定义配置,false 不显示\n * @since 2.0.0 使用自定义 ZoomControl 替代 Leaflet 原生\n */\n zoomControl?: boolean | ZoomControlConfig;\n /** 是否显示归属控件 */\n attributionControl?: boolean;\n /** 地图就绪回调 */\n whenReady?: (map: L.Map) => void;\n // ========== 配置 ==========\n /** 主题模式 */\n theme?: 'light' | 'dark';\n /**\n * 双向标尺配置\n * @description 传入 true 显示默认配置,传入对象自定义配置,不传或 false 不显示\n */\n dualScaleControl?: boolean | DualScaleControlConfig;\n /**\n * 天地图图层配置\n * @description 配置后自动渲染 TianDiTuLayer\n */\n tianDiTuLayer?: TianDiTuLayerConfig | false;\n /**\n * 地图尺寸处理器配置\n * @description 传入 true 启用默认配置,传入对象自定义配置,不传或 false 不启用\n */\n mapSizeHandler?: boolean | MapSizeHandlerConfig;\n /**\n * 加载状态配置\n * @description 传入 true 显示默认加载动画,传入对象自定义配置,不传或 false 不显示\n * @example\n * // 显示默认加载\n * <MapContainer loading />\n *\n * // 自定义加载\n * <MapContainer loading={{ description: '加载中...', icon: 'loading-dots' }} />\n */\n loading?: boolean | LoadingProps;\n /**\n * 全屏控件\n * @description 传入 true 显示默认全屏按钮,传入对象自定义配置,传入字符串指定位置,不传或 false 不显示\n * @since 2.1.0\n * @example\n * // 显示默认全屏按钮(左上角)\n * <MapContainer fullscreen />\n *\n * // 指定位置\n * <MapContainer fullscreen=\"topright\" />\n *\n * // 自定义配置\n * <MapContainer fullscreen={{ position: 'topright', controlBg: 'rgba(0, 0, 0, 0.8)' }} />\n */\n fullscreen?: boolean | FullscreenControlConfig | FullscreenControlPosition;\n /**\n * 地图生命周期回调配置\n * @description 极简方案:只保留 onMapReady 和 onViewportChange\n * @since 1.4.0\n * @example\n * ```tsx\n * lifecycle={{\n * onMapReady: ({ map }) => console.log('地图就绪'),\n * onViewportChange: (data) => saveViewport(data),\n * }}\n * ```\n */\n lifecycle?: MapLifecycleConfig;\n /**\n * 组件默认配置\n * @description 统一配置各组件的默认属性\n * @example\n * ```tsx\n * config={{\n * plotLayer: {\n * editing: { color: '#faad14', fillColor: '#faad14' },\n * },\n * }}\n * ```\n */\n config?: {\n plotLayer?: {\n editing?: PathOptions | null | false;\n };\n marker?: {\n editing?: IconConfig | null | false;\n };\n road?: {\n default?: PolylineStyle | null | false;\n selected?: PolylineStyle | null | false;\n editing?: PolylineStyle | null | false;\n antPath?: AntPathConfig | null | false;\n };\n irrigation?: {\n default?: PolylineStyle | null | false;\n selected?: PolylineStyle | null | false;\n editing?: PolylineStyle | null | false;\n antPath?: AntPathConfig | null | false;\n inlet?: IconConfig | null | false;\n outlet?: IconConfig | null | false;\n };\n track?: {\n default?: PolylineStyle | null | false;\n nonWorking?: PolylineStyle | null | false;\n selected?: PolylineStyle | null | false;\n start?: IconConfig | null | false;\n end?: IconConfig | null | false;\n cluster?: ClusterIconConfig | null | false;\n };\n };\n}\n\n// ========== 辅助函数 ==========\n\n/** 解析 dualScaleControl 配置 */\nconst getDualScaleControlConfig = (\n config: boolean | DualScaleControlConfig | undefined\n): DualScaleControlConfig | false | undefined => {\n if (config === undefined || config === false) {\n return false;\n }\n return config === true ? {} : config;\n};\n\n/** 解析 mapSizeHandler 配置 */\nconst getMapSizeHandlerConfig = (\n config: boolean | MapSizeHandlerConfig | undefined\n): MapSizeHandlerConfig | false => {\n if (config === undefined || config === false) {\n return false;\n }\n return config === true ? {} : config;\n};\n\n/** 解析 zoomControl 配置 */\nconst getZoomControlConfig = (\n config: boolean | ZoomControlConfig | undefined\n): ZoomControlConfig | false => {\n if (config === undefined || config === false) {\n return false;\n }\n return config === true ? {} : config;\n};\n\n/** 解析 fullscreen 配置 */\nconst getFullscreenControlConfig = (\n config: boolean | FullscreenControlConfig | FullscreenControlPosition | undefined\n): FullscreenControlConfig | false => {\n if (config === undefined || config === false) {\n return false;\n }\n // 如果是字符串(位置),转换为配置对象\n if (typeof config === 'string') {\n return { position: config };\n }\n return config === true ? {} : config;\n};\n\n// ========== 组件 ==========\n\n/**\n * 地图容器组件\n * 集成地图实例上下文、配置上下文和自动渲染功能\n *\n * @example\n * ```tsx\n * // 基础用法(默认 width: 100%, height: 480px)\n * <MapContainer center={[30, 120]} zoom={10}>\n * <Marker dataSource={data} />\n * </MapContainer>\n *\n * // 自定义尺寸(数字,单位 px)\n * <MapContainer center={[30, 120]} zoom={10} width={800} height={600}>\n * <Marker dataSource={data} />\n * </MapContainer>\n *\n * // 自定义尺寸(字符串,支持 px、%、vh 等单位)\n * <MapContainer center={[30, 120]} zoom={10} width=\"100%\" height=\"800px\">\n * <Marker dataSource={data} />\n * </MapContainer>\n *\n * // 使用 style 覆盖尺寸\n * <MapContainer center={[30, 120]} zoom={10} style={{ height: '100vh' }}>\n * <Marker dataSource={data} />\n * </MapContainer>\n *\n * // 自定义圆角\n * <MapContainer center={[30, 120]} zoom={10} radius={12}>\n * <Marker dataSource={data} />\n * </MapContainer>\n *\n * // 带天地图和标尺\n * <MapContainer\n * center={[30, 120]}\n * zoom={10}\n * tianDiTuLayer={{ apiKey: 'your-key' }}\n * dualScaleControl\n * >\n * <Marker dataSource={data} />\n * </MapContainer>\n *\n * // 深色主题\n * <MapContainer\n * center={[30, 120]}\n * zoom={10}\n * theme=\"dark\"\n * tianDiTuLayer={{ apiKey: 'your-key', layerType: 'satellite' }}\n * dualScaleControl={{ showZoomControl: true }}\n * mapSizeHandler\n * >\n * <PlotLayer dataSource={plots} />\n * </MapContainer>\n * ```\n */\nexport const MapContainer = memo<MapContainerProps>(function MapContainer({\n children,\n center,\n zoom = 12,\n style,\n className,\n width,\n height,\n radius = 8,\n crs,\n maxZoom = 22,\n minZoom,\n scrollWheelZoom = true,\n zoomControl = false,\n attributionControl = true,\n whenReady,\n theme: themeProp,\n dualScaleControl,\n tianDiTuLayer,\n mapSizeHandler,\n loading,\n fullscreen,\n lifecycle,\n config,\n}: MapContainerProps) {\n // 从全局 ThemeContext 读取主题,props.theme 优先\n const { theme: globalTheme } = useTheme();\n const theme = themeProp ?? globalTheme;\n\n // 合并尺寸样式:默认 width: '100%', height: 480\n const mergedStyle = useMemo((): React.CSSProperties => {\n const defaultStyle: React.CSSProperties = {\n width: '100%',\n height: 480,\n borderRadius: typeof radius === 'number' ? `${radius}px` : radius,\n };\n\n // 处理 width 和 height 属性\n if (width !== undefined) {\n defaultStyle.width = typeof width === 'number' ? `${width}px` : width;\n }\n if (height !== undefined) {\n defaultStyle.height = typeof height === 'number' ? `${height}px` : height;\n }\n\n // 合并用户传入的 style,用户 style 优先\n return { ...defaultStyle, ...style };\n }, [width, height, style, radius]);\n\n // 解析后的配置\n const dualScaleConfig = getDualScaleControlConfig(dualScaleControl);\n const mapSizeConfig = getMapSizeHandlerConfig(mapSizeHandler);\n const zoomControlConfig = getZoomControlConfig(zoomControl);\n const fullscreenConfig = getFullscreenControlConfig(fullscreen);\n\n // 地图选项:当使用自定义 ZoomControl 时,禁用 Leaflet 原生 zoomControl\n const mapOptions: L.MapOptions = useMemo(\n () => ({\n crs,\n maxZoom,\n minZoom,\n scrollWheelZoom,\n zoomControl: zoomControlConfig !== false ? false : false, // 始终禁用原生,使用自定义\n attributionControl,\n }),\n [crs, maxZoom, minZoom, scrollWheelZoom, zoomControlConfig, attributionControl]\n );\n\n // 配置上下文值\n const configValue = useMemo((): ConfigContextValue => {\n const tianDiTuLayerValue: TianDiTuLayerConfig | false =\n tianDiTuLayer === false || !tianDiTuLayer ? false : tianDiTuLayer;\n\n return {\n theme,\n dualScaleControl: dualScaleConfig,\n tianDiTuLayer: tianDiTuLayerValue,\n mapSizeHandler: mapSizeConfig,\n ...config,\n };\n }, [theme, dualScaleConfig, tianDiTuLayer, mapSizeConfig, config]);\n\n return (\n <ConfigContext.Provider value={configValue}>\n <MapProvider\n center={center}\n zoom={zoom}\n style={mergedStyle}\n className={className}\n options={mapOptions}\n onReady={whenReady}\n lifecycle={lifecycle}\n >\n {/* 自动渲染地图尺寸处理器 */}\n {mapSizeConfig !== false && (\n <MapSizeHandler\n enabled={mapSizeConfig?.enabled}\n delay={mapSizeConfig?.delay}\n retries={mapSizeConfig?.retries}\n />\n )}\n\n {/* 自动渲染天地图图层 */}\n {tianDiTuLayer !== false && tianDiTuLayer && (\n <TianDiTuLayer\n apiKey={tianDiTuLayer.apiKey}\n layerType={tianDiTuLayer.layerType}\n showAnnotation={tianDiTuLayer.showAnnotation}\n overlayUrl={tianDiTuLayer.overlayUrl}\n subdomains={tianDiTuLayer.subdomains}\n maxZoom={tianDiTuLayer.maxZoom}\n minZoom={tianDiTuLayer.minZoom}\n showLayerSelector={tianDiTuLayer.showLayerSelector}\n />\n )}\n\n {/* 自动渲染双向标尺 */}\n {dualScaleConfig !== false && <DualScaleControl />}\n\n {/* 自动渲染缩放控件 */}\n {zoomControlConfig !== false && (\n <ZoomControl\n position={zoomControlConfig?.position}\n controlBg={zoomControlConfig?.controlBg}\n controlText={zoomControlConfig?.controlText}\n />\n )}\n\n {/* 自动渲染全屏控件 */}\n {fullscreenConfig !== false && (\n <FullscreenControl\n position={fullscreenConfig?.position}\n controlBg={fullscreenConfig?.controlBg}\n controlText={fullscreenConfig?.controlText}\n />\n )}\n\n {/* 用户子组件 */}\n {children}\n\n {/* 加载状态 */}\n {loading && <Loading mask {...(typeof loading === 'object' ? loading : {})} />}\n </MapProvider>\n </ConfigContext.Provider>\n );\n});\n\nMapContainer.displayName = 'MapContainer';\n\nexport default MapContainer;\n","/**\n * 主题配置常量\n * @description 集中管理所有主题相关的颜色和样式配置\n *\n * ⚠️ 颜色值必须与 src/styles/_variables.scss 中的主题变量保持同步:\n * light.controlBg → $theme-light-control-bg\n * light.primaryColor → $theme-light-primary / $color-primary\n * dark.controlBg → $theme-dark-control-bg\n * dark.primaryColor → $theme-dark-primary / $dark-color-primary\n */\n\n/**\n * 主题模式类型\n */\nexport type ThemeMode = 'light' | 'dark';\n\n/**\n * 主题颜色配置接口\n * @deprecated 请使用 CSS 变量或 SCSS 变量获取主题颜色,此接口将在下个大版本移除\n */\nexport interface ThemeColors {\n /** 控件背景色 */\n controlBg: string;\n /** 控件文字颜色 */\n controlText: string;\n /** 主色调 */\n primaryColor: string;\n /** 边框颜色 */\n borderColor: string;\n /** 阴影颜色 */\n shadowColor: string;\n}\n\n/**\n * 主题配置映射\n * @deprecated 请使用 CSS 变量或 SCSS 变量获取主题颜色,此接口将在下个大版本移除\n */\nexport const THEME_CONFIG: Record<ThemeMode, ThemeColors> = {\n light: {\n controlBg: 'rgba(255, 255, 255, 0.85)',\n controlText: '#333',\n primaryColor: '#1677ff',\n borderColor: 'rgba(0, 0, 0, 0.1)',\n shadowColor: '0 2px 8px rgba(0, 0, 0, 0.15)',\n },\n dark: {\n controlBg: 'rgba(0, 0, 0, 0.7)',\n controlText: '#fff',\n primaryColor: '#66bb6a',\n borderColor: 'rgba(255, 255, 255, 0.2)',\n shadowColor: '0 2px 8px rgba(0, 0, 0, 0.3)',\n },\n};\n\n/**\n * 根据主题获取颜色配置\n * @deprecated 请使用 CSS 变量或 SCSS 变量获取主题颜色,此函数将在下个大版本移除\n * @param theme 主题模式\n * @returns 主题颜色配置\n */\nexport const getThemeColors = (theme: ThemeMode): ThemeColors => {\n return THEME_CONFIG[theme];\n};\n\n/**\n * CSS 变量映射(用于 JS 运行时设置 CSS 变量给非 Leaflet 控件)\n * ⚠️ 值必须与 src/styles/_variables.scss 保持同步\n */\nexport const THEME_CSS_VARS: Record<ThemeMode, Record<string, string>> = {\n light: {\n '--control-bg': 'rgba(255, 255, 255, 0.85)',\n '--control-text': '#333',\n '--primary-color': '#1677ff',\n '--border-color': 'rgba(0, 0, 0, 0.1)',\n },\n dark: {\n '--control-bg': 'rgba(0, 0, 0, 0.7)',\n '--control-text': '#fff',\n '--primary-color': '#66bb6a',\n '--border-color': 'rgba(255, 255, 255, 0.2)',\n },\n};\n","/**\n * 主题 Hook\n * @description 提供统一的主题访问接口\n */\n\nimport { useConfig } from '../components/MapContainer';\nimport { getThemeColors, type ThemeMode, type ThemeColors } from '../constants/theme';\n\n/**\n * 获取当前主题及颜色配置的 Hook\n * @returns 主题模式和颜色配置\n */\nexport const useTheme = (): { theme: ThemeMode; colors: ThemeColors } => {\n const config = useConfig();\n const theme: ThemeMode = config.theme || 'light';\n return {\n theme,\n colors: getThemeColors(theme),\n };\n};\n","/**\n * @fileoverview 农业图层统一生命周期管理 Hook\n * @description 为 PlotLayer、Road、Irrigation、Marker 提供统一的生命周期管理\n * @since 1.4.0\n * @module hooks/useLifecycle\n *\n * @example\n * ```tsx\n * // 在组件中使用\n * useLifecycle<'PlotLayer'>({\n * componentType: 'PlotLayer',\n * lifecycle,\n * dataSource: normalizedDataSource,\n * currentState: { mode: editMode, prevMode, plotId: selectedPlotId },\n * isRendered: layersReady,\n * renderStats: { totalCount, renderedCount, virtualized },\n * });\n * ```\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any, react-hooks/exhaustive-deps -- 状态机需要 */\n\nimport { useEffect, useRef } from 'react';\nimport type {\n AgriculturalComponentType,\n LifecycleConfig,\n LifecycleRenderStats,\n StateChangeMap,\n} from '../types/lifecycle';\n\n/**\n * useLifecycle 配置选项\n * @template T - 组件类型\n */\nexport interface UseLifecycleOptions<T extends AgriculturalComponentType> {\n /** 组件类型标识 */\n componentType: T;\n /** 生命周期回调配置 */\n lifecycle?: LifecycleConfig<T>;\n /** 标准化后的数据源 */\n dataSource: any[];\n /** 当前状态对象(不同组件类型有不同的状态结构) */\n currentState: T extends keyof StateChangeMap ? StateChangeMap[T] : any;\n /** 上一个状态对象 */\n prevState?: T extends keyof StateChangeMap ? StateChangeMap[T] : any;\n /** 是否已完成首次渲染 */\n isRendered: boolean;\n /** 渲染统计信息 */\n renderStats?: Omit<LifecycleRenderStats, 'componentType'>;\n}\n\n/**\n * 农业图层统一生命周期管理 Hook\n * @description 管理组件的挂载、渲染、状态变化、卸载四个关键生命周期节点\n *\n * @param options - 配置选项\n * @returns void\n *\n * @example\n * ```tsx\n * function PlotLayer({ dataSource, editMode, lifecycle }) {\n * const selectedPlotId = useSelectedPlotId();\n * const layersReady = useLayersReady();\n *\n * useLifecycle<'PlotLayer'>({\n * componentType: 'PlotLayer',\n * lifecycle,\n * dataSource,\n * currentState: {\n * mode: editMode,\n * prevMode: prevEditModeRef.current,\n * plotId: selectedPlotId,\n * },\n * isRendered: layersReady,\n * renderStats: {\n * totalCount: dataSource.length,\n * renderedCount: visiblePlots.length,\n * virtualized: isVirtualized,\n * },\n * });\n *\n * return ...;\n * }\n * ```\n */\nexport function useLifecycle<T extends AgriculturalComponentType>(\n options: UseLifecycleOptions<T>\n): void {\n const {\n componentType,\n lifecycle,\n dataSource,\n currentState,\n prevState: _prevState,\n isRendered,\n renderStats,\n } = options;\n\n const isMounted = useRef(false);\n const hasRendered = useRef(false);\n const prevStatusRef = useRef<any>(null);\n const dataLengthRef = useRef<number>(0);\n\n // 使用 ref 存储 lifecycle 和 dataSource,避免依赖数组变化导致循环\n const lifecycleRef = useRef(lifecycle);\n const dataSourceRef = useRef(dataSource);\n const renderStatsRef = useRef(renderStats);\n\n // 更新 ref\n lifecycleRef.current = lifecycle;\n dataSourceRef.current = dataSource;\n renderStatsRef.current = renderStats;\n\n // ========== MOUNT: 第一次数据挂载之前 ==========\n useEffect(() => {\n // 检测数据源变化(重新挂载的情况)\n if (dataLengthRef.current !== dataSource.length) {\n dataLengthRef.current = dataSource.length;\n // 数据变化时重置状态,允许重新触发生命周期\n isMounted.current = false;\n hasRendered.current = false;\n }\n\n // 防止重复执行\n if (isMounted.current) {\n return;\n }\n\n // 调用 onBeforeMount 回调,可进行数据验证\n const shouldContinue = lifecycleRef.current?.onBeforeMount?.(dataSourceRef.current);\n\n // 如果返回 false,阻止组件挂载\n if (shouldContinue === false) {\n console.warn(`[${componentType}] Mount aborted by onBeforeMount`);\n return;\n }\n\n // 标记为已挂载\n isMounted.current = true;\n }, [dataSource.length]);\n\n // ========== MOUNT: 第一次渲染完成 ==========\n useEffect(() => {\n // 修复:如果 isRendered=true 但 isMounted=false,说明是重新挂载\n // 需要先触发 onBeforeMount,然后标记为已挂载\n if (!isMounted.current && isRendered && renderStats) {\n const shouldContinue = lifecycleRef.current?.onBeforeMount?.(dataSourceRef.current);\n if (shouldContinue === false) {\n console.warn(`[${componentType}] Mount aborted by onBeforeMount`);\n return;\n }\n isMounted.current = true;\n }\n\n // 必须满足以下条件才触发:\n // 1. 组件已挂载\n // 2. 图层已渲染完成\n // 3. 尚未触发过 firstRender(防止重复触发)\n // 4. 有渲染统计数据\n if (!isMounted.current || !isRendered || hasRendered.current || !renderStats) {\n return;\n }\n\n // 标记为已渲染\n hasRendered.current = true;\n\n // 调用 onFirstRender 回调,直接使用当前 renderStats 参数\n lifecycleRef.current?.onFirstRender?.({\n totalCount: renderStats.totalCount,\n renderedCount: renderStats.renderedCount,\n virtualized: renderStats.virtualized,\n componentType,\n });\n }, [\n isRendered,\n renderStats?.totalCount,\n renderStats?.renderedCount,\n renderStats?.virtualized,\n componentType,\n ]);\n\n // ========== UPDATE: 状态变化 ==========\n useEffect(() => {\n // 必须当前状态有效才处理\n if (!currentState) {\n return;\n }\n\n // 获取上一个状态\n const prevStatus = prevStatusRef.current;\n\n // 比较状态是否发生变化(根据具体状态结构比较)\n const stateChanged =\n !prevStatus ||\n ('mode' in prevStatus && 'mode' in currentState && prevStatus.mode !== currentState.mode) ||\n ('plotId' in prevStatus &&\n 'plotId' in currentState &&\n prevStatus.plotId !== currentState.plotId) ||\n ('action' in prevStatus &&\n 'action' in currentState &&\n prevStatus.action !== currentState.action) ||\n ('roadId' in prevStatus &&\n 'roadId' in currentState &&\n prevStatus.roadId !== currentState.roadId) ||\n ('irrigationId' in prevStatus &&\n 'irrigationId' in currentState &&\n prevStatus.irrigationId !== currentState.irrigationId) ||\n ('markerId' in prevStatus &&\n 'markerId' in currentState &&\n prevStatus.markerId !== currentState.markerId);\n\n if (stateChanged) {\n // 调用 onStateChange 回调,传入新旧状态\n lifecycleRef.current?.onStateChange?.({\n ...currentState,\n prevStatus,\n });\n\n // 更新上一个状态引用\n prevStatusRef.current = currentState;\n }\n }, [currentState, componentType]);\n\n // ========== UNMOUNT: 组件卸载前 ==========\n useEffect(() => {\n // 返回清理函数,在组件卸载时执行\n return () => {\n // 只有已挂载的组件才需要清理\n if (!isMounted.current) {\n return;\n }\n\n // 调用 onBeforeUnmount 回调,可进行异步保存等操作\n lifecycleRef.current?.onBeforeUnmount?.();\n\n // 标记为已卸载\n isMounted.current = false;\n };\n }, []);\n}\n\nexport default useLifecycle;\n","/**\n * 解析编辑模式的 Hook\n * @description 统一处理各组件的 editMode 属性解析逻辑\n */\n\nimport { useMemo } from 'react';\nimport type { ReactNode } from 'react';\nimport type { ToolbarColor, ToolbarSize } from '../components/shared/BaseEditToolbar';\n\n/**\n * 编辑模式对象配置\n */\nexport interface EditModeObjectConfig<T extends string> {\n /** 启用的编辑按钮 */\n enabled?: boolean | T[];\n /** 自定义工具栏内容 */\n toolbar?: ReactNode;\n /** 内置按钮的统一颜色(支持预设色和自定义颜色) */\n color?: ToolbarColor;\n /** 内置按钮的统一尺寸(支持预设尺寸和自定义数字) */\n size?: ToolbarSize;\n /** 是否仅显示图标(不显示文字) */\n iconOnly?: boolean;\n}\n\n/**\n * 编辑模式类型\n * - `false`: 禁用编辑\n * - `true`: 启用全部编辑功能\n * - `T[]`: 启用指定的编辑按钮\n * - `EditModeObjectConfig<T>`: 对象配置,支持自定义工具栏\n */\nexport type EditModeConfig<T extends string> = boolean | T[] | EditModeObjectConfig<T>;\n\n/**\n * 编辑模式解析结果\n */\nexport interface EditModeResult<T extends string> {\n /** 是否启用编辑模式 */\n editEnabled: boolean;\n /** 启用的按钮列表 */\n enabledButtons: T[];\n /** 自定义工具栏内容 */\n customToolbar?: ReactNode;\n /** 内置按钮的统一颜色 */\n color?: ToolbarColor;\n /** 内置按钮的统一尺寸 */\n size?: ToolbarSize;\n /** 是否仅显示图标 */\n iconOnly?: boolean;\n}\n\n/**\n * 解析编辑模式配置\n * @param editModeProp 编辑模式属性值\n * @param defaultButtons 当 editMode 为 true 时默认启用的按钮\n * @returns EditModeResult\n *\n * @example\n * ```ts\n * // PlotLayer\n * const { editEnabled, enabledButtons } = useEditMode(\n * editModeProp,\n * ['redraw', 'clip', 'move', 'create', 'delete'] as const\n * );\n *\n * // Marker\n * const { editEnabled, enabledButtons } = useEditMode(\n * editModeProp,\n * ['create', 'move', 'delete'] as const\n * );\n *\n * // 使用对象配置\n * const { editEnabled, enabledButtons, customToolbar } = useEditMode(\n * { enabled: ['create', 'move'], toolbar: <Button>自定义</Button> },\n * ['create', 'move', 'delete'] as const\n * );\n * ```\n */\nexport function useEditMode<T extends string>(\n editModeProp: EditModeConfig<T> | undefined,\n defaultButtons: readonly T[]\n): EditModeResult<T> {\n return useMemo(() => {\n // 处理 undefined 或 false\n if (editModeProp === undefined || editModeProp === false) {\n return { editEnabled: false, enabledButtons: [] };\n }\n\n // 处理 true\n if (editModeProp === true) {\n return { editEnabled: true, enabledButtons: [...defaultButtons] };\n }\n\n // 处理数组\n if (Array.isArray(editModeProp)) {\n return { editEnabled: true, enabledButtons: editModeProp };\n }\n\n // 处理对象配置\n if (typeof editModeProp === 'object') {\n const { enabled, toolbar, color, size, iconOnly } = editModeProp;\n\n if (enabled === false) {\n return {\n editEnabled: false,\n enabledButtons: [],\n customToolbar: toolbar,\n color,\n size,\n iconOnly,\n };\n }\n\n if (enabled === true || enabled === undefined) {\n return {\n editEnabled: true,\n enabledButtons: [...defaultButtons],\n customToolbar: toolbar,\n color,\n size,\n iconOnly,\n };\n }\n\n if (Array.isArray(enabled)) {\n return {\n editEnabled: true,\n enabledButtons: enabled,\n customToolbar: toolbar,\n color,\n size,\n iconOnly,\n };\n }\n }\n\n return { editEnabled: false, enabledButtons: [] };\n }, [editModeProp, defaultButtons]);\n}\n\nexport default useEditMode;\n","/**\n * @fileoverview 线要素渲染 hook(共享逻辑)\n * @description 提取 Irrigation 和 Road 组件中重复的图层管理逻辑:\n * - 主渲染 useEffect 的图层创建/销毁/编辑模式过滤\n * - 组件卸载时清理编辑图层 (editingLayerRef)\n * @module hooks/usePolylineRenderer\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- 泛型约束需要 */\n\nimport { useEffect, useRef, type MutableRefObject } from 'react';\nimport L from 'leaflet';\n\ninterface UsePolylineRendererOptions<T = unknown> {\n map: L.Map | null;\n normalizedData: T[];\n value: string | number | null;\n currentMode: 'idle' | 'create' | 'redraw' | 'delete' | 'reverse';\n /** 渲染单条数据到 layerGroup 中 */\n renderItem: (item: T, layerGroup: L.LayerGroup, index: number) => void;\n layerGroupRef: MutableRefObject<L.LayerGroup | null>;\n layerByIdRef: MutableRefObject<Record<string | number, any>>;\n editingLayerRef: MutableRefObject<any | null>;\n deps: unknown[];\n}\n\n/**\n * 管理线要素图层的创建与清理\n *\n * 负责:\n * 1. 编辑模式下过滤数据(create/edit 模式不渲染已有要素)\n * 2. 创建 LayerGroup 并将数据渲染进去\n * 3. 组件卸载时移除 editingLayerRef\n *\n * 注意:editingLayerRef 的日常生命周期(handleRedraw/handleEdit 创建、\n * handleCancel/handleSave 销毁)由组件自行管理,此 hook 仅在组件卸载时兜底清理。\n */\nexport function usePolylineRenderer<T = unknown>(options: UsePolylineRendererOptions<T>): void {\n const {\n map,\n normalizedData,\n value,\n currentMode,\n renderItem,\n layerGroupRef,\n layerByIdRef,\n editingLayerRef,\n deps,\n } = options;\n\n // 追踪是否是组件卸载,以区分依赖变更和卸载\n const isUnmountedRef = useRef(false);\n // 追踪上一次 normalizedData,用于判断数据是否实际变化\n const prevDataRef = useRef<any[] | null>(null);\n\n useEffect(() => {\n isUnmountedRef.current = false;\n\n // 判断 normalizedData 是否发生变化\n const dataChanged = normalizedData !== prevDataRef.current;\n prevDataRef.current = normalizedData;\n\n const currentMap = map;\n if (!currentMap || !normalizedData || normalizedData.length === 0) {\n if (layerGroupRef.current) {\n map!.removeLayer(layerGroupRef.current);\n layerGroupRef.current = null;\n layerByIdRef.current = {};\n }\n return;\n }\n\n // 编辑模式下过滤数据(数据变化时不过滤,允许新建保存后立即渲染新数据)\n let renderItems = normalizedData;\n if ((currentMode === 'create' || currentMode === 'redraw') && !dataChanged) {\n renderItems = [];\n }\n\n if (layerGroupRef.current) {\n currentMap.removeLayer(layerGroupRef.current);\n }\n layerByIdRef.current = {};\n\n if (renderItems.length === 0) {\n return;\n }\n\n const layerGroup = L.layerGroup().addTo(currentMap);\n layerGroupRef.current = layerGroup;\n\n renderItems.forEach((item, index) => renderItem(item, layerGroup, index));\n\n // 数据变化时清理编辑图层(新建保存后数据源更新时,移除临时的编辑图层避免重复)\n if (dataChanged && editingLayerRef.current) {\n currentMap.removeLayer(editingLayerRef.current);\n editingLayerRef.current = null;\n }\n\n return () => {\n if (layerGroupRef.current) {\n currentMap.removeLayer(layerGroupRef.current);\n layerGroupRef.current = null;\n layerByIdRef.current = {};\n }\n // 仅在组件卸载时清理编辑图层(依赖变更时由组件自行管理)\n if (isUnmountedRef.current && editingLayerRef.current) {\n currentMap.removeLayer(editingLayerRef.current);\n editingLayerRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, normalizedData, value, currentMode, renderItem, ...deps]);\n\n // 组件卸载标记\n useEffect(() => {\n return () => {\n isUnmountedRef.current = true;\n };\n }, []);\n}\n","/**\n * 折线编辑器状态管理 Hook\n *\n * 封装 Irrigation / Road 等折线类组件共享的编辑状态机逻辑:\n * - currentMode / tempPoints 状态管理\n * - pendingCreate 流程(新建 → 保存 → 抽屉 → 完成/取消)\n * - handleCancel(清理编辑状态)\n * - Escape 快捷键取消\n * - normalizedData 变化时自动重置 pendingCreate 状态\n * - pm:create / pm:edit 事件监听\n */\n\n/* eslint-disable react-hooks/exhaustive-deps -- ref 回调稳定 */\n\nimport { useEffect, useRef, useState, useCallback } from 'react';\nimport type L from 'leaflet';\nimport type { Coordinate } from '../types';\nimport { useLatestRef } from './useLatestRef';\n\nexport interface UsePolylineEditorOptions {\n /** Leaflet 地图实例 */\n map: L.Map | null;\n /** 编辑中的图层引用(由组件持有,类型各不相同) */\n editingLayerRef: React.MutableRefObject<L.Polyline | null>;\n /** 标准化后的数据源,用于检测 pendingCreate 保存后的数据变化 */\n normalizedData: unknown[];\n /** Whether PM event listeners (pm:create, pm:edit, etc.) should be active. Default: true */\n pmEventsEnabled?: boolean;\n /** Called when pm:create fires. Use this to convert the drawn layer type (e.g., asIrrigationLayer). */\n onDrawnLayer?: (drawnLayer: L.Polyline) => void;\n /** Optional runtime guard for pm:create event. Return false to skip handling. */\n pmCreateGuard?: () => boolean;\n}\n\nexport interface UsePolylineEditorReturn {\n /** 当前编辑模式 */\n currentMode: 'idle' | 'create' | 'redraw' | 'delete' | 'reverse';\n /** 设置当前编辑模式 */\n setCurrentMode: React.Dispatch<\n React.SetStateAction<'idle' | 'create' | 'redraw' | 'delete' | 'reverse'>\n >;\n /** 临时坐标点(绘制/编辑中的坐标) */\n tempPoints: Coordinate[];\n /** 设置临时坐标点 */\n setTempPoints: React.Dispatch<React.SetStateAction<Coordinate[]>>;\n /** 新建待提交标记 ref(详见各组件中 pendingCreateRef 注释) */\n pendingCreateRef: React.MutableRefObject<boolean>;\n /** 编辑前原始坐标 ref */\n originalPointsRef: React.MutableRefObject<Coordinate[] | null>;\n /** currentMode 的最新引用(用于在回调和事件处理中读取最新值) */\n currentModeRef: React.MutableRefObject<'idle' | 'create' | 'redraw' | 'delete' | 'reverse'>;\n /** 取消操作:清理所有编辑状态 */\n handleCancel: () => void;\n}\n\nexport function usePolylineEditor(options: UsePolylineEditorOptions): UsePolylineEditorReturn {\n const {\n map: mapInput,\n editingLayerRef,\n normalizedData,\n pmEventsEnabled = true,\n onDrawnLayer,\n pmCreateGuard,\n } = options;\n\n // map 在实际使用中不会为 null(组件在 MapProvider 内部)\n const map = mapInput!;\n\n const [currentMode, setCurrentMode] = useState<\n 'idle' | 'create' | 'redraw' | 'delete' | 'reverse'\n >('idle');\n const [tempPoints, setTempPoints] = useState<Coordinate[]>([]);\n const pendingCreateRef = useRef(false);\n const originalPointsRef = useRef<Coordinate[] | null>(null);\n const currentModeRef = useLatestRef(currentMode);\n const onDrawnLayerRef = useLatestRef(onDrawnLayer);\n const pmCreateGuardRef = useLatestRef(pmCreateGuard);\n\n // 取消操作:清理所有编辑状态\n const handleCancel = useCallback(() => {\n if (map.pm) {\n map.pm.disableDraw();\n // 仅在全局编辑模式已启用时才禁用,避免 Geoman 内部报错\n if (map.pm.globalEditModeEnabled?.()) {\n map.pm.disableGlobalEditMode();\n }\n }\n\n if (editingLayerRef.current) {\n map.removeLayer(editingLayerRef.current);\n }\n editingLayerRef.current = null;\n pendingCreateRef.current = false;\n\n setCurrentMode('idle');\n setTempPoints([]);\n originalPointsRef.current = null;\n }, [map, editingLayerRef]);\n\n const handleCancelRef = useLatestRef(handleCancel);\n\n // Escape 快捷键取消\n useEffect(() => {\n if (currentMode === 'idle') return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n handleCancelRef.current();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [currentMode]);\n\n // 新建保存后,等待 dataSource 更新时自动重置到 idle 模式\n // 作用:检测 pendingCreate 状态下 normalizedData 的变化,自动完成流程重置\n const prevNormalizedDataRef = useRef(normalizedData);\n useEffect(() => {\n if (pendingCreateRef.current && normalizedData !== prevNormalizedDataRef.current) {\n pendingCreateRef.current = false;\n setCurrentMode('idle');\n setTempPoints([]);\n originalPointsRef.current = null;\n }\n prevNormalizedDataRef.current = normalizedData;\n }, [normalizedData]);\n\n // pm:create 事件监听\n useEffect(() => {\n if (!map || !pmEventsEnabled) return;\n\n const handleCreate = (e: L.LeafletEvent) => {\n if (currentModeRef.current !== 'create') return;\n if (pmCreateGuardRef.current && !pmCreateGuardRef.current()) return;\n\n const pmEvent = e as L.PM.ChangeEvent;\n const drawnLayer = pmEvent.layer as L.Polyline;\n if (drawnLayer) {\n const latlngs = drawnLayer.getLatLngs() as L.LatLng[];\n const coords: Coordinate[] = latlngs.map(ll => [ll.lat, ll.lng]);\n\n // 移除 Geoman 创建的图层,由 previewLine 显示\n map.removeLayer(drawnLayer);\n\n if (onDrawnLayerRef.current) {\n onDrawnLayerRef.current(drawnLayer);\n } else {\n editingLayerRef.current = null;\n }\n setTempPoints(coords);\n }\n if (map.pm) {\n map.pm.disableDraw();\n }\n };\n\n map.on('pm:create', handleCreate);\n return () => {\n map.off('pm:create', handleCreate);\n };\n }, [map, pmEventsEnabled]);\n\n // pm:edit / pm:vertexadded / pm:vertexremoved / pm:markerdragend 事件监听\n useEffect(() => {\n if (!map || !pmEventsEnabled) return;\n\n const handleChange = (e: L.LeafletEvent) => {\n if (currentModeRef.current !== 'redraw') return;\n\n const pmEvent = e as L.PM.ChangeEvent;\n const layer = (pmEvent.layer || editingLayerRef.current) as L.Polyline | null;\n if (layer) {\n const latlngs = layer.getLatLngs();\n\n let coords: Coordinate[] | undefined;\n if (latlngs && latlngs.length > 0) {\n const first = latlngs[0];\n if (first && 'lat' in first) {\n coords = (latlngs as L.LatLng[]).map(ll => [ll.lat, ll.lng]);\n } else if (Array.isArray(first)) {\n coords = (first as L.LatLng[]).map(ll => [ll.lat, ll.lng]);\n }\n }\n if (coords) {\n setTempPoints(coords);\n }\n }\n };\n\n map.on('pm:edit', handleChange);\n map.on('pm:vertexadded', handleChange);\n map.on('pm:vertexremoved', handleChange);\n map.on('pm:markerdragend', handleChange);\n\n return () => {\n map.off('pm:edit', handleChange);\n map.off('pm:vertexadded', handleChange);\n map.off('pm:vertexremoved', handleChange);\n map.off('pm:markerdragend', handleChange);\n };\n }, [map, pmEventsEnabled]);\n\n return {\n currentMode,\n setCurrentMode,\n tempPoints,\n setTempPoints,\n pendingCreateRef,\n originalPointsRef,\n currentModeRef,\n handleCancel,\n };\n}\n\n// ========== usePolylineSave ==========\n\nexport interface UsePolylineSaveOptions {\n map: L.Map | null;\n currentMode: 'idle' | 'create' | 'redraw' | 'delete' | 'reverse';\n tempPoints: Coordinate[];\n value: string | number | null;\n editingLayerRef: React.MutableRefObject<L.Polyline | null>;\n pendingCreateRef: React.MutableRefObject<boolean>;\n originalPointsRef: React.MutableRefObject<Coordinate[] | null>;\n layerByIdRef: React.MutableRefObject<Record<string | number, L.Polyline>>;\n setCurrentMode: React.Dispatch<\n React.SetStateAction<'idle' | 'create' | 'redraw' | 'delete' | 'reverse'>\n >;\n setTempPoints: React.Dispatch<React.SetStateAction<Coordinate[]>>;\n /** Called when create save is triggered with the new points */\n onCreateSave: (points: Coordinate[]) => void;\n /** Called when edit save is triggered with id, oldPoints, newPoints */\n onEditSave: (id: string | number, oldPoints: Coordinate[], newPoints: Coordinate[]) => void;\n}\n\nexport function usePolylineSave(options: UsePolylineSaveOptions): { handleSave: () => void } {\n const {\n map: mapInput,\n currentMode,\n tempPoints,\n value,\n editingLayerRef,\n pendingCreateRef,\n originalPointsRef,\n layerByIdRef,\n setCurrentMode,\n setTempPoints,\n onCreateSave,\n onEditSave,\n } = options;\n\n // map 在实际使用中不会为 null\n const map = mapInput!;\n\n const onCreateSaveRef = useLatestRef(onCreateSave);\n const onEditSaveRef = useLatestRef(onEditSave);\n\n const handleSave = useCallback(() => {\n if (map.pm) map.pm.disableDraw();\n\n let newPoints = tempPoints;\n\n // 编辑模式下从图层实时获取最新坐标(拖拽编辑后)\n if (currentMode === 'redraw' && editingLayerRef.current) {\n const latlngs = editingLayerRef.current.getLatLngs() as L.LatLng[];\n newPoints = latlngs.map(ll => [ll.lat, ll.lng]);\n }\n\n if (currentMode === 'create' && newPoints.length >= 2) {\n onCreateSaveRef.current(newPoints);\n\n // 禁用图层的 geoman 编辑模式,但保留图层在地图上可见\n // 图层将在 normalizedData 更新后由 usePolylineRenderer 清理并替换为正式图层\n editingLayerRef.current?.pm?.disable?.();\n pendingCreateRef.current = true;\n\n // 注意:不清空 tempPoints,保持 previewLine 显示直到 dataSource 更新\n // tempPoints 将在 normalizedData 变化后由 useEffect 自动清空\n } else if (currentMode === 'redraw' && newPoints.length >= 2) {\n onEditSaveRef.current(value!, originalPointsRef.current!, newPoints);\n\n if (editingLayerRef.current) {\n map.removeLayer(editingLayerRef.current);\n editingLayerRef.current = null;\n }\n delete layerByIdRef.current[value!];\n\n // 编辑模式下禁用全局编辑模式,确保编辑状态被完全清理\n if (map.pm.globalEditModeEnabled?.()) {\n map.pm.disableGlobalEditMode();\n }\n }\n\n // 新建待提交时不立即重置模式和清空 tempPoints\n // 原因:\n // 1. 不重置 currentMode → 工具栏保持显示取消/保存按钮\n // 2. 不清空 tempPoints → 保存按钮不会被禁用(toolbar 中 saveDisabled = pointCount < 2)\n // 即使抽屉被误取消,用户仍可再次点击保存按钮重新触发 onCreate\n // 状态清理由以下两种途径完成:\n // - 抽屉保存成功 → normalizedData 变化 → useEffect 自动重置\n // - 用户点击工具栏取消 → handleCancel() 清理\n if (!(currentMode === 'create' && pendingCreateRef.current)) {\n setCurrentMode('idle');\n setTempPoints([]);\n originalPointsRef.current = null;\n }\n }, [\n currentMode,\n tempPoints,\n value,\n map,\n editingLayerRef,\n pendingCreateRef,\n originalPointsRef,\n layerByIdRef,\n setCurrentMode,\n setTempPoints,\n ]);\n\n return { handleSave };\n}\n","/**\n * @fileoverview Loading 覆盖层 Hook\n * @description 提取各组件中重复的 Loading 覆盖层逻辑\n */\n\nimport { useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport type L from 'leaflet';\nimport Loading from '../components/Loading';\nimport type { LoadingMaskConfig } from '../types';\nimport type { LoadingIconName, LoadingSize } from '../types/loading';\nimport { LOADING_DEFAULT_MASK_BACKGROUND, LOADING_DEFAULT_MASK_ZINDEX } from '../constants/styles';\n\nexport interface UseLoadingOverlayOptions {\n /** 是否显示加载状态 */\n loading: boolean;\n /** Loading 遮罩配置 */\n loadingMask?: LoadingMaskConfig;\n /** Leaflet 地图实例 */\n map: L.Map | null;\n /** Loading 覆盖层的 CSS 类名 */\n className: string;\n /** 自定义 Loading 图标名称,默认为 'loading-spinner' */\n icon?: LoadingIconName;\n /** 自定义 Loading 尺寸,默认为 'large' */\n size?: LoadingSize;\n}\n\n/**\n * Loading 覆盖层 Hook\n *\n * @description\n * 提取各图层组件中重复的 Loading 覆盖层逻辑,包括:\n * - PlotLayer / PlotGroupLayer\n * - Road / Irrigation\n * - Marker\n *\n * @example\n * ```tsx\n * const loadingOverlay = useLoadingOverlay({\n * loading,\n * loadingMask,\n * map,\n * className: 'agri-plot-loading-overlay',\n * });\n *\n * return (\n * <>\n * {/* 其他内容 *}\n * {loadingOverlay}\n * </>\n * );\n * ```\n */\nexport function useLoadingOverlay(options: UseLoadingOverlayOptions): React.ReactNode | null {\n const {\n loading,\n loadingMask,\n map,\n className,\n icon = 'loading-spinner',\n size = 'large',\n } = options;\n\n return useMemo(() => {\n if (!loading || !map) return null;\n\n const container = map.getContainer();\n if (!container) return null;\n\n const maskEnabled = loadingMask?.enabled !== false;\n const maskBackground = loadingMask?.background || LOADING_DEFAULT_MASK_BACKGROUND;\n const maskZIndex = loadingMask?.zIndex ?? LOADING_DEFAULT_MASK_ZINDEX;\n\n return createPortal(\n <div\n className={className}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: maskEnabled ? maskBackground : 'transparent',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: maskZIndex,\n pointerEvents: 'none',\n }}\n >\n <Loading icon={icon} size={size} />\n </div>,\n container\n );\n }, [loading, loadingMask, map, className, icon, size]);\n}\n","/**\n * React 渲染优化工具 Hooks\n * @description 提供性能优化的 React Hooks,减少不必要的重渲染\n */\n\n/* eslint-disable react-hooks/exhaustive-deps -- compute 函数稳定 */\n\nimport { useRef, useMemo } from 'react';\n\n/**\n * 浅比较函数\n */\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\n return false;\n }\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if ((a as Record<string, unknown>)[key] !== (b as Record<string, unknown>)[key]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * 深度比较函数(简化版)\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\n return a === b;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, i) => deepEqual(item, b[i]));\n }\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (!deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * useMemoCompare - 带比较函数的 useMemo\n * @description 只有当比较函数返回 false 时才更新缓存值,避免不必要的重渲染\n *\n * @param compute - 计算函数\n * @param equal - 比较函数,返回 true 表示值相等\n * @param deps - 依赖数组\n * @returns 缓存的计算结果\n *\n * @example\n * ```tsx\n * const visibleTracks = useMemoCompare(\n * () => computeVisibleTracks(parsedTracks, viewport),\n * (a, b) => a.length === b.length && a.every((t, i) => t.key === b[i].key),\n * [parsedTracks, viewport]\n * );\n * ```\n */\nexport function useMemoCompare<T>(\n compute: () => T,\n equal: (a: T, b: T) => boolean,\n deps: React.DependencyList\n): T {\n const ref = useRef<T>(compute());\n const computed = useMemo(() => compute(), deps);\n\n if (!equal(ref.current, computed)) {\n ref.current = computed;\n }\n return ref.current as T;\n}\n\n/**\n * useShallowCompare - 浅比较 useMemo\n * @description 对对象/数组进行浅比较,避免深度比较的开销\n *\n * @param compute - 计算函数\n * @param deps - 依赖数组\n * @returns 缓存的计算结果\n *\n * @example\n * ```tsx\n * const styles = useShallowCompare(\n * () => ({ color: selected ? 'red' : 'blue', weight: 2 }),\n * [selected]\n * );\n * ```\n */\nexport function useShallowCompare<T extends object>(\n compute: () => T,\n deps: React.DependencyList\n): T {\n return useMemoCompare<T>(compute, shallowEqual, deps) as T;\n}\n\n/**\n * useDeepCompare - 深度比较 useMemo\n * @description 对对象/数组进行深度比较,适用于复杂对象\n *\n * @param compute - 计算函数\n * @param deps - 依赖数组\n * @returns 缓存的计算结果\n *\n * @example\n * ```tsx\n * const config = useDeepCompare(\n * () => parseConfig(props.config),\n * [props.config]\n * );\n * ```\n */\nexport function useDeepCompare<T>(compute: () => T, deps: React.DependencyList): T {\n return useMemoCompare<T>(compute, deepEqual, deps) as T;\n}\n\n/**\n * useCallbackRef - 稳定的回调引用\n * @description 返回一个稳定的函数引用,内部始终调用最新的回调\n *\n * @param callback - 回调函数\n * @returns 稳定的函数引用\n *\n * @example\n * ```tsx\n * // 避免将回调作为依赖项\n * const handleClick = useCallbackRef((id) => {\n * onSelect(id); // 始终调用最新的 onSelect\n * });\n * ```\n */\nexport function useCallbackRef<T extends (...args: unknown[]) => unknown>(\n callback: T | undefined\n): T {\n const ref = useRef(callback);\n ref.current = callback;\n\n return useMemo(() => {\n return ((...args: unknown[]) => ref.current?.(...args)) as T;\n }, []);\n}\n\n/**\n * useLazyRef - 延迟初始化 ref\n * @description 只在首次渲染时执行初始化函数\n *\n * @param init - 初始化函数\n * @returns ref 对象\n *\n * @example\n * ```tsx\n * const mapRef = useLazyRef(() => new Map());\n * ```\n */\nexport function useLazyRef<T>(init: () => T): React.MutableRefObject<T> {\n const ref = useRef<T | null>(null);\n\n if (ref.current === null) {\n ref.current = init();\n }\n\n return ref as React.MutableRefObject<T>;\n}\n\nexport default {\n useMemoCompare,\n useShallowCompare,\n useDeepCompare,\n useCallbackRef,\n useLazyRef,\n shallowEqual,\n};\n","/**\n * @fileoverview 统一错误处理工具\n * @description 提供统一的错误处理、日志记录和错误边界包装器\n * @module utils/errorHandling\n * @since 2.1.0 统一优化\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- 错误处理需要 */\n\n/** 组件名称映射 */\nexport const COMPONENT_NAMES = {\n PLOT_LAYER: 'PlotLayer',\n MARKER: 'Marker',\n TRACK: 'Track',\n ROAD: 'Road',\n IRRIGATION: 'Irrigation',\n TIAN_DI_TU: 'TianDiTuLayer',\n MINI_MAP: 'MiniMap',\n CLUSTER_VIEW: 'ClusterView',\n} as const;\n\nexport type ComponentName = (typeof COMPONENT_NAMES)[keyof typeof COMPONENT_NAMES];\n\n/** 日志级别 */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\n/** 日志配置 */\ninterface LogConfig {\n enabled: boolean;\n minLevel: LogLevel;\n prefix: string;\n}\n\n/** 默认日志配置 */\nconst defaultLogConfig: LogConfig = {\n enabled: process.env.NODE_ENV === 'development',\n minLevel: 'warn',\n prefix: '[AgriMap]',\n};\n\n/** 当前日志配置 */\nlet currentLogConfig = { ...defaultLogConfig };\n\n/**\n * 配置日志\n */\nexport function configureLog(config: Partial<LogConfig>) {\n currentLogConfig = { ...currentLogConfig, ...config };\n}\n\n/**\n * 日志输出\n */\nfunction log(level: LogLevel, componentName: string, message: string, ...args: unknown[]) {\n if (!currentLogConfig.enabled) return;\n\n const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n const minLevelIndex = levels.indexOf(currentLogConfig.minLevel);\n const currentLevelIndex = levels.indexOf(level);\n\n if (currentLevelIndex < minLevelIndex) return;\n\n const prefix = `${currentLogConfig.prefix}[${componentName}]`;\n\n switch (level) {\n case 'debug':\n console.debug(prefix, message, ...args);\n break;\n case 'info':\n console.info(prefix, message, ...args);\n break;\n case 'warn':\n console.warn(prefix, message, ...args);\n break;\n case 'error':\n console.error(prefix, message, ...args);\n break;\n }\n}\n\n/** 日志工具 */\nexport const logger = {\n debug: (component: string, message: string, ...args: unknown[]) =>\n log('debug', component, message, ...args),\n info: (component: string, message: string, ...args: unknown[]) =>\n log('info', component, message, ...args),\n warn: (component: string, message: string, ...args: unknown[]) =>\n log('warn', component, message, ...args),\n error: (component: string, message: string, ...args: unknown[]) =>\n log('error', component, message, ...args),\n};\n\n/**\n * 安全执行函数\n * @description 包裹函数执行,添加错误处理和日志记录\n *\n * @example\n * ```tsx\n * // 简单使用\n * const result = safeCall(\n * () => JSON.parse(data),\n * 'Marker',\n * 'parseData'\n * );\n *\n * // 带默认值\n * const result = safeCall(\n * () => riskyOperation(),\n * 'PlotLayer',\n * 'riskyOperation',\n * { defaultValue: [] }\n * );\n * ```\n */\nexport function safeCall<T>(\n fn: () => T,\n componentName: ComponentName | string,\n operationName: string,\n options?: {\n defaultValue?: T;\n onError?: (error: Error) => void;\n rethrow?: boolean;\n }\n): T | undefined {\n const { defaultValue, onError, rethrow = false } = options || {};\n\n try {\n return fn();\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n logger.error(componentName, `${operationName} 失败:`, err.message);\n\n if (onError) {\n try {\n onError(err);\n } catch (handlerError) {\n logger.error(componentName, '错误处理函数执行失败:', handlerError);\n }\n }\n\n if (rethrow) {\n throw err;\n }\n\n return defaultValue as T;\n }\n}\n\n/**\n * 安全执行异步函数\n */\nexport async function safeCallAsync<T>(\n fn: () => Promise<T>,\n componentName: ComponentName | string,\n operationName: string,\n options?: {\n defaultValue?: T;\n onError?: (error: Error) => void;\n rethrow?: boolean;\n }\n): Promise<T | undefined> {\n const { defaultValue, onError, rethrow = false } = options || {};\n\n try {\n return await fn();\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n logger.error(componentName, `${operationName} 失败:`, err.message);\n\n if (onError) {\n try {\n onError(err);\n } catch (handlerError) {\n logger.error(componentName, '错误处理函数执行失败:', handlerError);\n }\n }\n\n if (rethrow) {\n throw err;\n }\n\n return defaultValue as T;\n }\n}\n\n/**\n * 创建带上下文的安全执行器\n * @description 为特定组件创建预配置的安全执行函数\n *\n * @example\n * ```tsx\n * // 在组件中使用\n * const safeExec = createSafeExecutor('Marker');\n *\n * // 使用\n * const result = safeExec(() => riskyOperation(), 'riskyOperation');\n * ```\n */\nexport function createSafeExecutor(componentName: ComponentName | string) {\n return <T>(\n fn: () => T,\n operationName: string,\n options?: {\n defaultValue?: T;\n onError?: (error: Error) => void;\n rethrow?: boolean;\n }\n ) => safeCall(fn, componentName, operationName, options);\n}\n\n/**\n * 创建带上下文的异步安全执行器\n */\nexport function createAsyncSafeExecutor(componentName: ComponentName | string) {\n return <T>(\n fn: () => Promise<T>,\n operationName: string,\n options?: {\n defaultValue?: T;\n onError?: (error: Error) => void;\n rethrow?: boolean;\n }\n ) => safeCallAsync(fn, componentName, operationName, options);\n}\n\n/**\n * 安全回调执行\n * @description 用于安全执行用户提供的回调函数\n */\nexport function safeCallback<T extends (...args: any[]) => any>(\n callback: T | undefined,\n componentName: ComponentName | string,\n callbackName: string,\n ...args: Parameters<T>\n): ReturnType<T> | undefined {\n if (!callback) return undefined;\n\n return safeCall(() => callback(...args), componentName, `callback:${callbackName}`);\n}\n\n/**\n * 批量安全执行\n * @description 安全执行多个操作,收集所有错误\n */\nexport function safeBatch(\n componentName: ComponentName | string,\n operations: { name: string; fn: () => void }[]\n): { success: number; failed: number; errors: Error[] } {\n const result = { success: 0, failed: 0, errors: [] as Error[] };\n\n for (const { name, fn } of operations) {\n try {\n fn();\n result.success++;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n logger.error(componentName, `${name} 失败:`, err.message);\n result.failed++;\n result.errors.push(err);\n }\n }\n\n return result;\n}\n\n/**\n * 条件断言\n * @description 断言条件为真,否则记录错误\n */\nexport function assert(\n condition: boolean,\n componentName: ComponentName | string,\n message: string\n): asserts condition {\n if (!condition) {\n const error = new Error(`Assertion failed: ${message}`);\n logger.error(componentName, message);\n throw error;\n }\n}\n\n/**\n * 软断言\n * @description 断言条件为真,仅记录警告不抛出错误\n */\nexport function softAssert(\n condition: boolean,\n componentName: ComponentName | string,\n message: string\n): boolean {\n if (!condition) {\n logger.warn(componentName, `Assertion warning: ${message}`);\n }\n return condition;\n}\n\nexport default {\n logger,\n safeCall,\n safeCallAsync,\n createSafeExecutor,\n createAsyncSafeExecutor,\n safeCallback,\n safeBatch,\n assert,\n softAssert,\n configureLog,\n COMPONENT_NAMES,\n};\n","/**\n * 性能监控 Hook\n * @description 提供组件渲染性能和地图操作性能的监控功能\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport type { Map } from 'leaflet';\nimport { logger } from '../utils/errorHandling';\n\n/**\n * 性能指标数据\n */\nexport interface PerformanceMetrics {\n /** 组件名称 */\n componentName: string;\n /** 首次渲染时间 (ms) */\n initialRenderTime?: number;\n /** 更新渲染时间 (ms) */\n updateRenderTime?: number;\n /** 渲染次数 */\n renderCount: number;\n /** 地图操作耗时 */\n mapOperationTime?: Record<string, number>;\n}\n\n/**\n * 性能监控配置\n */\nexport interface PerformanceMonitorConfig {\n /** 是否启用监控 */\n enabled?: boolean;\n /** 是否上报到监控服务 */\n reportToService?: boolean;\n /** 监控服务上报 URL */\n serviceUrl?: string;\n /** 额外数据 */\n extraData?: Record<string, unknown>;\n}\n\n/**\n * 性能监控 Hook\n * @description 监控组件渲染性能和地图操作性能\n *\n * @param componentName 组件名称\n * @param config 配置选项\n * @returns 性能指标数据和上报函数\n *\n * @example\n * ```tsx\n * // 基础用法\n * function PlotLayer() {\n * const { metrics, reportPerformance } = usePerformanceMonitor('PlotLayer');\n *\n * useEffect(() => {\n * console.log('渲染性能:', metrics);\n * }, [metrics]);\n *\n * return <div>...</div>;\n * }\n *\n * // 监控地图操作\n * function MapComponent() {\n * const map = useMap();\n * const { observeMapOperation } = usePerformanceMonitor('MapContent');\n *\n * useEffect(() => {\n * observeMapOperation(map, 'fitBounds', () => {\n * map.fitBounds(bounds);\n * });\n * }, [map]);\n *\n * return <div>...</div>;\n * }\n *\n * // 带配置的使用\n * function HeavyComponent() {\n * const { metrics } = usePerformanceMonitor('HeavyComponent', {\n * enabled: process.env.NODE_ENV === 'development',\n * reportToService: true,\n * serviceUrl: '/api/performance',\n * });\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function usePerformanceMonitor(\n componentName: string,\n config: PerformanceMonitorConfig = {}\n) {\n const { enabled = true, reportToService = false, serviceUrl, extraData } = config;\n\n const metricsRef = useRef<PerformanceMetrics>({\n componentName,\n renderCount: 0,\n });\n\n const startTimeRef = useRef<number>(performance.now());\n const renderCountRef = useRef(0);\n\n /**\n * 记录渲染性能\n */\n const recordRenderPerformance = useCallback(\n (renderType: 'initial' | 'update' = 'update') => {\n if (!enabled) return;\n\n const endTime = performance.now();\n const duration = endTime - startTimeRef.current;\n\n renderCountRef.current += 1;\n\n metricsRef.current = {\n componentName,\n renderCount: renderCountRef.current,\n ...(renderType === 'initial'\n ? { initialRenderTime: duration }\n : { updateRenderTime: duration }),\n mapOperationTime: metricsRef.current.mapOperationTime,\n };\n\n // 开发环境下输出日志\n if (process.env.NODE_ENV === 'development') {\n logger.info(\n 'PerformanceMonitor',\n `${componentName} ${renderType} render: ${duration.toFixed(2)}ms`,\n `Total renders: ${renderCountRef.current}`\n );\n }\n\n // 重置开始时间\n startTimeRef.current = performance.now();\n },\n [componentName, enabled]\n );\n\n /**\n * 观察地图操作性能\n */\n const observeMapOperation = useCallback(\n <T extends (...args: unknown[]) => unknown>(\n map: Map | null,\n operationName: string,\n operation: T\n ): ReturnType<T> => {\n if (!enabled || !map) {\n return operation() as ReturnType<T>;\n }\n\n const start = performance.now();\n const result = operation();\n const duration = performance.now() - start;\n\n // 记录地图操作耗时\n metricsRef.current.mapOperationTime = {\n ...metricsRef.current.mapOperationTime,\n [operationName]: duration,\n };\n\n if (process.env.NODE_ENV === 'development') {\n logger.info(\n 'PerformanceMonitor',\n `${componentName} map operation \"${operationName}\": ${duration.toFixed(2)}ms`\n );\n }\n\n return result as ReturnType<T>;\n },\n [componentName, enabled]\n );\n\n /**\n * 上报性能数据到监控服务\n */\n const reportPerformance = useCallback(async () => {\n if (!reportToService || !serviceUrl) return;\n\n const metrics = {\n ...metricsRef.current,\n timestamp: Date.now(),\n url: window.location.href,\n userAgent: navigator.userAgent,\n ...extraData,\n };\n\n try {\n await navigator.sendBeacon(serviceUrl, JSON.stringify(metrics));\n } catch (error) {\n logger.error('PerformanceMonitor', 'Failed to report metrics:', error);\n }\n }, [reportToService, serviceUrl, extraData]);\n\n /**\n * 获取内存使用情况\n */\n const getMemoryUsage = useCallback(() => {\n if ('memory' in performance) {\n const mem = (performance as unknown as { memory: { usedJSHeapSize: number } }).memory;\n return {\n usedJSHeapSize: mem.usedJSHeapSize,\n usedJSHeapSizeMB: (mem.usedJSHeapSize / 1024 / 1024).toFixed(2),\n };\n }\n return null;\n }, []);\n\n /**\n * 获取完整的性能指标\n */\n const getMetrics = useCallback((): PerformanceMetrics & {\n memory?: ReturnType<typeof getMemoryUsage>;\n } => {\n return {\n ...metricsRef.current,\n memory: getMemoryUsage(),\n };\n }, [getMemoryUsage]);\n\n // 初始化时记录首次渲染开始时间\n useEffect(() => {\n if (!enabled) return;\n\n startTimeRef.current = performance.now();\n\n return () => {\n // 组件卸载时上报\n if (reportToService) {\n reportPerformance();\n }\n };\n }, [enabled, reportToService, reportPerformance]);\n\n return {\n /** 性能指标数据 */\n metrics: metricsRef.current,\n /** 获取完整性能指标(包含内存) */\n getMetrics,\n /** 记录渲染性能 */\n recordRenderPerformance,\n /** 观察地图操作性能 */\n observeMapOperation,\n /** 上报性能数据 */\n reportPerformance,\n /** 获取内存使用情况 */\n getMemoryUsage,\n };\n}\n\nexport default usePerformanceMonitor;\n","/**\n * Web Worker Hook 封装\n * @description 提供空间索引和几何计算的 Worker 封装,支持增量更新和 R-Tree 索引\n */\n\nimport { useEffect, useRef, useCallback, useState } from 'react';\nimport type { PlotData, Coordinate } from '../types';\nimport type { BBox, BoundedItem } from '../utils/spatialIndex';\nimport { logger } from '../utils/errorHandling';\nimport type {\n IndexType,\n BuildIndexResponse,\n UpdateIndexResponse,\n QueryIndexResponse,\n} from '../workers/spatialIndex.worker';\n\n/** 空间索引 Worker 选项 */\nexport interface SpatialIndexWorkerOptions {\n /** 网格单元格大小 */\n cellSize?: number;\n /** 索引类型:grid(网格) | rtree(R-Tree) */\n indexType?: IndexType;\n /** 是否自动构建索引 */\n autoBuild?: boolean;\n /** 最大重试次数 */\n maxRetries?: number;\n /** 重试延迟(毫秒) */\n retryDelay?: number;\n}\n\n/** 空间索引 Worker 返回值 */\nexport interface SpatialIndexWorkerResult {\n /** 是否正在构建索引 */\n isBuilding: boolean;\n /** 是否已构建索引 */\n isReady: boolean;\n /** 地块数量 */\n itemCount: number;\n /** 构建耗时 (ms) */\n buildTime: number;\n /** 查询耗时 (ms) */\n queryTime: number;\n /** 更新耗时 (ms) */\n updateTime: number;\n /** 索引类型 */\n indexType: IndexType;\n /** 错误信息 */\n error: string | null;\n /** 重试次数 */\n retryCount: number;\n /** 构建空间索引 */\n buildIndex: (plots: PlotData[]) => Promise<void>;\n /** 查询视口内的地块 */\n query: (bounds: BBox) => Promise<BoundedItem[]>;\n /** 增量更新索引 */\n updateIndex: (\n addedItems?: BoundedItem[],\n removedIds?: (string | number)[],\n updatedItems?: BoundedItem[]\n ) => Promise<void>;\n /** 清空索引 */\n clear: () => void;\n /** 终止 Worker */\n terminate: () => void;\n /** 重置错误状态 */\n resetError: () => void;\n}\n\n/**\n * 空间索引 Worker Hook\n * @description 使用 Web Worker 处理大规模地块的空间索引\n *\n * @param options 配置选项\n * @returns Worker 操作接口\n *\n * @example\n * ```tsx\n * function PlotLayer({ dataSource }) {\n * const {\n * buildIndex,\n * query,\n * isReady,\n * queryTime\n * } = useSpatialIndexWorker({ cellSize: 0.01 });\n *\n * useEffect(() => {\n * buildIndex(dataSource);\n * }, [dataSource]);\n *\n * const handleMapMove = useCallback(async () => {\n * const bounds = map.getBounds();\n * const visibleIds = await query([\n * bounds.getSouth(),\n * bounds.getWest(),\n * bounds.getNorth(),\n * bounds.getEast()\n * ]);\n * setVisiblePlots(visibleIds);\n * }, [map, query]);\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function useSpatialIndexWorker(\n options: SpatialIndexWorkerOptions = {}\n): SpatialIndexWorkerResult {\n const { cellSize = 0.01, indexType = 'grid', maxRetries = 3, retryDelay = 1000 } = options;\n\n const workerRef = useRef<Worker | null>(null);\n const queryIdRef = useRef(0);\n const pendingQueries = useRef<Map<number, (value: BoundedItem[]) => void>>(new Map());\n const pendingBuild = useRef<(() => void) | null>(null);\n const pendingUpdate = useRef<(() => void) | null>(null);\n const retryCountRef = useRef(0);\n const lastErrorRef = useRef<string | null>(null);\n\n const [isBuilding, setIsBuilding] = useState(false);\n const [isReady, setIsReady] = useState(false);\n const [itemCount, setItemCount] = useState(0);\n const [buildTime, setBuildTime] = useState(0);\n const [queryTime, setQueryTime] = useState(0);\n const [updateTime, setUpdateTime] = useState(0);\n const [currentIndexType, setCurrentIndexType] = useState<IndexType>(indexType);\n const [error, setError] = useState<string | null>(null);\n const [retryCount, setRetryCount] = useState(0);\n\n // 初始化 Worker\n useEffect(() => {\n workerRef.current = new Worker(new URL('../workers/spatialIndex.worker.ts', import.meta.url), {\n type: 'module',\n });\n\n workerRef.current.onmessage = (\n event: MessageEvent<BuildIndexResponse | UpdateIndexResponse | QueryIndexResponse>\n ) => {\n const data = event.data;\n\n switch (data.type) {\n case 'built': {\n setItemCount(data.itemCount);\n setBuildTime(data.buildTime);\n setCurrentIndexType(data.indexType);\n setIsBuilding(false);\n setIsReady(true);\n setError(null);\n retryCountRef.current = 0;\n setRetryCount(0);\n pendingBuild.current?.();\n pendingBuild.current = null;\n break;\n }\n\n case 'updated': {\n setItemCount(data.itemCount);\n setUpdateTime(data.updateTime);\n setCurrentIndexType(data.indexType);\n setError(null);\n pendingUpdate.current?.();\n pendingUpdate.current = null;\n break;\n }\n\n case 'query-result': {\n setQueryTime(data.queryTime);\n const queryId = queryIdRef.current;\n const resolve = pendingQueries.current.get(queryId);\n if (resolve) {\n resolve(data.items);\n pendingQueries.current.delete(queryId);\n }\n break;\n }\n }\n };\n\n workerRef.current.onerror = event => {\n const errorMessage = event.message || 'Worker error occurred';\n lastErrorRef.current = errorMessage;\n setError(errorMessage);\n logger.error('SpatialIndexWorker', `Worker error: ${errorMessage}`);\n\n // 如果是构建错误且重试次数未达上限,则重试\n if (isBuilding && retryCountRef.current < maxRetries) {\n retryCountRef.current += 1;\n setRetryCount(retryCountRef.current);\n\n logger.warn(\n 'SpatialIndexWorker',\n `Retrying build (attempt ${retryCountRef.current}/${maxRetries})`\n );\n\n setTimeout(() => {\n setError(null);\n setIsBuilding(false);\n }, retryDelay);\n } else {\n setIsBuilding(false);\n }\n };\n\n return () => {\n workerRef.current?.terminate();\n workerRef.current = null;\n };\n }, [maxRetries, retryDelay, isBuilding]);\n\n // 构建索引\n const buildIndex = useCallback(\n (plots: PlotData[]): Promise<void> => {\n return new Promise((resolve, reject) => {\n if (!workerRef.current) {\n reject(new Error('Worker not initialized'));\n return;\n }\n\n setIsBuilding(true);\n setIsReady(false);\n pendingBuild.current = resolve;\n\n const items: BoundedItem[] = plots.map(plot => ({\n id: plot.id,\n boundaries: (plot.positions || []).flat() as Coordinate[],\n bounds: plot.bounds,\n }));\n\n workerRef.current.postMessage({\n type: 'build',\n items,\n cellSize,\n indexType,\n });\n });\n },\n [cellSize, indexType]\n );\n\n // 查询\n const query = useCallback(\n (bounds: BBox): Promise<BoundedItem[]> => {\n return new Promise((resolve, reject) => {\n if (!workerRef.current) {\n reject(new Error('Worker not initialized'));\n return;\n }\n\n if (!isReady) {\n resolve([]);\n return;\n }\n\n queryIdRef.current += 1;\n pendingQueries.current.set(queryIdRef.current, resolve);\n\n workerRef.current.postMessage({\n type: 'query',\n bbox: bounds,\n });\n });\n },\n [isReady]\n );\n\n // 增量更新\n const updateIndex = useCallback(\n (\n addedItems?: BoundedItem[],\n removedIds?: (string | number)[],\n updatedItems?: BoundedItem[]\n ): Promise<void> => {\n return new Promise((resolve, reject) => {\n if (!workerRef.current) {\n reject(new Error('Worker not initialized'));\n return;\n }\n\n pendingUpdate.current = resolve;\n\n workerRef.current.postMessage({\n type: 'update',\n addedItems,\n removedIds,\n updatedItems,\n });\n });\n },\n []\n );\n\n // 清空\n const clear = useCallback(() => {\n if (workerRef.current) {\n workerRef.current.postMessage({ type: 'clear' });\n setIsReady(false);\n setItemCount(0);\n }\n }, []);\n\n // 终止\n const terminate = useCallback(() => {\n if (workerRef.current) {\n workerRef.current.terminate();\n workerRef.current = null;\n setIsReady(false);\n setIsBuilding(false);\n }\n }, []);\n\n // 重置错误状态\n const resetError = useCallback(() => {\n setError(null);\n retryCountRef.current = 0;\n setRetryCount(0);\n lastErrorRef.current = null;\n }, []);\n\n return {\n isBuilding,\n isReady,\n itemCount,\n buildTime,\n queryTime,\n updateTime,\n indexType: currentIndexType,\n error,\n retryCount,\n buildIndex,\n query,\n updateIndex,\n clear,\n terminate,\n resetError,\n };\n}\n\n/**\n * 几何计算 Worker Hook\n * @description 使用 Web Worker 处理几何计算\n */\nexport interface GeometryWorkerResult {\n /** 是否正在计算 */\n isCalculating: boolean;\n /** 计算面积 */\n calculateAreas: (plots: PlotData[]) => Promise<number[]>;\n /** 计算边界 */\n computeBounds: (plots: PlotData[]) => Promise<[number, number, number, number] | null>;\n /** 简化几何 */\n simplifyGeometry: (plots: PlotData[], tolerance: number) => Promise<PlotData[]>;\n}\n\n/**\n * 几何计算 Worker Hook\n */\nexport function useGeometryWorker(): GeometryWorkerResult {\n const workerRef = useRef<Worker | null>(null);\n const [isCalculating, setIsCalculating] = useState(false);\n\n // 初始化 Worker\n useEffect(() => {\n workerRef.current = new Worker(new URL('../workers/geometry.worker.ts', import.meta.url), {\n type: 'module',\n });\n\n workerRef.current.onmessage = () => {\n setIsCalculating(false);\n };\n\n return () => {\n workerRef.current?.terminate();\n };\n }, []);\n\n const calculateAreas = useCallback((plots: PlotData[]): Promise<number[]> => {\n return new Promise((resolve, reject) => {\n if (!workerRef.current) {\n reject(new Error('Worker not initialized'));\n return;\n }\n\n setIsCalculating(true);\n\n const handler = (event: MessageEvent) => {\n if (event.data.type === 'AREAS_CALCULATED') {\n resolve(event.data.payload.areas);\n workerRef.current?.removeEventListener('message', handler);\n } else if (event.data.type === 'ERROR') {\n reject(new Error(event.data.payload.message));\n workerRef.current?.removeEventListener('message', handler);\n }\n };\n\n workerRef.current.addEventListener('message', handler);\n workerRef.current.postMessage({\n type: 'CALCULATE_AREAS',\n payload: { plots },\n });\n });\n }, []);\n\n const computeBounds = useCallback(\n (plots: PlotData[]): Promise<[number, number, number, number] | null> => {\n return new Promise((resolve, reject) => {\n if (!workerRef.current) {\n reject(new Error('Worker not initialized'));\n return;\n }\n\n setIsCalculating(true);\n\n const handler = (event: MessageEvent) => {\n if (event.data.type === 'BOUNDS_COMPUTED') {\n resolve(event.data.payload.bounds);\n workerRef.current?.removeEventListener('message', handler);\n } else if (event.data.type === 'ERROR') {\n reject(new Error(event.data.payload.message));\n workerRef.current?.removeEventListener('message', handler);\n }\n };\n\n workerRef.current.addEventListener('message', handler);\n workerRef.current.postMessage({\n type: 'COMPUTE_BOUNDS',\n payload: { plots },\n });\n });\n },\n []\n );\n\n const simplifyGeometry = useCallback(\n (plots: PlotData[], tolerance: number): Promise<PlotData[]> => {\n return new Promise((resolve, reject) => {\n if (!workerRef.current) {\n reject(new Error('Worker not initialized'));\n return;\n }\n\n setIsCalculating(true);\n\n const handler = (event: MessageEvent) => {\n if (event.data.type === 'GEOMETRY_SIMPLIFIED') {\n resolve(event.data.payload.simplifiedPlots);\n workerRef.current?.removeEventListener('message', handler);\n } else if (event.data.type === 'ERROR') {\n reject(new Error(event.data.payload.message));\n workerRef.current?.removeEventListener('message', handler);\n }\n };\n\n workerRef.current.addEventListener('message', handler);\n workerRef.current.postMessage({\n type: 'SIMPLIFY_GEOMETRY',\n payload: { plots, tolerance },\n });\n });\n },\n []\n );\n\n return {\n isCalculating,\n calculateAreas,\n computeBounds,\n simplifyGeometry,\n };\n}\n\nexport default useSpatialIndexWorker;\n","/**\n * @fileoverview Plot 状态机类型定义\n * @description 定义 Plot 编辑模式的状态和动作类型\n */\n\nimport type L from 'leaflet';\nimport type {\n Coordinate,\n PlotEditResult,\n PlotClipResult,\n PlotMoveResult,\n PlotCreateResult,\n PlotDeleteResult,\n} from '../../types';\nimport type { PlotLayer as PlotLayerType } from '../../components/PlotLayer/leaflet-types';\n\n/** Plot 模式类型 */\nexport type PlotMode = 'idle' | 'create' | 'redraw' | 'clip' | 'move';\n\n/** Plot 状态接口 */\nexport interface PlotState {\n /** 当前模式 */\n mode: PlotMode;\n /** 选中的地块 ID */\n selectedId: string | number | null;\n /** 编辑中的图层 */\n editingLayer: PlotLayerType | L.GeoJSON | null;\n /** 临时坐标(绘制/编辑中) */\n tempCoordinates: Coordinate[] | Coordinate[][] | null;\n /** 剪切碎片图层 */\n clipFragments: L.Polygon[];\n /** 选中的剪切碎片 ID */\n selectedFragmentId: string | null;\n /** 是否预览模式(新建未保存) */\n isPreview: boolean;\n /** 编辑面积标签 */\n editAreaLabel: string | null;\n}\n\n/** Plot 动作类型 */\nexport type PlotAction =\n // 模式切换\n | { type: 'SET_MODE'; payload: PlotMode }\n // 选中\n | { type: 'SELECT_PLOT'; payload: string | number }\n | { type: 'DESELECT_PLOT' }\n // 编辑操作\n | { type: 'START_EDIT'; payload: { mode: PlotMode; layer: PlotLayerType | L.GeoJSON } }\n | { type: 'UPDATE_COORDINATES'; payload: Coordinate[] | Coordinate[][] }\n | { type: 'CLEAR_TEMP_COORDINATES' }\n // 保存/取消\n | {\n type: 'SAVE_EDIT';\n payload: PlotEditResult | PlotClipResult | PlotMoveResult | PlotCreateResult;\n }\n | { type: 'CANCEL_EDIT' }\n // 剪切相关\n | { type: 'ADD_CLIP_FRAGMENT'; payload: { layer: L.Polygon; id: string } }\n | { type: 'SELECT_FRAGMENT'; payload: string }\n | { type: 'CLEAR_FRAGMENTS' }\n // 标签\n | { type: 'UPDATE_AREA_LABEL'; payload: string }\n | { type: 'CLEAR_LABEL' }\n // 清理\n | { type: 'RESET' }\n | { type: 'DELETE_PLOT'; payload: PlotDeleteResult };\n\n/** 默认状态 */\nexport const DEFAULT_PLOT_STATE: PlotState = {\n mode: 'idle',\n selectedId: null,\n editingLayer: null,\n tempCoordinates: null,\n clipFragments: [],\n selectedFragmentId: null,\n isPreview: false,\n editAreaLabel: null,\n};\n","/**\n * @fileoverview Plot 纯状态机实现\n * @description 无副作用的纯状态机,便于测试和调试\n */\n\nimport type { PlotState, PlotAction } from './types';\nimport { DEFAULT_PLOT_STATE } from './types';\n\n/**\n * Plot 状态机\n */\nexport class PlotStateMachine {\n private state: PlotState;\n\n constructor(initialState: PlotState = DEFAULT_PLOT_STATE) {\n this.state = initialState;\n }\n\n /** 获取当前状态 */\n getState(): PlotState {\n return this.state;\n }\n\n /** 状态转换 */\n reduce(state: PlotState, action: PlotAction): PlotState {\n switch (action.type) {\n case 'SET_MODE':\n return { ...state, mode: action.payload };\n\n case 'SELECT_PLOT':\n return { ...state, selectedId: action.payload };\n\n case 'DESELECT_PLOT':\n return { ...state, selectedId: null };\n\n case 'START_EDIT':\n return {\n ...state,\n mode: action.payload.mode,\n editingLayer: action.payload.layer,\n isPreview: false,\n tempCoordinates: null,\n };\n\n case 'UPDATE_COORDINATES':\n return { ...state, tempCoordinates: action.payload };\n\n case 'CLEAR_TEMP_COORDINATES':\n return { ...state, tempCoordinates: null };\n\n case 'SAVE_EDIT':\n return {\n ...state,\n mode: 'idle',\n editingLayer: null,\n tempCoordinates: null,\n isPreview: false,\n clipFragments: [],\n selectedFragmentId: null,\n };\n\n case 'CANCEL_EDIT':\n return {\n ...state,\n mode: 'idle',\n editingLayer: null,\n tempCoordinates: null,\n isPreview: false,\n clipFragments: [],\n selectedFragmentId: null,\n };\n\n case 'ADD_CLIP_FRAGMENT':\n return {\n ...state,\n clipFragments: [...state.clipFragments, action.payload.layer],\n };\n\n case 'SELECT_FRAGMENT':\n return { ...state, selectedFragmentId: action.payload };\n\n case 'CLEAR_FRAGMENTS':\n return {\n ...state,\n clipFragments: [],\n selectedFragmentId: null,\n };\n\n case 'UPDATE_AREA_LABEL':\n return { ...state, editAreaLabel: action.payload };\n\n case 'CLEAR_LABEL':\n return { ...state, editAreaLabel: null };\n\n case 'RESET':\n return DEFAULT_PLOT_STATE;\n\n case 'DELETE_PLOT':\n return {\n ...state,\n mode: 'idle',\n selectedId: null,\n editingLayer: null,\n };\n\n default:\n return state;\n }\n }\n\n /** 处理动作并更新状态 */\n dispatch(action: PlotAction): PlotState {\n this.state = this.reduce(this.state, action);\n return this.state;\n }\n}\n\n/** 创建状态机 reducer 函数(用于 useReducer) */\nexport function createPlotReducer(initialState: PlotState = DEFAULT_PLOT_STATE) {\n const machine = new PlotStateMachine(initialState);\n return (state: PlotState, action: PlotAction): PlotState => {\n return machine.reduce(state, action);\n };\n}\n\nexport default PlotStateMachine;\n","/**\n * @fileoverview Plot 绘制事件处理 Hook\n * @description 处理 Leaflet-Geoman 绘制事件\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- Geoman API 需要 */\n\nimport { useCallback, useRef } from 'react';\nimport type L from 'leaflet';\nimport type { PlotAction } from '../types';\nimport type { PlotCreateResult, Coordinate } from '../../../types';\n\n/** 绘制回调接口 */\nexport interface DrawCallbacks {\n onCreate?: (result: PlotCreateResult) => void;\n}\n\n/** 绘制事件接口 */\nexport interface DrawVertexEvent {\n layer: L.Polygon;\n shape: string;\n workingLayer: L.Polygon;\n}\n\nexport interface DrawCreateEvent {\n layer: L.Polygon;\n shape: string;\n}\n\n/**\n * Plot 绘制事件处理 Hook\n */\nexport function usePlotDraw(dispatch: React.Dispatch<PlotAction>, callbacks: DrawCallbacks) {\n const callbacksRef = useRef(callbacks);\n callbacksRef.current = callbacks;\n\n /** 处理绘制顶点事件 */\n const handleDrawVertex = useCallback(\n (e: DrawVertexEvent) => {\n const latlngs = e.layer.getLatLngs();\n const coords = (Array.isArray(latlngs) && Array.isArray(latlngs[0])\n ? latlngs[0]\n : latlngs) as unknown as Coordinate[];\n dispatch({ type: 'UPDATE_COORDINATES', payload: coords });\n },\n [dispatch]\n );\n\n /** 处理绘制创建事件 */\n const handleDrawCreate = useCallback(\n (e: DrawCreateEvent) => {\n const latlngs = e.layer.getLatLngs();\n const coords = latlngs as unknown as Coordinate[][];\n dispatch({ type: 'UPDATE_COORDINATES', payload: coords });\n dispatch({ type: 'SET_MODE', payload: 'create' });\n\n // 通知外部回调\n callbacksRef.current.onCreate?.({\n mode: 'create',\n plotId: null as any,\n coordinates: coords,\n });\n },\n [dispatch]\n );\n\n return { handleDrawVertex, handleDrawCreate };\n}\n\nexport default usePlotDraw;\n","/**\n * @fileoverview Plot 剪切事件处理 Hook\n * @description 处理 Leaflet-Geoman 剪切事件\n */\n\nimport { useCallback, useRef } from 'react';\nimport type L from 'leaflet';\nimport type { PlotAction } from '../types';\nimport type { Coordinate } from '../../../types';\n\n/** 剪切回调接口 */\nexport interface ClipCallbacks {\n onClip?: (result: { originalId: string | number; fragments: Coordinate[][][] }) => void;\n selectedPlotId: string | number | null;\n}\n\n/** 剪切事件接口 */\nexport interface CutEvent {\n layer: L.Polygon;\n originalLayer: L.Polygon;\n layerGroup: L.LayerGroup;\n}\n\n/** 生成碎片 ID */\nfunction generateFragmentId(): string {\n return `fragment_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Plot 剪切事件处理 Hook\n */\nexport function usePlotClip(dispatch: React.Dispatch<PlotAction>, callbacks: ClipCallbacks) {\n const callbacksRef = useRef(callbacks);\n callbacksRef.current = callbacks;\n\n /** 处理剪切事件 */\n const handleCut = useCallback(\n (e: CutEvent) => {\n const layers = e.layerGroup.getLayers() as unknown as L.Polygon[];\n\n // 添加碎片\n layers.forEach((layer: L.Polygon) => {\n const fragmentId = generateFragmentId();\n layer.on('click', () => {\n dispatch({ type: 'SELECT_FRAGMENT', payload: fragmentId });\n });\n dispatch({ type: 'ADD_CLIP_FRAGMENT', payload: { layer, id: fragmentId } });\n });\n\n // 更新主图层坐标\n const newCoords = layers[0]?.getLatLngs();\n if (newCoords) {\n dispatch({ type: 'UPDATE_COORDINATES', payload: newCoords as unknown as Coordinate[][] });\n }\n },\n [dispatch]\n );\n\n /** 处理保存剪切 */\n const handleSaveClip = useCallback(() => {\n const state = callbacksRef.current;\n if (!state.selectedPlotId) return;\n\n callbacksRef.current.onClip?.({\n originalId: state.selectedPlotId,\n fragments: [],\n });\n\n dispatch({ type: 'CLEAR_FRAGMENTS' });\n }, [dispatch]);\n\n return { handleCut, handleSaveClip };\n}\n\nexport default usePlotClip;\n","/**\n * 面积计算工具\n * @description 提供多边形面积计算和单位转换功能\n */\n\nimport type { AreaUnit, AreaUnitConfig, Coordinate } from '../types';\n\n/**\n * 面积单位配置表\n */\nexport const AREA_UNIT_CONFIGS: Record<AreaUnit, AreaUnitConfig> = {\n square_meters: {\n unit: 'square_meters',\n label: '平方米',\n factor: 1,\n },\n hectares: {\n unit: 'hectares',\n label: '公顷',\n factor: 10000, // 1公顷 = 10000平方米\n },\n mu: {\n unit: 'mu',\n label: '亩',\n factor: 666.6666666666666, // 1亩 = 666.67平方米(精确值:2000/3)\n },\n acres: {\n unit: 'acres',\n label: '英亩',\n factor: 4046.8564224, // 1英亩 ≈ 4046.86平方米\n },\n};\n\n/**\n * 计算多边形面积(使用 Shoelace 公式)\n * @param coordinates 多边形顶点坐标数组 [lat, lng]\n * @returns 面积(平方米)\n */\nexport function calculatePolygonArea(coordinates: Coordinate[]): number {\n if (!coordinates || coordinates.length < 3) {\n return 0;\n }\n\n const n = coordinates.length;\n let area = 0;\n\n // 使用 Shoelace 公式计算球面面积\n // 需要将经纬度转换为平面坐标(使用简单的投影近似)\n // 对于小范围区域,可以使用简化的平面近似\n\n // 获取中心点纬度,用于计算经度到米的转换系数\n let sumLat = 0;\n for (let i = 0; i < n; i++) {\n sumLat += coordinates[i][0];\n }\n const avgLat = sumLat / n;\n const latRad = (avgLat * Math.PI) / 180;\n\n // 经纬度到米的转换系数\n const latToMeters = 111320; // 纬度1度约等于111.32公里\n const lngToMeters = 111320 * Math.cos(latRad); // 经度1度在当前纬度对应的米数\n\n // Shoelace 公式\n for (let i = 0; i < n; i++) {\n const j = (i + 1) % n;\n const lat1 = coordinates[i][0] * latToMeters;\n const lng1 = coordinates[i][1] * lngToMeters;\n const lat2 = coordinates[j][0] * latToMeters;\n const lng2 = coordinates[j][1] * lngToMeters;\n\n area += lng1 * lat2 - lng2 * lat1;\n }\n\n return Math.round(Math.abs(area / 2) * 100) / 100;\n}\n\n/**\n * 将面积从平方米转换为指定单位\n * @param areaSquareMeters 面积(平方米)\n * @param unit 目标单位\n * @returns 转换后的面积值\n */\nexport function convertArea(areaSquareMeters: number, unit: AreaUnit = 'mu'): number {\n const config = AREA_UNIT_CONFIGS[unit];\n return areaSquareMeters / config.factor;\n}\n\n/**\n * 格式化面积显示\n * @param areaSquareMeters 面积(平方米)\n * @param unit 目标单位\n * @param precision 小数位数\n * @returns 格式化后的面积字符串\n */\nexport function formatArea(areaSquareMeters: number, unit: AreaUnit = 'mu', precision = 2): string {\n const convertedArea = convertArea(areaSquareMeters, unit);\n const config = AREA_UNIT_CONFIGS[unit];\n return `${convertedArea.toFixed(precision)} ${config.label}`;\n}\n\n/**\n * 获取单位配置\n * @param unit 单位标识\n * @returns 单位配置\n */\nexport function getAreaUnitConfig(unit: AreaUnit): AreaUnitConfig {\n return AREA_UNIT_CONFIGS[unit];\n}\n\n/**\n * 数据边界计算结果\n */\nexport interface DataBoundsResult {\n /** 数据中心点 [lat, lng] */\n center: [number, number];\n /** Leaflet bounds 格式 [[south, west], [north, east]] */\n bounds: [[number, number], [number, number]];\n /** 西南角 [lat, lng] */\n southWest: [number, number];\n /** 东北角 [lat, lng] */\n northEast: [number, number];\n}\n\n/**\n * 根据数据源计算边界范围和中心点\n * @description 遍历所有地块坐标,计算全局最小/最大经纬度,返回中心点和边界\n * @param dataSource 地块数据数组(原始数据或标准化后的 PlotData 均可)\n * @param positionsField positions 字段名,默认 'positions'\n * @returns 边界计算结果,无有效数据时返回 null\n */\nexport function computeDataBounds(\n dataSource: Record<string, unknown>[],\n positionsField = 'positions'\n): DataBoundsResult | null {\n if (!dataSource || dataSource.length === 0) return null;\n\n let minLat = Infinity,\n minLng = Infinity;\n let maxLat = -Infinity,\n maxLng = -Infinity;\n let found = false;\n\n for (const item of dataSource) {\n const positions = item[positionsField];\n if (!positions || !Array.isArray(positions)) continue;\n\n // 将 positions 展平为坐标点数组\n // 支持 [[lat,lng],...] 或 [[[lat,lng],...], [孔洞], ...] 格式\n const flatten = (coords: unknown[]): void => {\n for (const c of coords) {\n if (\n Array.isArray(c) &&\n c.length >= 2 &&\n typeof c[0] === 'number' &&\n typeof c[1] === 'number'\n ) {\n // 二维坐标点 [lat, lng]\n if (c[0] < minLat) minLat = c[0];\n if (c[0] > maxLat) maxLat = c[0];\n if (c[1] < minLng) minLng = c[1];\n if (c[1] > maxLng) maxLng = c[1];\n found = true;\n } else if (Array.isArray(c)) {\n // 三维数组,递归展开\n flatten(c);\n }\n }\n };\n\n flatten(positions);\n }\n\n if (!found) return null;\n\n const southWest: [number, number] = [minLat, minLng];\n const northEast: [number, number] = [maxLat, maxLng];\n const bounds: [[number, number], [number, number]] = [southWest, northEast];\n const center: [number, number] = [(minLat + maxLat) / 2, (minLng + maxLng) / 2];\n\n return { center, bounds, southWest, northEast };\n}\n","/**\n * @fileoverview Plot 移动事件处理 Hook\n * @description 处理 Leaflet-Geoman 拖拽移动事件\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- Geoman API 需要 */\n\nimport { useCallback, useRef } from 'react';\nimport L from 'leaflet';\nimport type { PlotAction } from '../types';\nimport type { PlotMoveResult, Coordinate, AreaUnit } from '../../../types';\nimport { calculatePolygonArea, formatArea } from '../../../utils/area';\n\n/** 移动回调接口 */\nexport interface MoveCallbacks {\n onMove?: (result: PlotMoveResult) => void;\n selectedPlotId: string | number | null;\n areaUnit: AreaUnit;\n}\n\n/** 移动事件接口 */\nexport interface DragEvent {\n layer: L.Polygon;\n}\n\nexport interface DragEndEvent {\n layer: L.Polygon;\n}\n\n/**\n * Plot 移动事件处理 Hook\n * @param dispatch - 状态机 dispatch 函数\n * @param callbacks - 回调配置\n * @returns 移动事件处理函数\n */\nexport function usePlotMove(dispatch: React.Dispatch<PlotAction>, callbacks: MoveCallbacks) {\n const callbacksRef = useRef(callbacks);\n callbacksRef.current = callbacks;\n\n // 更新面积标签\n const updateAreaLabel = useCallback(\n (coords: Coordinate[], map: L.Map, existingMarker?: L.Marker | null) => {\n if (coords.length < 3) return null;\n\n const areaSquareMeters = calculatePolygonArea(coords);\n const text = formatArea(areaSquareMeters, callbacksRef.current.areaUnit);\n\n // 计算中心点\n let sumLat = 0,\n sumLng = 0;\n for (const coord of coords) {\n sumLat += coord[0];\n sumLng += coord[1];\n }\n const centroid: L.LatLngExpression = [sumLat / coords.length, sumLng / coords.length];\n\n const span = document.createElement('span');\n span.className = 'plot-area-label-text';\n span.textContent = text;\n\n const areaIcon = L.divIcon({\n className: 'plot-area-label',\n html: span.outerHTML,\n iconSize: [0, 0],\n iconAnchor: [0, 0],\n });\n\n if (existingMarker) {\n existingMarker.setLatLng(centroid);\n existingMarker.setIcon(areaIcon);\n return existingMarker;\n }\n\n return L.marker(centroid, { icon: areaIcon, interactive: false }).addTo(map);\n },\n []\n );\n\n /** 处理拖拽事件(实时更新) */\n const handleDrag = useCallback(\n (e: DragEvent, map: L.Map, areaMarkerRef: React.MutableRefObject<L.Marker | null>) => {\n const layer = e.layer;\n if (!layer.getLatLngs) return;\n\n const latlngs = (layer.getLatLngs() as L.LatLng[][])[0];\n const coords: Coordinate[] = latlngs.map(ll => [ll.lat, ll.lng]);\n\n dispatch({ type: 'UPDATE_COORDINATES', payload: coords });\n\n // 更新面积标签\n areaMarkerRef.current = updateAreaLabel(coords, map, areaMarkerRef.current);\n },\n [dispatch, updateAreaLabel]\n );\n\n /** 处理拖拽结束事件 */\n const handleDragEnd = useCallback(\n (e: DragEndEvent) => {\n const layer = e.layer;\n if (!layer.getLatLngs) return;\n\n const latlngs = (layer.getLatLngs() as L.LatLng[][])[0];\n const coords: Coordinate[] = latlngs.map(ll => [ll.lat, ll.lng]);\n\n dispatch({ type: 'UPDATE_COORDINATES', payload: coords });\n\n // 计算面积并准备保存\n const areaSquareMeters = calculatePolygonArea(coords);\n\n callbacksRef.current.onMove?.({\n mode: 'move',\n plotId: callbacksRef.current.selectedPlotId!,\n coordinates: coords,\n area: areaSquareMeters,\n areaUnit: callbacksRef.current.areaUnit,\n });\n },\n [dispatch]\n );\n\n /** 启用移动模式 */\n const enableMoveMode = useCallback(\n (layer: L.Polygon, map: L.Map, areaMarkerRef: React.MutableRefObject<L.Marker | null>) => {\n const pmLayer = layer as any;\n\n // 启用拖拽\n if (pmLayer.pm && pmLayer.pm.enableLayerDrag) {\n pmLayer.pm.enableLayerDrag();\n } else if (pmLayer.toggleEdit) {\n pmLayer.toggleEdit({ allowSelfIntersection: false, draggable: true });\n }\n\n // 绑定事件\n layer.on('pm:drag', (e: any) => handleDrag(e, map, areaMarkerRef));\n layer.on('pm:dragend', handleDragEnd as any);\n\n // 初始化面积标签\n const initLatlngs = (layer.getLatLngs() as L.LatLng[][])[0];\n const initCoords: Coordinate[] = initLatlngs.map(ll => [ll.lat, ll.lng]);\n areaMarkerRef.current = updateAreaLabel(initCoords, map, areaMarkerRef.current);\n },\n [handleDrag, handleDragEnd, updateAreaLabel]\n );\n\n /** 禁用移动模式 */\n const disableMoveMode = useCallback(\n (layer: L.Polygon, areaMarkerRef: React.MutableRefObject<L.Marker | null>, map: L.Map) => {\n const pmLayer = layer as any;\n\n // 禁用拖拽\n if (pmLayer.pm && pmLayer.pm.disableLayerDrag) {\n pmLayer.pm.disableLayerDrag();\n } else if (pmLayer.toggleEdit) {\n pmLayer.toggleEdit({ allowSelfIntersection: false, draggable: false });\n }\n\n // 解绑事件\n layer.off('pm:drag');\n layer.off('pm:dragend');\n\n // 移除面积标签\n if (areaMarkerRef.current) {\n map.removeLayer(areaMarkerRef.current);\n areaMarkerRef.current = null;\n }\n },\n []\n );\n\n return {\n handleDrag,\n handleDragEnd,\n enableMoveMode,\n disableMoveMode,\n updateAreaLabel,\n };\n}\n\nexport default usePlotMove;\n","/**\n * @fileoverview Plot 重绘事件处理 Hook\n * @description 处理 Leaflet-Geoman 编辑重绘事件\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- Geoman API 需要 */\n\nimport { useCallback, useRef } from 'react';\nimport L from 'leaflet';\nimport type { PlotAction } from '../types';\nimport type { PlotEditResult, Coordinate, AreaUnit } from '../../../types';\nimport { calculatePolygonArea, formatArea } from '../../../utils/area';\n\n/** 重绘回调接口 */\nexport interface RedrawCallbacks {\n onRedraw?: (result: PlotEditResult) => void;\n selectedPlotId: string | number | null;\n areaUnit: AreaUnit;\n}\n\n/** 编辑事件接口 */\nexport interface EditEvent {\n layer: L.Polygon;\n}\n\n/**\n * Plot 重绘事件处理 Hook\n * @param dispatch - 状态机 dispatch 函数\n * @param callbacks - 回调配置\n * @returns 重绘事件处理函数\n */\nexport function usePlotRedraw(dispatch: React.Dispatch<PlotAction>, callbacks: RedrawCallbacks) {\n const callbacksRef = useRef(callbacks);\n callbacksRef.current = callbacks;\n\n // 更新面积标签\n const updateAreaLabel = useCallback(\n (coords: Coordinate[], map: L.Map, existingMarker?: L.Marker | null) => {\n if (coords.length < 3) return null;\n\n const areaSquareMeters = calculatePolygonArea(coords);\n const text = formatArea(areaSquareMeters, callbacksRef.current.areaUnit);\n\n // 计算中心点\n let sumLat = 0,\n sumLng = 0;\n for (const coord of coords) {\n sumLat += coord[0];\n sumLng += coord[1];\n }\n const centroid: L.LatLngExpression = [sumLat / coords.length, sumLng / coords.length];\n\n const span = document.createElement('span');\n span.className = 'plot-area-label-text';\n span.textContent = text;\n\n const areaIcon = L.divIcon({\n className: 'plot-area-label',\n html: span.outerHTML,\n iconSize: [0, 0],\n iconAnchor: [0, 0],\n });\n\n if (existingMarker) {\n existingMarker.setLatLng(centroid);\n existingMarker.setIcon(areaIcon);\n return existingMarker;\n }\n\n return L.marker(centroid, { icon: areaIcon, interactive: false }).addTo(map);\n },\n []\n );\n\n /** 处理编辑事件 */\n const handleEdit = useCallback(\n (e: EditEvent, map: L.Map, areaMarkerRef: React.MutableRefObject<L.Marker | null>) => {\n const layer = e.layer;\n if (!layer.getLatLngs) return;\n\n const latlngs = (layer.getLatLngs() as L.LatLng[][])[0];\n const coords: Coordinate[] = latlngs.map(ll => [ll.lat, ll.lng]);\n\n dispatch({ type: 'UPDATE_COORDINATES', payload: coords });\n\n // 更新面积标签\n areaMarkerRef.current = updateAreaLabel(coords, map, areaMarkerRef.current);\n },\n [dispatch, updateAreaLabel]\n );\n\n /** 处理保存重绘 */\n const handleSaveRedraw = useCallback(\n (layer: L.Polygon) => {\n if (!layer.getLatLngs) return;\n\n const latlngs = (layer.getLatLngs() as L.LatLng[][])[0];\n const coords: Coordinate[] = latlngs.map(ll => [ll.lat, ll.lng]);\n\n const areaSquareMeters = calculatePolygonArea(coords);\n\n callbacksRef.current.onRedraw?.({\n mode: 'redraw',\n plotId: callbacksRef.current.selectedPlotId!,\n coordinates: coords,\n area: areaSquareMeters,\n areaUnit: callbacksRef.current.areaUnit,\n });\n\n dispatch({ type: 'SAVE_EDIT', payload: {} as any });\n },\n [dispatch]\n );\n\n /** 启用重绘模式 */\n const enableRedrawMode = useCallback(\n (layer: L.Polygon, map: L.Map, areaMarkerRef: React.MutableRefObject<L.Marker | null>) => {\n const pmLayer = layer as any;\n\n // 启用编辑\n if (pmLayer.pm && pmLayer.pm.enable) {\n pmLayer.pm.enable({ allowSelfIntersection: false });\n } else if (pmLayer.toggleEdit) {\n pmLayer.toggleEdit({ allowSelfIntersection: false });\n }\n\n // 绑定编辑事件\n layer.on('pm:edit', (e: any) => handleEdit(e, map, areaMarkerRef));\n\n // 初始化面积标签\n const initLatlngs = (layer.getLatLngs() as L.LatLng[][])[0];\n const initCoords: Coordinate[] = initLatlngs.map(ll => [ll.lat, ll.lng]);\n areaMarkerRef.current = updateAreaLabel(initCoords, map, areaMarkerRef.current);\n\n dispatch({\n type: 'START_EDIT',\n payload: { mode: 'redraw', layer: layer as unknown as L.GeoJSON },\n });\n },\n [handleEdit, updateAreaLabel, dispatch]\n );\n\n /** 禁用重绘模式 */\n const disableRedrawMode = useCallback(\n (layer: L.Polygon, areaMarkerRef: React.MutableRefObject<L.Marker | null>, map: L.Map) => {\n const pmLayer = layer as any;\n\n // 禁用编辑\n if (pmLayer.pm && pmLayer.pm.disable) {\n pmLayer.pm.disable();\n } else if (pmLayer.toggleEdit) {\n pmLayer.toggleEdit();\n }\n\n // 解绑事件\n layer.off('pm:edit');\n\n // 移除面积标签\n if (areaMarkerRef.current) {\n map.removeLayer(areaMarkerRef.current);\n areaMarkerRef.current = null;\n }\n },\n []\n );\n\n return {\n handleEdit,\n handleSaveRedraw,\n enableRedrawMode,\n disableRedrawMode,\n updateAreaLabel,\n };\n}\n\nexport default usePlotRedraw;\n","/**\n * @fileoverview Plot 状态机主 Hook\n * @description 整合所有子 Hook,提供完整的编辑模式状态管理\n * @since 1.4.0\n */\n\n/* eslint-disable react-hooks/exhaustive-deps -- ref 回调稳定 */\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- 状态机需要 */\n\nimport { useEffect, useReducer, useRef, useMemo, useCallback } from 'react';\nimport type L from 'leaflet';\nimport { createPlotReducer } from './plotStateMachine';\nimport type { PlotState, PlotAction, PlotMode } from './types';\nimport { DEFAULT_PLOT_STATE } from './types';\nimport { usePlotDraw } from './hooks/usePlotDraw';\nimport { usePlotClip } from './hooks/usePlotClip';\nimport { usePlotMove } from './hooks/usePlotMove';\nimport { usePlotRedraw } from './hooks/usePlotRedraw';\nimport type {\n PlotEditMode,\n PlotEditResult,\n PlotClipResult,\n PlotMoveResult,\n PlotCreateResult,\n PlotDeleteResult,\n Coordinate,\n AreaUnit,\n PlotData,\n} from '../../types';\nimport { calculatePolygonArea } from '../../utils/area';\n\n/** 状态机配置选项 */\nexport interface PlotStateMachineOptions {\n /** Leaflet 地图实例 */\n map: L.Map | null;\n /** 当前选中的地块 ID */\n selectedPlotId: string | number | null;\n /** 启用的编辑按钮 */\n enabledButtons: string[];\n /** 面积单位 */\n areaUnit: AreaUnit;\n /** 重绘回调 */\n onRedraw?: (result: PlotEditResult) => void;\n /** 剪切回调 */\n onClip?: (result: PlotClipResult) => void;\n /** 移动回调 */\n onMove?: (result: PlotMoveResult) => void;\n /** 新建回调 */\n onCreate?: (result: PlotCreateResult) => void;\n /** 保存回调 */\n onSave?: (result: PlotEditResult) => void;\n /** 删除回调 */\n onDelete?: (result: PlotDeleteResult) => void;\n /** 编辑属性回调 */\n onEdit?: (result: { plotId: string | number; plot: PlotData }) => void;\n}\n\n/** 状态机返回值 */\nexport interface PlotStateMachineResult {\n /** 当前状态 */\n state: PlotState;\n /** dispatch 函数 */\n dispatch: React.Dispatch<PlotAction>;\n /** 当前编辑模式 */\n editMode: PlotEditMode;\n /** 是否预览模式 */\n isPreviewMode: boolean;\n /** 剪切提示信息 */\n clipHintMessage: string;\n /** 保存 */\n handleSave: () => void;\n /** 取消 */\n handleCancel: () => void;\n /** 重绘 */\n handleRedraw: () => void;\n /** 剪切 */\n handleClip: () => void;\n /** 移动 */\n handleMove: () => void;\n /** 新建 */\n handleCreate: () => void;\n /** 删除 */\n handleDelete: () => void;\n /** 编辑属性 */\n handleEdit: () => void;\n /** 进入编辑模式 */\n startEdit: (mode: PlotEditMode, layer: L.GeoJSON) => void;\n /** 清除临时图层 */\n clearTempLayer: () => void;\n /** 面积标签 Marker ref */\n areaMarkerRef: React.MutableRefObject<L.Marker | null>;\n}\n\n/**\n * Plot 状态机主 Hook\n * @param options 配置选项\n * @returns 状态和处理函数\n *\n * @example\n * ```tsx\n * const {\n * editMode,\n * handleSave,\n * handleCancel,\n * handleRedraw,\n * handleClip,\n * handleMove,\n * handleCreate,\n * handleDelete,\n * } = usePlotStateMachine({\n * map,\n * selectedPlotId,\n * enabledButtons: ['redraw', 'clip', 'move', 'create', 'delete'],\n * areaUnit: 'mu',\n * onRedraw: (result) => console.log('重绘:', result),\n * onClip: (result) => console.log('剪切:', result),\n * onMove: (result) => console.log('移动:', result),\n * onCreate: (result) => console.log('新建:', result),\n * });\n * ```\n */\nexport function usePlotStateMachine(options: PlotStateMachineOptions): PlotStateMachineResult {\n const { map, selectedPlotId, enabledButtons, areaUnit } = options;\n\n // 创建 reducer\n const reducer = useMemo(() => createPlotReducer(DEFAULT_PLOT_STATE), []);\n\n // 初始化状态\n const [state, dispatch] = useReducer(reducer, DEFAULT_PLOT_STATE);\n\n // Refs\n const areaMarkerRef = useRef<L.Marker | null>(null);\n\n // 回调 refs\n const callbacksRef = useRef({\n onRedraw: options.onRedraw,\n onClip: options.onClip,\n onMove: options.onMove,\n onCreate: options.onCreate,\n onSave: options.onSave,\n onDelete: options.onDelete,\n onEdit: options.onEdit,\n selectedPlotId: options.selectedPlotId,\n areaUnit: options.areaUnit,\n });\n\n // 更新 callbacksRef\n useEffect(() => {\n callbacksRef.current = {\n onRedraw: options.onRedraw,\n onClip: options.onClip,\n onMove: options.onMove,\n onCreate: options.onCreate,\n onSave: options.onSave,\n onDelete: options.onDelete,\n onEdit: options.onEdit,\n selectedPlotId: options.selectedPlotId,\n areaUnit: options.areaUnit,\n };\n }, [\n options.onRedraw,\n options.onClip,\n options.onMove,\n options.onCreate,\n options.onSave,\n options.onDelete,\n options.onEdit,\n options.selectedPlotId,\n options.areaUnit,\n ]);\n\n // 子 hooks\n const { handleDrawVertex, handleDrawCreate } = usePlotDraw(dispatch, {\n onCreate: options.onCreate,\n });\n\n const { handleCut } = usePlotClip(dispatch, {\n onClip: options.onClip as unknown as (result: {\n originalId: string | number;\n fragments: unknown[][];\n }) => void,\n selectedPlotId: options.selectedPlotId,\n });\n\n // usePlotMove 和 usePlotRedraw 提供的方法暂未在主 Hook 中使用\n // 保留解构以备后续扩展\n const {\n handleDrag: _handleDrag,\n handleDragEnd: _handleDragEnd,\n enableMoveMode: _enableMoveMode,\n disableMoveMode: _disableMoveMode,\n } = usePlotMove(dispatch, {\n onMove: options.onMove,\n selectedPlotId: options.selectedPlotId,\n areaUnit: options.areaUnit,\n });\n\n const {\n handleEdit: _handleRedrawEdit,\n handleSaveRedraw: _handleSaveRedraw,\n enableRedrawMode: _enableRedrawMode,\n disableRedrawMode: _disableRedrawMode,\n } = usePlotRedraw(dispatch, {\n onRedraw: options.onRedraw,\n selectedPlotId: options.selectedPlotId,\n areaUnit: options.areaUnit,\n });\n\n // 地图事件监听\n useEffect(() => {\n if (!map) return;\n\n const pm = (map as any)._pm;\n if (!pm) return;\n\n map.on('pm:drawvertex', handleDrawVertex as any);\n map.on('pm:create', handleDrawCreate as any);\n map.on('pm:cut', handleCut as any);\n\n return () => {\n map.off('pm:drawvertex', handleDrawVertex as any);\n map.off('pm:create', handleDrawCreate as any);\n map.off('pm:cut', handleCut as any);\n };\n }, [map, handleDrawVertex, handleDrawCreate, handleCut]);\n\n // ========== 操作处理函数 ==========\n\n const handleSave = useCallback(() => {\n const coords = state.tempCoordinates;\n\n if (!coords) {\n // 尝试从编辑图层获取坐标\n if (state.editingLayer) {\n const layer = state.editingLayer as unknown as L.Polygon;\n if (layer.getLatLngs) {\n const latlngs = (layer.getLatLngs() as L.LatLng[][])[0];\n const newCoords: Coordinate[] = latlngs.map(ll => [ll.lat, ll.lng]);\n if (newCoords.length >= 3) {\n const area = calculatePolygonArea(newCoords);\n const result: PlotEditResult = {\n mode: state.mode as PlotEditMode,\n plotId: state.selectedId!,\n coordinates: newCoords,\n area,\n areaUnit: callbacksRef.current.areaUnit,\n };\n callbacksRef.current.onSave?.(result);\n dispatch({ type: 'SAVE_EDIT', payload: result });\n return;\n }\n }\n }\n return;\n }\n\n const flatCoords = Array.isArray(coords[0])\n ? (coords as Coordinate[][])[0]\n : (coords as Coordinate[]);\n\n if (flatCoords.length < 3) return;\n\n const area = calculatePolygonArea(flatCoords);\n\n const result: PlotEditResult = {\n mode: state.mode as PlotEditMode,\n plotId: state.selectedId!,\n coordinates: flatCoords,\n area,\n areaUnit: callbacksRef.current.areaUnit,\n };\n\n // 根据模式调用对应回调\n switch (state.mode) {\n case 'redraw':\n callbacksRef.current.onRedraw?.(result);\n break;\n case 'clip':\n callbacksRef.current.onClip?.(result as PlotClipResult);\n break;\n case 'move':\n callbacksRef.current.onMove?.(result as PlotMoveResult);\n break;\n case 'create':\n callbacksRef.current.onCreate?.(result as PlotCreateResult);\n break;\n }\n\n callbacksRef.current.onSave?.(result);\n dispatch({ type: 'SAVE_EDIT', payload: result });\n }, [state.mode, state.selectedId, state.tempCoordinates, state.editingLayer, areaUnit]);\n\n const handleCancel = useCallback(() => {\n // 清理面积标签\n if (areaMarkerRef.current && map) {\n map.removeLayer(areaMarkerRef.current);\n areaMarkerRef.current = null;\n }\n\n dispatch({ type: 'CANCEL_EDIT' });\n }, [map]);\n\n const handleRedraw = useCallback(() => {\n if (!enabledButtons.includes('redraw')) return;\n if (!selectedPlotId) return;\n dispatch({ type: 'SET_MODE', payload: 'redraw' });\n }, [selectedPlotId, enabledButtons]);\n\n const handleClip = useCallback(() => {\n if (!enabledButtons.includes('clip')) return;\n if (!selectedPlotId) return;\n dispatch({ type: 'SET_MODE', payload: 'clip' });\n }, [selectedPlotId, enabledButtons]);\n\n const handleMove = useCallback(() => {\n if (!enabledButtons.includes('move')) return;\n if (!selectedPlotId) return;\n dispatch({ type: 'SET_MODE', payload: 'move' });\n }, [selectedPlotId, enabledButtons]);\n\n const handleCreate = useCallback(() => {\n if (!enabledButtons.includes('create')) return;\n dispatch({ type: 'SET_MODE', payload: 'create' });\n }, [enabledButtons]);\n\n const handleEdit = useCallback(() => {\n if (!enabledButtons.includes('edit')) return;\n if (!selectedPlotId) return;\n callbacksRef.current.onEdit?.({\n plotId: selectedPlotId,\n plot: {} as PlotData, // 实际使用时需要传入真实数据\n });\n }, [selectedPlotId, enabledButtons]);\n\n const handleDelete = useCallback(() => {\n if (!enabledButtons.includes('delete')) return;\n if (!selectedPlotId) return;\n callbacksRef.current.onDelete?.({ plotId: selectedPlotId });\n dispatch({ type: 'DELETE_PLOT', payload: { plotId: selectedPlotId } as any });\n }, [selectedPlotId, enabledButtons]);\n\n const startEdit = useCallback((mode: PlotEditMode, layer: L.GeoJSON) => {\n dispatch({ type: 'START_EDIT', payload: { mode: mode as PlotMode, layer } });\n }, []);\n\n const clearTempLayer = useCallback(() => {\n dispatch({ type: 'CLEAR_TEMP_COORDINATES' });\n }, []);\n\n return {\n state,\n dispatch,\n editMode: state.mode as PlotEditMode,\n isPreviewMode: state.isPreview,\n clipHintMessage: state.selectedFragmentId ? '点击保存选中的碎片' : '',\n handleSave,\n handleCancel,\n handleRedraw,\n handleClip,\n handleMove,\n handleCreate,\n handleDelete,\n handleEdit,\n startEdit,\n clearTempLayer,\n areaMarkerRef,\n };\n}\n\n// 导出类型和子模块\nexport { PlotStateMachine, createPlotReducer } from './plotStateMachine';\nexport type { PlotState, PlotAction, PlotMode } from './types';\nexport { DEFAULT_PLOT_STATE } from './types';\nexport * from './hooks';\n\nexport default usePlotStateMachine;\n","/**\n * 顶点样式修复 Hook\n * @description 修复 Leaflet Geoman 编辑模式下顶点标记样式被覆盖的问题\n * @since 1.4.0\n */\n\nimport { useEffect, useRef } from 'react';\nimport type { RefObject } from 'react';\n\n/**\n * 配置选项\n */\nexport interface UseVertexStyleFixOptions {\n /** 顶点颜色,默认 '#fff' */\n vertexColor?: string;\n /** 顶点大小,默认 10 */\n vertexSize?: number;\n /** 修复延迟(ms),默认 50 */\n delay?: number;\n}\n\nconst DEFAULT_OPTIONS: Required<UseVertexStyleFixOptions> = {\n vertexColor: '#fff',\n vertexSize: 10,\n delay: 50,\n};\n\n/**\n * 顶点样式修复 Hook\n * @param container 容器元素 Ref\n * @param options 配置选项\n *\n * @description\n * Leaflet Geoman 在编辑模式下会创建顶点标记,\n * 但其默认样式可能被其他 CSS 覆盖,此 Hook 用于强制应用正确的顶点样式。\n *\n * @example\n * ```tsx\n * function RoadEditor() {\n * const containerRef = useRef<HTMLDivElement>(null);\n *\n * // 修复顶点样式\n * useVertexStyleFix(containerRef, {\n * vertexColor: '#fa8c16',\n * vertexSize: 12,\n * });\n *\n * return <div ref={containerRef}>...</div>;\n * }\n * ```\n */\nexport function useVertexStyleFix(\n container: RefObject<HTMLElement | null>,\n options: UseVertexStyleFixOptions = {}\n): void {\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n if (!container.current) return;\n\n const fixVertexStyle = () => {\n const markers = container.current?.querySelectorAll('.marker-icon,.vertex-marker');\n\n if (!markers || markers.length === 0) return;\n\n markers.forEach(marker => {\n const el = marker as HTMLElement;\n const currentBg = el.style.background;\n const currentBorder = el.style.border;\n\n // 仅在样式被覆盖时修复\n if (!currentBg.includes(mergedOptions.vertexColor)) {\n el.style.setProperty('background', mergedOptions.vertexColor, 'important');\n }\n\n const expectedBorder = `${mergedOptions.vertexSize}px solid ${mergedOptions.vertexColor}`;\n if (currentBorder !== expectedBorder) {\n el.style.setProperty('border', expectedBorder, 'important');\n }\n });\n };\n\n // 延迟执行,等待 Geoman 完成初始化\n timerRef.current = setTimeout(fixVertexStyle, mergedOptions.delay);\n\n // 清理定时器\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, [container, mergedOptions.vertexColor, mergedOptions.vertexSize, mergedOptions.delay]);\n\n // 监听 DOM 变化(可选,用于动态添加的顶点)\n useEffect(() => {\n if (!container.current) return;\n\n const observer = new MutationObserver(() => {\n // 使用 requestAnimationFrame 避免频繁触发\n requestAnimationFrame(() => {\n const markers = container.current?.querySelectorAll('.marker-icon,.vertex-marker');\n if (markers && markers.length > 0) {\n markers.forEach(marker => {\n const el = marker as HTMLElement;\n el.style.setProperty('background', mergedOptions.vertexColor, 'important');\n el.style.setProperty(\n 'border',\n `${mergedOptions.vertexSize}px solid ${mergedOptions.vertexColor}`,\n 'important'\n );\n });\n }\n });\n });\n\n observer.observe(container.current, {\n childList: true,\n subtree: true,\n });\n\n return () => {\n observer.disconnect();\n };\n }, [container, mergedOptions.vertexColor, mergedOptions.vertexSize]);\n}\n","/**\n * 几何计算工具函数\n */\n\nimport L from 'leaflet';\nimport type { Coordinate } from '../types';\n\n/**\n * 计算两点之间的距离(米)\n * @param point1 - 点1 [lat, lng]\n * @param point2 - 点2 [lat, lng]\n * @returns 距离(米)\n */\nexport const getDistance = (point1: Coordinate, point2: Coordinate): number => {\n const latlng1 = L.latLng(point1[0], point1[1]);\n const latlng2 = L.latLng(point2[0], point2[1]);\n return latlng1.distanceTo(latlng2);\n};\n\n/**\n * 计算两点之间的中点\n * @param point1 - 点1 [lat, lng]\n * @param point2 - 点2 [lat, lng]\n * @returns 中点 [lat, lng]\n */\nexport const getMiddlePoint = (point1: Coordinate, point2: Coordinate): Coordinate => {\n return [(point1[0] + point2[0]) / 2, (point1[1] + point2[1]) / 2];\n};\n\n/**\n * 格式化距离显示\n * @param distance - 距离(米)\n * @returns 格式化后的距离字符串\n */\nexport const formatDistance = (distance: number): string => {\n if (distance < 1000) {\n return `${Math.round(distance)}m`;\n }\n return `${(distance / 1000).toFixed(2)}km`;\n};\n\n/** 角度输出模式 */\ntype AngleMode = 'text' | 'compass';\n\n/**\n * 计算两点之间的原始角度(弧度→度数),供 getAngle / getLineAngle 复用\n * @param map - Leaflet地图实例\n * @param point1 - 点1 [lat, lng]\n * @param point2 - 点2 [lat, lng]\n * @param mode - 输出模式:'text' 钳制到 [-90,90](文字可读),'compass' 标准化到 [0,360]\n */\nfunction calcAngle(map: L.Map, point1: Coordinate, point2: Coordinate, mode: AngleMode): number {\n const p1 = map.latLngToContainerPoint(L.latLng(point1[0], point1[1]));\n const p2 = map.latLngToContainerPoint(L.latLng(point2[0], point2[1]));\n const dx = p2.x - p1.x;\n const dy = p2.y - p1.y;\n let angle = (Math.atan2(dy, dx) * 180) / Math.PI;\n\n if (mode === 'text') {\n // 调整角度,使文字始终正向可读\n if (angle > 90) angle -= 180;\n else if (angle < -90) angle += 180;\n } else {\n // 标准化到 0-360\n if (angle < 0) angle += 360;\n }\n\n return angle;\n}\n\n/**\n * 计算两点之间的角度(度),用于文字旋转\n * @param map - Leaflet地图实例\n * @param point1 - 点1 [lat, lng]\n * @param point2 - 点2 [lat, lng]\n * @returns 角度(度)\n */\nexport const getAngle = (map: L.Map, point1: Coordinate, point2: Coordinate): number =>\n calcAngle(map, point1, point2, 'text');\n\n/**\n * 计算线段角度(用于图标旋转)\n * @param map - Leaflet地图实例\n * @param point1 - 起点 [lat, lng]\n * @param point2 - 终点 [lat, lng]\n * @returns 角度(度,0-360)\n */\nexport const getLineAngle = (\n map: L.Map | null | undefined,\n point1: Coordinate,\n point2: Coordinate\n): number => {\n if (!map) return 0;\n return calcAngle(map, point1, point2, 'compass');\n};\n","/**\n * 图标创建工具函数\n */\n\nimport L from 'leaflet';\nimport type { DecoratorConfig, PathOptions } from '../types';\nimport { formatDistance } from './geometry';\n\n/** 距离图标选项 */\ninterface CreateDistanceIconOptions {\n color?: string;\n textShadow?: string;\n}\n\n/**\n * 创建距离标签图标\n * @param distance - 距离(米)\n * @param angle - 旋转角度\n * @param className - CSS类名前缀\n * @param options - 其他选项\n * @returns Leaflet DivIcon\n */\nexport const createDistanceIcon = (\n distance: number,\n angle = 0,\n className = 'distance-label',\n options: CreateDistanceIconOptions = {}\n): L.DivIcon => {\n const { color } = options;\n\n let style = `transform: rotate(${angle}deg);`;\n if (color) {\n style += ` color: ${color};`;\n }\n\n const labelClass = `${className}`;\n\n return L.divIcon({\n html: `<div class=\"${labelClass}\" style=\"${style}\">${formatDistance(distance)}</div>`,\n iconSize: [60, 20],\n iconAnchor: [30, 10],\n className: `${className}-wrapper`,\n });\n};\n\n/**\n * 创建流向箭头装饰器配置\n * @param decoratorConfig - 装饰器配置\n * @param style - 样式配置\n * @param defaultColor - 默认颜色\n * @returns patterns 数组\n */\nexport const createDecoratorPatterns = (\n decoratorConfig: boolean | DecoratorConfig,\n style: PathOptions = {},\n defaultColor = '#1E90FF'\n): L.PatternOptions[] => {\n if (!decoratorConfig) return [];\n\n const color = style.color || defaultColor;\n\n const defaults: DecoratorConfig = {\n offset: 0,\n repeat: 50,\n options: {\n pixelSize: 8,\n color: color,\n weight: 2,\n },\n };\n\n const config: DecoratorConfig =\n decoratorConfig === true ? defaults : { ...defaults, ...decoratorConfig };\n\n // 使用 L.Symbol 创建箭头符号\n const symbol = L.Symbol.arrowHead({\n pixelSize: config.options?.pixelSize || 8,\n polygon: false,\n pathOptions: {\n stroke: true,\n color: config.options?.color || color,\n weight: config.options?.weight || 2,\n },\n });\n\n return [\n {\n offset: config.offset ?? 0,\n repeat: config.repeat ?? 50,\n symbol,\n },\n ];\n};\n\n/**\n * 创建进水口图标\n * @param rotation - 旋转角度(度)\n * @returns Leaflet DivIcon\n */\nexport const createInletIcon = (rotation = 0): L.DivIcon => {\n return L.divIcon({\n html: `\n <div class=\"irrigation-port irrigation-port--inlet\" style=\"transform: rotate(${rotation}deg)\">\n <svg viewBox=\"0 0 24 24\" width=\"36\" height=\"36\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#1E90FF\" stroke=\"#fff\" stroke-width=\"2\"/>\n <g class=\"irrigation-port__arrow\">\n <path d=\"M12 6v9\" stroke=\"#fff\" stroke-width=\"2.5\" stroke-linecap=\"round\"/>\n <path d=\"M8 11l4 5 4-5\" stroke=\"#fff\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>\n </g>\n </svg>\n <span class=\"irrigation-port__label\" style=\"transform: rotate(${-rotation}deg)\">进水口</span>\n </div>\n `,\n iconSize: [36, 36],\n iconAnchor: [18, 18],\n className: 'irrigation-port-wrapper',\n });\n};\n\n/**\n * 创建出水口图标\n * @param rotation - 旋转角度(度)\n * @returns Leaflet DivIcon\n */\nexport const createOutletIcon = (rotation = 0): L.DivIcon => {\n return L.divIcon({\n html: `\n <div class=\"irrigation-port irrigation-port--outlet\" style=\"transform: rotate(${rotation}deg)\">\n <svg viewBox=\"0 0 24 24\" width=\"36\" height=\"36\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#52c41a\" stroke=\"#fff\" stroke-width=\"2\"/>\n <g class=\"irrigation-port__arrow\">\n <path d=\"M12 18v-9\" stroke=\"#fff\" stroke-width=\"2.5\" stroke-linecap=\"round\"/>\n <path d=\"M8 13l4-5 4 5\" stroke=\"#fff\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>\n </g>\n </svg>\n <span class=\"irrigation-port__label\" style=\"transform: rotate(${-rotation}deg)\">出水口</span>\n </div>\n `,\n iconSize: [36, 36],\n iconAnchor: [18, 18],\n className: 'irrigation-port-wrapper',\n });\n};\n","/**\n * 距离标签 Hook\n * @description 为线要素(道路、灌溉渠等)生成距离标签\n * @since 1.4.0\n */\n\nimport { useMemo } from 'react';\nimport L from 'leaflet';\nimport type { Coordinate } from '../types';\nimport { getDistance, getMiddlePoint } from '../utils/geometry';\nimport { createDistanceIcon } from '../utils/leafletIcons';\n\n/**\n * 距离标签数据\n */\nexport interface DistanceLabel {\n /** 标签位置坐标 */\n position: Coordinate;\n /** 距离值(米) */\n distance: number;\n /** 旋转角度(度) */\n angle: number;\n /** Leaflet Marker 实例 */\n marker: L.Marker;\n}\n\n/**\n * 配置选项\n */\nexport interface UseDistanceLabelsOptions {\n /** 是否启用,默认 true */\n enabled?: boolean;\n /** 标签类型,默认 'distance' */\n labelType?: 'distance' | 'area';\n /** 距离格式化函数 */\n formatDistance?: (distance: number) => string;\n /** 标签前缀 */\n prefix?: string;\n}\n\nconst DEFAULT_OPTIONS: Required<UseDistanceLabelsOptions> = {\n enabled: true,\n labelType: 'distance',\n formatDistance: distance => `${distance.toFixed(1)}m`,\n prefix: '',\n};\n\n/**\n * 距离标签 Hook\n * @param points 坐标点数组\n * @param map 地图实例\n * @param options 配置选项\n * @returns 距离标签数组\n *\n * @description\n * 为线要素的每个线段生成距离标签,自动计算:\n * - 线段中点位置\n * - 线段长度(米)\n * - 线段角度(用于标签旋转)\n *\n * @example\n * ```tsx\n * function RoadEditor({ points, map }) {\n * const labels = useDistanceLabels(points, map);\n *\n * return (\n * <>\n * {labels.map((label, i) => (\n * <Marker key={i} position={label.position} icon={label.icon} />\n * ))}\n * </>\n * );\n * }\n * ```\n */\nexport function useDistanceLabels(\n points: Coordinate[],\n map: L.Map | null,\n options: UseDistanceLabelsOptions = {}\n): DistanceLabel[] {\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n\n return useMemo(() => {\n if (!mergedOptions.enabled || !map || points.length < 2) {\n return [];\n }\n\n const labels: DistanceLabel[] = [];\n\n for (let i = 0; i < points.length - 1; i++) {\n const point1 = points[i];\n const point2 = points[i + 1];\n\n if (!point1 || !point2) continue;\n\n // 计算距离\n const distance = getDistance(point1, point2);\n\n // 计算中点\n const middlePoint = getMiddlePoint(point1, point2);\n if (!middlePoint) continue;\n\n // 计算角度\n const deltaLng = point2[0] - point1[0];\n const deltaLat = point2[1] - point1[1];\n const angle = Math.atan2(deltaLng, deltaLat) * (180 / Math.PI);\n\n // 创建距离图标\n const icon = createDistanceIcon(distance, angle, `${mergedOptions.labelType}-label`);\n\n // 创建 Marker\n const marker = L.marker(middlePoint as L.LatLngExpression, {\n icon,\n zIndexOffset: 1000, // 确保标签在最上层\n });\n\n labels.push({\n position: middlePoint,\n distance,\n angle,\n marker,\n });\n }\n\n return labels;\n }, [points, map, mergedOptions.enabled, mergedOptions.labelType]);\n}\n\n/**\n * 简化的距离计算 Hook(仅返回数据,不创建 Marker)\n * @description 适用于只需要距离数据,不需要渲染 Marker 的场景\n *\n * @example\n * ```tsx\n * const distanceData = useDistanceData(points);\n * console.log(`总距离:${distanceData.total.toFixed(2)}m`);\n * distanceData.segments.forEach(seg => {\n * console.log(`段 ${seg.index}: ${seg.distance}m`);\n * });\n * ```\n */\nexport function useDistanceData(points: Coordinate[]): {\n /** 总距离(米) */\n total: number;\n /** 各段距离 */\n segments: {\n index: number;\n distance: number;\n middle: Coordinate;\n }[];\n} {\n return useMemo(() => {\n if (points.length < 2) {\n return { total: 0, segments: [] };\n }\n\n const segments: {\n index: number;\n distance: number;\n middle: Coordinate;\n }[] = [];\n let total = 0;\n\n for (let i = 0; i < points.length - 1; i++) {\n const point1 = points[i];\n const point2 = points[i + 1];\n\n if (!point1 || !point2) continue;\n\n const distance = getDistance(point1, point2);\n const middle = getMiddlePoint(point1, point2) || point1;\n\n total += distance;\n segments.push({\n index: i,\n distance,\n middle,\n });\n }\n\n return { total, segments };\n }, [points]);\n}\n","/**\n * @fileoverview 增量更新 Hook\n * @description 优化大面积数据集的增量更新,避免全量重建\n * @since 1.4.0\n */\n\nimport { useCallback, useRef, useMemo } from 'react';\n\n/** 更新项类型 */\nexport interface UpdateItem<T> {\n id: string | number;\n data: T;\n type: 'add' | 'update' | 'remove';\n}\n\n/** 增量更新配置 */\nexport interface IncrementalUpdateOptions<T, R> {\n /** 获取项 ID */\n getId: (item: T) => string | number;\n /** 判断两项是否相等 */\n isEqual?: (a: T, b: T) => boolean;\n /** 应用更新到结果 */\n applyUpdate: (result: R, item: T, type: 'add' | 'update' | 'remove') => void;\n /** 创建初始结果 */\n createInitial: () => R;\n}\n\n/** 增量更新 Hook 返回值 */\nexport interface IncrementalUpdateResult<T, R> {\n /** 当前结果 */\n result: R;\n /** 应用增量更新 */\n applyIncremental: (prevItems: T[], newItems: T[]) => void;\n /** 强制全量重建 */\n rebuild: (items: T[]) => void;\n /** 获取更新差异 */\n getDiff: (prevItems: T[], newItems: T[]) => UpdateItem<T>[];\n}\n\n/**\n * 增量更新 Hook\n * @description 比较前后数据差异,只更新变化的部分\n *\n * @param options 配置选项\n * @returns 增量更新方法和结果\n *\n * @example\n * ```tsx\n * const { result, applyIncremental, getDiff } = useIncrementalUpdate({\n * getId: (plot) => plot.id,\n * isEqual: (a, b) => a.name === b.name && a.area === b.area,\n * applyUpdate: (map, item, type) => {\n * if (type === 'add') map.set(item.id, item);\n * else if (type === 'remove') map.delete(item.id);\n * else map.set(item.id, item);\n * },\n * createInitial: () => new Map(),\n * });\n *\n * // 应用增量更新\n * applyIncremental(prevData, newData);\n * ```\n */\nexport function useIncrementalUpdate<T, R>(\n options: IncrementalUpdateOptions<T, R>\n): IncrementalUpdateResult<T, R> {\n const { getId, isEqual, applyUpdate, createInitial } = options;\n\n // 结果引用\n const resultRef = useRef<R>(createInitial());\n\n /**\n * 获取更新差异\n */\n const getDiff = useCallback(\n (prevItems: T[], newItems: T[]): UpdateItem<T>[] => {\n const diff: UpdateItem<T>[] = [];\n const prevMap = new Map<string | number, T>();\n const newMap = new Map<string | number, T>();\n\n // 构建映射\n for (const item of prevItems) {\n prevMap.set(getId(item), item);\n }\n for (const item of newItems) {\n newMap.set(getId(item), item);\n }\n\n // 检测新增和更新\n for (const [id, newItem] of newMap) {\n const prevItem = prevMap.get(id);\n if (!prevItem) {\n diff.push({ id, data: newItem, type: 'add' });\n } else if (isEqual && !isEqual(prevItem, newItem)) {\n diff.push({ id, data: newItem, type: 'update' });\n } else if (!isEqual && prevItem !== newItem) {\n diff.push({ id, data: newItem, type: 'update' });\n }\n }\n\n // 检测删除\n for (const [id, prevItem] of prevMap) {\n if (!newMap.has(id)) {\n diff.push({ id, data: prevItem, type: 'remove' });\n }\n }\n\n return diff;\n },\n [getId, isEqual]\n );\n\n /**\n * 应用增量更新\n */\n const applyIncremental = useCallback(\n (prevItems: T[], newItems: T[]) => {\n const diff = getDiff(prevItems, newItems);\n\n if (diff.length === 0) return;\n\n for (const update of diff) {\n applyUpdate(resultRef.current, update.data, update.type);\n }\n },\n [getDiff, applyUpdate]\n );\n\n /**\n * 强制全量重建\n */\n const rebuild = useCallback(\n (items: T[]) => {\n resultRef.current = createInitial();\n for (const item of items) {\n applyUpdate(resultRef.current, item, 'add');\n }\n },\n [createInitial, applyUpdate]\n );\n\n return useMemo(\n () => ({\n result: resultRef.current,\n applyIncremental,\n rebuild,\n getDiff,\n }),\n [applyIncremental, rebuild, getDiff]\n );\n}\n\n/**\n * 图层样式增量更新 Hook\n * @description 专门用于更新 Leaflet 图层样式的增量更新\n */\nexport function useLayerStyleIncremental<T extends { id: string | number }>(\n getStyle: (item: T, isSelected: boolean) => L.PathOptions,\n getLayerById: (id: string | number) => L.Polygon | null\n): {\n updateStyles: (prevItems: T[], newItems: T[], selectedIds: Set<string | number>) => void;\n updateSelection: (\n prevSelectedIds: Set<string | number>,\n newSelectedIds: Set<string | number>,\n items: T[]\n ) => void;\n} {\n const prevItemsRef = useRef<T[]>([]);\n const prevSelectedIdsRef = useRef<Set<string | number>>(new Set());\n\n /**\n * 更新样式(基于数据变化)\n */\n const updateStyles = useCallback(\n (prevItems: T[], newItems: T[], selectedIds: Set<string | number>) => {\n const prevMap = new Map<string | number, T>();\n const newMap = new Map<string | number, T>();\n\n for (const item of prevItems) {\n prevMap.set(item.id, item);\n }\n for (const item of newItems) {\n newMap.set(item.id, item);\n }\n\n // 只更新变化的项目\n for (const [id, newItem] of newMap) {\n const prevItem = prevMap.get(id);\n if (prevItem !== newItem) {\n const layer = getLayerById(id);\n if (layer) {\n const isSelected = selectedIds.has(id);\n layer.setStyle(getStyle(newItem, isSelected));\n }\n }\n }\n\n prevItemsRef.current = newItems;\n },\n [getStyle, getLayerById]\n );\n\n /**\n * 更新选中状态样式\n */\n const updateSelection = useCallback(\n (prevSelectedIds: Set<string | number>, newSelectedIds: Set<string | number>, items: T[]) => {\n const changedIds = new Set<string | number>();\n\n // 找出选中状态变化的 ID\n for (const id of prevSelectedIds) {\n if (!newSelectedIds.has(id)) changedIds.add(id);\n }\n for (const id of newSelectedIds) {\n if (!prevSelectedIds.has(id)) changedIds.add(id);\n }\n\n // 只更新变化的项目\n for (const id of changedIds) {\n const layer = getLayerById(id);\n const item = items.find(i => i.id === id);\n if (layer && item) {\n const isSelected = newSelectedIds.has(id);\n layer.setStyle(getStyle(item, isSelected));\n }\n }\n\n prevSelectedIdsRef.current = newSelectedIds;\n },\n [getStyle, getLayerById]\n );\n\n return { updateStyles, updateSelection };\n}\n\nexport default useIncrementalUpdate;\n","/**\n * RAF 节流工具\n * @description 使用 requestAnimationFrame 实现节流,优化频繁触发的回调\n * @since 1.4.0\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- 泛型约束需要 */\n\nimport { useRef, useEffect, useMemo } from 'react';\n\n/**\n * RAF 节流函数\n * @description 使用 requestAnimationFrame 节流,确保回调在每一帧最多执行一次\n * @param callback 要节流的回调函数\n * @returns 节流后的函数\n *\n * @example\n * ```ts\n * const handleMapMove = useRafThrottle(() => {\n * // 地图移动时的处理逻辑\n * updateViewport();\n * });\n *\n * map.on('move', handleMapMove);\n * ```\n */\nexport function useRafThrottle<T extends (...args: any[]) => any>(callback: T): T {\n const rafRef = useRef<number | null>(null);\n const lastArgsRef = useRef<unknown[]>([]);\n const callbackRef = useRef(callback);\n\n // 更新回调引用\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n // 清理\n useEffect(() => {\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, []);\n\n return useMemo(() => {\n const throttledFn = (...args: unknown[]) => {\n lastArgsRef.current = args;\n\n if (rafRef.current === null) {\n rafRef.current = requestAnimationFrame(() => {\n callbackRef.current(...lastArgsRef.current);\n rafRef.current = null;\n });\n }\n };\n\n return throttledFn as T;\n }, []);\n}\n\n/**\n * 延迟执行函数\n * @description 在指定延迟后执行函数,支持取消\n * @param callback 要执行的函数\n * @param delay 延迟时间(ms)\n * @returns 执行函数(可取消)\n *\n * @example\n * ```ts\n * const debouncedUpdate = useDebouncedCallback(() => {\n * updateData();\n * }, 300);\n *\n * // 调用\n * debouncedUpdate();\n *\n * // 取消\n * debouncedUpdate.cancel();\n * ```\n */\nexport function useDebouncedCallback<T extends (...args: any[]) => any>(\n callback: T,\n delay: number\n): T & { cancel: () => void } {\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n const callbackRef = useRef(callback);\n\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n const debouncedFn = useMemo(() => {\n const fn = (...args: unknown[]) => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n\n timerRef.current = setTimeout(() => {\n callbackRef.current(...args);\n timerRef.current = null;\n }, delay);\n };\n\n fn.cancel = () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n\n return fn as T & { cancel: () => void };\n }, [delay]);\n\n return debouncedFn;\n}\n\n/**\n * 批量更新工具\n * @description 将多次更新合并为一次,适用于频繁状态更新场景\n * @param callback 更新函数\n * @param interval 合并间隔(ms),默认 100ms\n * @returns 批量更新函数\n *\n * @example\n * ```ts\n * const batchUpdate = useBatchedUpdate((updates) => {\n * setData(prev => [...prev, ...updates]);\n * }, 100);\n *\n * // 多次调用会合并为一次\n * batchUpdate(item1);\n * batchUpdate(item2);\n * batchUpdate(item3);\n * // 100ms 后一次性更新 [item1, item2, item3]\n * ```\n */\nexport function useBatchedUpdate<T>(callback: (items: T[]) => void, interval = 100) {\n const itemsRef = useRef<T[]>([]);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n const callbackRef = useRef(callback);\n\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n const batchedUpdate = (item: T) => {\n itemsRef.current.push(item);\n\n if (timerRef.current === null) {\n timerRef.current = setTimeout(() => {\n const items = itemsRef.current;\n itemsRef.current = [];\n callbackRef.current(items);\n timerRef.current = null;\n }, interval);\n }\n };\n\n // 立即执行批量更新\n const flush = () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n\n if (itemsRef.current.length > 0) {\n callbackRef.current(itemsRef.current);\n itemsRef.current = [];\n }\n };\n\n return { batchedUpdate, flush };\n}\n","/**\n * @fileoverview 统一视口防抖 Hook\n * @description 优化地图视口变化时的性能,减少频繁触发更新,适用于所有图层组件\n * @module hooks/useViewportDebounce\n * @since 2.1.0 统一优化\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport type L from 'leaflet';\nimport { useRafThrottle, useDebouncedCallback } from '../utils/rafThrottle';\n\n/** 视口状态 */\nexport interface ViewportState {\n /** 当前缩放级别 */\n zoom: number;\n /** 视口版本号(每次变化递增) */\n viewVersion: number;\n /** 当前视口边界 */\n bounds: L.LatLngBounds | null;\n /** 地图中心点 */\n center: L.LatLng | null;\n}\n\n/** 防抖配置 */\nexport interface ViewportDebounceOptions {\n /** 地图实例 */\n map: L.Map | null;\n /** zoom 变化防抖延迟(ms),默认 100 */\n zoomDebounceDelay?: number;\n /** move 变化防抖延迟(ms),默认 150 */\n moveDebounceDelay?: number;\n /** 是否启用 RAF 节流,默认 true */\n useRaf?: boolean;\n /** 是否监听 resize 事件,默认 false */\n listenResize?: boolean;\n}\n\n/** 防抖结果 */\nexport interface ViewportDebounceResult extends ViewportState {\n /** 防抖后的缩放级别 */\n debouncedZoom: number;\n /** 防抖后的视口版本 */\n debouncedViewVersion: number;\n /** 防抖后的视口边界 */\n debouncedBounds: L.LatLngBounds | null;\n /** 防抖后的地图中心 */\n debouncedCenter: L.LatLng | null;\n /** 强制刷新(跳过防抖) */\n forceUpdate: () => void;\n /** 实时状态(无防抖) */\n realtime: ViewportState;\n}\n\n/**\n * 统一视口防抖 Hook\n * @description 通过防抖和 RAF 节流减少视口变化触发频率,适用于 PlotLayer、Marker、Track 等组件\n *\n * @example\n * ```tsx\n * // 在 PlotLayer 中使用\n * const { debouncedZoom, debouncedBounds, debouncedViewVersion } = useViewportDebounce({\n * map,\n * zoomDebounceDelay: 100,\n * moveDebounceDelay: 150,\n * });\n *\n * // 使用防抖后的值进行视口过滤\n * const visiblePlots = useMemo(() => {\n * if (!spatialIndex || !debouncedBounds) return [];\n * return spatialIndex.query(debouncedBounds);\n * }, [spatialIndex, debouncedViewVersion]);\n *\n * // 在 Marker 中使用(聚合)\n * const clusterResults = useMemo(() => {\n * if (!clusterIndex || !debouncedBounds) return [];\n * return clusterIndex.getClusters([...bounds], Math.floor(debouncedZoom));\n * }, [clusterIndex, debouncedViewVersion, debouncedZoom]);\n * ```\n */\nexport function useViewportDebounce(options: ViewportDebounceOptions): ViewportDebounceResult {\n const {\n map,\n zoomDebounceDelay = 100,\n moveDebounceDelay = 150,\n useRaf = true,\n listenResize = false,\n } = options;\n\n // 实时状态(用于事件监听)\n const [realtimeZoom, setRealtimeZoom] = useState(0);\n const [realtimeViewVersion, setRealtimeViewVersion] = useState(0);\n const realtimeBoundsRef = useRef<L.LatLngBounds | null>(null);\n const realtimeCenterRef = useRef<L.LatLng | null>(null);\n\n // 防抖后状态(用于渲染和计算)\n const [debouncedZoom, setDebouncedZoom] = useState(0);\n const [debouncedViewVersion, setDebouncedViewVersion] = useState(0);\n const [debouncedBounds, setDebouncedBounds] = useState<L.LatLngBounds | null>(null);\n const [debouncedCenter, setDebouncedCenter] = useState<L.LatLng | null>(null);\n\n // 防抖回调\n const debouncedSetZoom = useDebouncedCallback(\n useCallback((zoom: number) => {\n setDebouncedZoom(zoom);\n }, []),\n zoomDebounceDelay\n );\n\n const debouncedSetViewVersion = useDebouncedCallback(\n useCallback((version: number) => {\n setDebouncedViewVersion(version);\n setDebouncedBounds(realtimeBoundsRef.current);\n setDebouncedCenter(realtimeCenterRef.current);\n }, []),\n moveDebounceDelay\n );\n\n // RAF 节流版本\n const throttledSetViewVersion = useRafThrottle(\n useCallback((version: number) => {\n setDebouncedViewVersion(version);\n setDebouncedBounds(realtimeBoundsRef.current);\n setDebouncedCenter(realtimeCenterRef.current);\n }, [])\n );\n\n // 强制刷新(跳过防抖)\n const forceUpdate = useCallback(() => {\n if (!map) return;\n const zoom = map.getZoom();\n const bounds = map.getBounds();\n const center = map.getCenter();\n setDebouncedZoom(zoom);\n setDebouncedBounds(bounds);\n setDebouncedCenter(center);\n setDebouncedViewVersion(v => v + 1);\n setRealtimeZoom(zoom);\n realtimeBoundsRef.current = bounds;\n realtimeCenterRef.current = center;\n setRealtimeViewVersion(v => v + 1);\n }, [map]);\n\n // 监听地图事件\n useEffect(() => {\n if (!map) return;\n\n // 初始化状态\n const initialZoom = map.getZoom();\n const initialBounds = map.getBounds();\n const initialCenter = map.getCenter();\n\n setRealtimeZoom(initialZoom);\n setDebouncedZoom(initialZoom);\n realtimeBoundsRef.current = initialBounds;\n setDebouncedBounds(initialBounds);\n realtimeCenterRef.current = initialCenter;\n setDebouncedCenter(initialCenter);\n\n const handleZoomEnd = () => {\n const zoom = map.getZoom();\n setRealtimeZoom(zoom);\n debouncedSetZoom(zoom);\n };\n\n const handleMoveEnd = () => {\n realtimeBoundsRef.current = map.getBounds();\n realtimeCenterRef.current = map.getCenter();\n setRealtimeViewVersion(v => {\n const newVersion = v + 1;\n if (useRaf) {\n throttledSetViewVersion(newVersion);\n } else {\n debouncedSetViewVersion(newVersion);\n }\n return newVersion;\n });\n };\n\n const handleResize = () => {\n // resize 时强制更新\n forceUpdate();\n };\n\n map.on('zoomend', handleZoomEnd);\n map.on('moveend', handleMoveEnd);\n if (listenResize) {\n map.on('resize', handleResize);\n }\n\n return () => {\n map.off('zoomend', handleZoomEnd);\n map.off('moveend', handleMoveEnd);\n if (listenResize) {\n map.off('resize', handleResize);\n }\n debouncedSetZoom.cancel();\n debouncedSetViewVersion.cancel();\n };\n }, [\n map,\n debouncedSetZoom,\n debouncedSetViewVersion,\n throttledSetViewVersion,\n useRaf,\n listenResize,\n forceUpdate,\n ]);\n\n return {\n // 防抖后状态\n debouncedZoom,\n debouncedViewVersion,\n debouncedBounds,\n debouncedCenter,\n // 实时状态\n realtime: {\n zoom: realtimeZoom,\n viewVersion: realtimeViewVersion,\n bounds: realtimeBoundsRef.current,\n center: realtimeCenterRef.current,\n },\n // 实时状态别名(兼容旧代码)\n zoom: realtimeZoom,\n viewVersion: realtimeViewVersion,\n bounds: realtimeBoundsRef.current,\n center: realtimeCenterRef.current,\n // 方法\n forceUpdate,\n };\n}\n\nexport default useViewportDebounce;\n","/**\n * @fileoverview 统一图层增量更新 Hook\n * @description 通用的 Leaflet 图层增量更新逻辑,适用于 GeoJSON Layer、Marker Layer、Polyline Layer 等\n * @module hooks/useLayerIncrementalUpdate\n * @since 2.1.0 统一优化\n */\n\nimport { useRef, useCallback, useEffect } from 'react';\nimport type L from 'leaflet';\nimport { logger } from '../utils/errorHandling';\n\n/** 图层项基础接口 */\nexport interface LayerItem {\n id: string | number;\n}\n\n/** 图层实例与元数据映射 */\nexport interface LayerEntry<T extends LayerItem> {\n layer: L.Layer;\n data: T;\n}\n\n/** 增量更新配置 */\nexport interface IncrementalUpdateOptions<T extends LayerItem> {\n /** 地图实例 */\n map: L.Map | null;\n /** 数据数组 */\n data: T[];\n /** 创建单个图层的函数 */\n createLayer: (item: T, index: number) => L.Layer | null;\n /** 更新单个图层的函数(可选) */\n updateLayer?: (entry: LayerEntry<T>, newItem: T, index: number) => boolean;\n /** 移除单个图层的函数 */\n removeLayer?: (layer: L.Layer) => void;\n /** 获取图层 ID 的函数 */\n getId?: (item: T) => string | number;\n /** 是否启用增量更新,默认 true */\n enabled?: boolean;\n}\n\n/** 增量更新结果 */\nexport interface IncrementalUpdateResult<T extends LayerItem> {\n /** 图层映射 (id -> LayerEntry) */\n layersMap: Map<string | number, LayerEntry<T>>;\n /** 手动触发更新 */\n update: (newData: T[]) => void;\n /** 清理所有图层 */\n clear: () => void;\n /** 获取当前图层数量 */\n count: () => number;\n /** 获取指定图层 */\n get: (id: string | number) => LayerEntry<T> | undefined;\n}\n\n/**\n * 统一图层增量更新 Hook\n * @description 通过 diff 算法只更新变化的图层,避免全量重建\n *\n * @example\n * ```tsx\n * // 在 Marker 组件中使用\n * const { update, clear, count } = useLayerIncrementalUpdate({\n * map,\n * data: displayMarkers,\n * createLayer: (item, index) => {\n * return L.marker(item.position, { icon: getItemIcon(item) }).addTo(map);\n * },\n * updateLayer: (entry, newItem) => {\n * if (entry.data.position !== newItem.position) {\n * (entry.layer as L.Marker).setLatLng(newItem.position);\n * return true;\n * }\n * return false;\n * },\n * });\n *\n * // 在 PlotLayer 中使用(GeoJSON Layer)\n * const { layersMap } = useLayerIncrementalUpdate({\n * map,\n * data: visiblePlots,\n * createLayer: (plot) => createGeoJSONLayer(plot),\n * });\n * ```\n */\nexport function useLayerIncrementalUpdate<T extends LayerItem>(\n options: IncrementalUpdateOptions<T>\n): IncrementalUpdateResult<T> {\n const {\n map,\n data,\n createLayer,\n updateLayer,\n removeLayer,\n getId = (item: T) => item.id,\n enabled = true,\n } = options;\n\n // 图层实例映射\n const layersMapRef = useRef<Map<string | number, LayerEntry<T>>>(new Map());\n\n // 默认移除函数\n const defaultRemoveLayer = useCallback((layer: L.Layer) => {\n try {\n layer.remove();\n } catch (error) {\n logger.error('useLayerIncrementalUpdate', '移除图层失败:', error);\n }\n }, []);\n\n const actualRemoveLayer = removeLayer || defaultRemoveLayer;\n\n /**\n * 执行增量更新\n */\n const performUpdate = useCallback(\n (newData: T[]) => {\n if (!map) return;\n\n // 边界检查\n if (!Array.isArray(newData)) {\n logger.warn('useLayerIncrementalUpdate', 'data 不是有效数组');\n return;\n }\n\n const currentIds = new Set(newData.map(getId));\n const existingIds = new Set(layersMapRef.current.keys());\n\n // 1. 删除不再存在的图层\n existingIds.forEach(id => {\n if (!currentIds.has(id)) {\n const entry = layersMapRef.current.get(id);\n if (entry) {\n actualRemoveLayer(entry.layer);\n layersMapRef.current.delete(id);\n }\n }\n });\n\n // 2. 创建或更新图层\n newData.forEach((item, index) => {\n const id = getId(item);\n const existing = layersMapRef.current.get(id);\n\n if (existing) {\n // 尝试更新现有图层\n if (updateLayer) {\n const success = updateLayer(existing, item, index);\n if (success) {\n layersMapRef.current.set(id, { ...existing, data: item });\n } else {\n // 更新失败,重建\n actualRemoveLayer(existing.layer);\n layersMapRef.current.delete(id);\n const newLayer = createLayer(item, index);\n if (newLayer) {\n layersMapRef.current.set(id, { layer: newLayer, data: item });\n }\n }\n } else {\n // 无更新函数,直接更新数据引用\n layersMapRef.current.set(id, { ...existing, data: item });\n }\n } else {\n // 创建新图层\n const newLayer = createLayer(item, index);\n if (newLayer) {\n layersMapRef.current.set(id, { layer: newLayer, data: item });\n }\n }\n });\n },\n [map, createLayer, updateLayer, actualRemoveLayer, getId]\n );\n\n /**\n * 手动触发更新\n */\n const update = useCallback(\n (newData: T[]) => {\n performUpdate(newData);\n },\n [performUpdate]\n );\n\n /**\n * 清理所有图层\n */\n const clear = useCallback(() => {\n layersMapRef.current.forEach(entry => {\n actualRemoveLayer(entry.layer);\n });\n layersMapRef.current.clear();\n }, [actualRemoveLayer]);\n\n /**\n * 获取当前图层数量\n */\n const count = useCallback(() => layersMapRef.current.size, []);\n\n /**\n * 获取指定图层\n */\n const get = useCallback((id: string | number) => layersMapRef.current.get(id), []);\n\n // 自动更新(当 data 变化时)\n useEffect(() => {\n if (!enabled || !map) return;\n performUpdate(data);\n }, [enabled, map, data, performUpdate]);\n\n // 组件卸载时清理\n useEffect(() => {\n return () => clear();\n }, [clear]);\n\n return {\n layersMap: layersMapRef.current,\n update,\n clear,\n count,\n get,\n };\n}\n\nexport default useLayerIncrementalUpdate;\n","/**\n * 增强虚拟化 Hook\n * @description 为超大数据集(10 万 + 地块)提供激进的虚拟化渲染策略\n * @since 1.5.0\n */\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport type { BBox } from '../utils/spatialIndex';\n\n/** 虚拟化配置 */\nexport interface EnhancedVirtualizationConfig {\n /** 是否启用虚拟化 */\n enabled?: boolean | 'auto';\n /** 自动启用的数据量阈值 */\n autoEnableThreshold?: number;\n /** 视口缓冲区大小(度数) */\n buffer?: number;\n /** 节流时间(毫秒) */\n throttleMs?: number;\n /** 最小缩放级别(低于此级别不渲染) */\n minZoom?: number;\n /** 最大缩放级别(高于此级别全量渲染) */\n maxZoom?: number;\n /** 缩放级别阈值(低于此级别使用简化几何) */\n simplifyZoomThreshold?: number;\n /** 分块加载:将数据分为多块,每块独立渲染 */\n chunkedLoading?: boolean;\n /** 每块的大小(地块数量) */\n chunkSize?: number;\n /** 最大并发渲染块数 */\n maxConcurrentChunks?: number;\n}\n\n/** 视口状态 */\nexport interface ViewportState {\n /** 视口边界框 */\n viewport: BBox | null;\n /** 当前缩放级别 */\n zoom: number;\n /** 视口版本号(用于触发更新) */\n version: number;\n}\n\n/** Hook 返回值 */\nexport interface UseEnhancedVirtualizationResult {\n /** 是否启用虚拟化 */\n isVirtualized: boolean;\n /** 视口状态 */\n viewport: ViewportState;\n /** 更新视口 */\n updateViewport: (viewport: BBox, zoom: number) => void;\n /** 节流版更新视口 */\n throttledUpdateViewport: (viewport: BBox, zoom: number) => void;\n /** 是否在缩放范围内 */\n isInZoomRange: boolean;\n /** 是否应使用简化几何 */\n shouldSimplify: boolean;\n /** 当前加载的块索引 */\n loadedChunks: Set<number>;\n /** 总块数 */\n totalChunks: number;\n /** 获取应渲染的数据块 */\n getVisibleChunks: () => number[];\n /** 清除已加载的块 */\n clearChunks: () => void;\n}\n\n/**\n * 增强虚拟化 Hook\n * @description 为超大数据集提供激进的虚拟化渲染策略\n *\n * @param config 配置选项\n * @param dataLength 数据总数\n * @returns 虚拟化状态和控制函数\n *\n * @example\n * ```tsx\n * function PlotLayer({ dataSource }) {\n * const {\n * isVirtualized,\n * viewport,\n * throttledUpdateViewport,\n * isInZoomRange,\n * shouldSimplify\n * } = useEnhancedVirtualization({\n * enabled: 'auto',\n * autoEnableThreshold: 10000,\n * buffer: 0.02,\n * throttleMs: 100,\n * minZoom: 6,\n * maxZoom: 18,\n * simplifyZoomThreshold: 14,\n * chunkedLoading: true,\n * chunkSize: 1000,\n * maxConcurrentChunks: 3\n * }, dataSource.length);\n *\n * // 在地图移动事件中更新视口\n * map.on('move', () => {\n * const bounds = map.getBounds();\n * throttledUpdateViewport(\n * [bounds.getSouth(), bounds.getWest(), bounds.getNorth(), bounds.getEast()],\n * map.getZoom()\n * );\n * });\n *\n * // 过滤可见数据\n * const visibleData = useMemo(() => {\n * if (!isVirtualized || !viewport.viewport || !isInZoomRange) {\n * return dataSource;\n * }\n * return filterByViewport(dataSource, viewport.viewport);\n * }, [dataSource, isVirtualized, viewport, isInZoomRange]);\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function useEnhancedVirtualization(\n config: EnhancedVirtualizationConfig = {},\n dataLength: number\n): UseEnhancedVirtualizationResult {\n const {\n enabled = 'auto',\n autoEnableThreshold = 10000,\n buffer = 0.02,\n throttleMs = 100,\n minZoom = 6,\n maxZoom = 18,\n simplifyZoomThreshold = 14,\n chunkedLoading = true,\n chunkSize = 1000,\n maxConcurrentChunks: _maxConcurrentChunks = 3,\n } = config;\n\n // 是否启用虚拟化\n const isVirtualized = useMemo(() => {\n if (enabled === true) return true;\n if (enabled === false) return false;\n return dataLength >= autoEnableThreshold;\n }, [enabled, dataLength, autoEnableThreshold]);\n\n // 视口状态\n const [viewport, setViewport] = useState<ViewportState>({\n viewport: null,\n zoom: 0,\n version: 0,\n });\n\n // 已加载的块\n const loadedChunksRef = useRef<Set<number>>(new Set());\n\n // 节流定时器\n const throttleTimerRef = useRef<number | null>(null);\n\n // 更新视口\n const updateViewport = useCallback(\n (bbox: BBox, zoom: number) => {\n // 应用缓冲区\n const bufferedBBox: BBox = [\n Math.max(bbox[0] - buffer, -90),\n Math.max(bbox[1] - buffer, -180),\n Math.min(bbox[2] + buffer, 90),\n Math.min(bbox[3] + buffer, 180),\n ];\n\n setViewport(prev => ({\n viewport: bufferedBBox,\n zoom,\n version: prev.version + 1,\n }));\n },\n [buffer]\n );\n\n // 节流版更新视口\n const throttledUpdateViewport = useCallback(\n (bbox: BBox, zoom: number) => {\n if (throttleTimerRef.current) {\n window.clearTimeout(throttleTimerRef.current);\n }\n\n throttleTimerRef.current = window.setTimeout(() => {\n updateViewport(bbox, zoom);\n throttleTimerRef.current = null;\n }, throttleMs);\n },\n [updateViewport, throttleMs]\n );\n\n // 是否在缩放范围内\n const isInZoomRange = useMemo(() => {\n return viewport.zoom >= minZoom && viewport.zoom <= maxZoom;\n }, [viewport.zoom, minZoom, maxZoom]);\n\n // 是否应使用简化几何\n const shouldSimplify = useMemo(() => {\n return viewport.zoom < simplifyZoomThreshold;\n }, [viewport.zoom, simplifyZoomThreshold]);\n\n // 总块数\n const totalChunks = useMemo(() => {\n if (!chunkedLoading) return 1;\n return Math.ceil(dataLength / chunkSize);\n }, [chunkedLoading, dataLength, chunkSize]);\n\n // 获取可见的块索引\n const getVisibleChunks = useCallback((): number[] => {\n if (!chunkedLoading || !viewport.viewport) {\n return [0];\n }\n\n // 简单实现:根据视口中心点计算块索引\n // 实际使用时可结合空间索引优化\n const centerLat = (viewport.viewport[0] + viewport.viewport[2]) / 2;\n const centerLng = (viewport.viewport[1] + viewport.viewport[3]) / 2;\n\n // 使用哈希函数将地理位置映射到块索引\n const hash = Math.abs(Math.floor(centerLat * 100) + Math.floor(centerLng * 100));\n const visibleChunk = hash % totalChunks;\n\n // 返回可见块及相邻块\n const chunks: number[] = [];\n for (let i = -1; i <= 1; i++) {\n const chunkIndex = (visibleChunk + i + totalChunks) % totalChunks;\n chunks.push(chunkIndex);\n }\n\n return chunks;\n }, [chunkedLoading, viewport.viewport, totalChunks]);\n\n // 清除已加载的块\n const clearChunks = useCallback(() => {\n loadedChunksRef.current.clear();\n }, []);\n\n // 清理\n useEffect(() => {\n return () => {\n if (throttleTimerRef.current) {\n window.clearTimeout(throttleTimerRef.current);\n }\n };\n }, []);\n\n return {\n isVirtualized,\n viewport,\n updateViewport,\n throttledUpdateViewport,\n isInZoomRange,\n shouldSimplify,\n loadedChunks: loadedChunksRef.current,\n totalChunks,\n getVisibleChunks,\n clearChunks,\n };\n}\n","/**\n * 同构布局效果 Hook\n * @description 在 SSR 环境下使用 useEffect,在客户端使用 useLayoutEffect\n * @since 1.4.0\n */\n\nimport { useEffect, useLayoutEffect } from 'react';\n\n/**\n * 同构布局效果 Hook\n * @description 解决 SSR 环境下 useLayoutEffect 的警告\n *\n * @example\n * ```tsx\n * import { useIsomorphicLayoutEffect } from '@wenle_2523097/agri-map';\n *\n * function Component() {\n * useIsomorphicLayoutEffect(() => {\n * // 在客户端同步执行,在 SSR 环境下异步执行\n * const element = document.querySelector('.my-element');\n * // ...\n * }, []);\n *\n * return <div className=\"my-element\">...</div>;\n * }\n * ```\n */\nexport const useIsomorphicLayoutEffect =\n typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport default useIsomorphicLayoutEffect;\n","/**\n * 基础类型定义\n */\n\n/**\n * 坐标点\n * @description 纬度和经度组成的元组 [lat, lng]\n * @example [30.0, 120.0]\n */\nexport type Coordinate = [number, number];\n\n/**\n * 坐标数组类型\n * @description 二维坐标数组 [[lat,lng],...] 或三维坐标数组 [[[lat,lng],...], [孔洞], ...]\n */\nexport type Positions2D = Coordinate[];\nexport type Positions3D = Coordinate[][];\n\n/**\n * 边界坐标类型\n * @description 地块边界的坐标数组格式\n * - Positions2D: 二维数组 [[lat,lng],...],表示单环多边形(无孔洞)\n * - Positions3D: 三维数组 [[[lat,lng],...], [孔洞1], ...],表示带孔洞的多边形\n */\nexport type Boundaries = Positions2D | Positions3D;\n\n/**\n * 边界框类型\n * @description [minLat, minLng, maxLat, maxLng]\n */\nexport type BBox = [number, number, number, number];\n\n/**\n * 判断坐标数组是否为三维数组(GeoJSON 格式:[[外环], [孔洞1], ...])\n * @param positions 待检测的坐标数组\n * @returns true 表示三维数组,false 表示二维数组或无效\n */\nexport function is3DPositions(positions: unknown): positions is Positions3D {\n if (!Array.isArray(positions) || positions.length === 0) return false;\n const first = positions[0];\n return Array.isArray(first) && first.length > 0 && Array.isArray(first[0]);\n}\n\n/**\n * 边界框\n * @description 地图边界范围 [南纬, 西经, 北纬, 东经]\n * @example [29.9, 119.9, 30.1, 120.1]\n */\nexport type BoundingBox = [number, number, number, number];\n\n/**\n * 路径样式选项\n * @description 用于配置线条、多边形等图形的样式\n */\nexport interface PathOptions {\n /** 边框颜色 */\n color?: string;\n /** 填充颜色 */\n fillColor?: string;\n /** 边框宽度(像素) */\n weight?: number;\n /** 边框透明度 (0-1) */\n opacity?: number;\n /** 填充透明度 (0-1) */\n fillOpacity?: number;\n /** 虚线模式,如 '5, 10' 或 [5, 10] */\n dashArray?: string | number[];\n /** 自定义 CSS 类名 */\n className?: string;\n /** 顶点边框颜色(编辑模式下顶点标记的边框颜色) */\n vertexBorderColor?: string;\n /** 顶点背景填充颜色(编辑模式下顶点标记的填充颜色) */\n vertexFillColor?: string;\n /** 顶点背景透明度(编辑模式下顶点标记的透明度,0-1) */\n vertexFillOpacity?: number;\n}\n\n/**\n * 折线样式选项\n * @description 用于道路、灌溉渠等线状要素的描边和填充样式\n */\nexport interface PolylineOptions {\n /** Stroke(描边)颜色 */\n color?: string;\n /** Stroke(描边)宽度,单位:像素 */\n weight?: number;\n /** Stroke(描边)的不透明度 */\n opacity?: number;\n /** 顶点边框颜色(编辑模式下顶点标记的边框颜色) */\n vertexBorderColor?: string;\n /** 顶点填充颜色(编辑模式下顶点标记的填充颜色) */\n vertexFillColor?: string;\n /** 顶点填充透明度(编辑模式下顶点标记的透明度,0-1) */\n vertexFillOpacity?: number;\n /** 自定义 CSS 类名,仅适用于 SVG 渲染器 */\n className?: string;\n}\n\n/**\n * 地块类型\n * @description 农业地块的分类类型\n */\nexport type PlotType =\n | 'farmland'\n | 'vegetable'\n | 'orchard'\n | 'forest'\n | 'grassland'\n | 'paddy'\n | 'greenhouse';\n\n/**\n * 地块状态\n * @description 地块的当前耕作状态\n */\nexport type PlotStatus = 'cultivating' | 'fallow' | 'harvesting' | 'planting' | 'irrigating';\n","/**\n * BoxZoom 矩形选区 Hook\n * @description 处理 Shift+拖拽绘制矩形选区功能,仅在 PlotLayer 多选模式下启用\n * @module hooks/useBoxZoomSelection\n */\n\nimport { useEffect } from 'react';\nimport L from 'leaflet';\nimport type { PlotData, PlotFieldNames, Coordinate } from '../types';\nimport { is3DPositions } from '../types/basic';\nimport { useLatestRef } from './useLatestRef';\n\ninterface UseBoxZoomSelectionOptions {\n /** Leaflet 地图实例 */\n map: L.Map | null;\n /** 地块数据源 */\n dataSource: PlotData[];\n /** 字段名映射 */\n fieldNames?: Partial<PlotFieldNames>;\n /** 是否启用(仅多选模式启用) */\n enabled: boolean;\n /** 选区变化回调 */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onSelectionChange?: (...args: any[]) => void;\n /** 设置内部选中状态(PlotLayer 内部使用) */\n setInternalSelectedIds: React.Dispatch<React.SetStateAction<(string | number)[]>>;\n}\n\n/**\n * 判断坐标点是否在边界内\n */\nfunction isCoordinateInBounds(coord: Coordinate, bounds: L.LatLngBounds): boolean {\n const [lat, lng] = coord;\n return bounds.contains(L.latLng(lat, lng));\n}\n\n/**\n * 判断地块是否与边界相交(任意顶点在边界内即选中)\n */\nfunction isPlotInBounds(plot: PlotData, bounds: L.LatLngBounds): boolean {\n const positions = plot.positions;\n if (!positions) return false;\n\n // 支持二维 [[lat,lng],...] 和三维 [[[lat,lng],...], [孔洞], ...]\n const rings = is3DPositions(positions) ? positions : [positions];\n\n for (const ring of rings) {\n for (const coord of ring) {\n if (isCoordinateInBounds(coord, bounds)) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * BoxZoom 矩形选区 Hook\n * @description 在 Shift+拖拽绘制矩形时,选中边界内的所有地块\n *\n * @example\n * ```tsx\n * useBoxZoomSelection({\n * map,\n * dataSource: normalizedDataSource,\n * fieldNames: { id: 'id', positions: 'positions' },\n * enabled: mode === 'multiple',\n * setInternalSelectedIds,\n * });\n * ```\n */\nexport function useBoxZoomSelection(options: UseBoxZoomSelectionOptions) {\n const {\n map,\n dataSource,\n fieldNames: _fieldNames = {},\n enabled,\n onSelectionChange,\n setInternalSelectedIds,\n } = options;\n\n const enabledRef = useLatestRef(enabled);\n const dataSourceRef = useLatestRef(dataSource);\n const setInternalSelectedIdsRef = useLatestRef(setInternalSelectedIds);\n const onSelectionChangeRef = useLatestRef(onSelectionChange);\n\n useEffect(() => {\n if (!map || !enabledRef.current) return;\n\n const handleBoxZoomEnd = (e: L.LeafletEvent) => {\n const boxZoomEvent = e as L.LeafletEvent & { boxZoomBounds?: L.LatLngBounds };\n const bounds = boxZoomEvent.boxZoomBounds as L.LatLngBounds | undefined;\n\n if (!bounds) return;\n\n // 筛选边界内的地块\n const selectedIds = dataSourceRef.current\n .filter(plot => isPlotInBounds(plot, bounds))\n .map(plot => plot.id);\n setInternalSelectedIdsRef.current(selectedIds);\n\n // 触发回调\n if (onSelectionChangeRef.current) {\n onSelectionChangeRef.current(selectedIds, bounds);\n }\n };\n\n map.on('boxzoomend', handleBoxZoomEnd);\n\n return () => {\n map.off('boxzoomend', handleBoxZoomEnd);\n };\n }, [map, enabledRef, dataSourceRef, setInternalSelectedIdsRef, onSelectionChangeRef]);\n}\n\nexport default useBoxZoomSelection;\n","/**\n * 通用常量定义\n * @description 提取组件库中的魔法数字为命名常量\n *\n * 本模块集中管理所有硬编码的魔法数字,便于统一维护和调整。\n * 所有常量均使用有意义的命名,并在注释中说明用途和默认值来源。\n *\n * @packageDocumentation\n */\n\n/** 空间索引默认单元格大小(经纬度单位),约 1km */\nexport const SPATIAL_INDEX_DEFAULT_CELL_SIZE = 0.01;\n\n/** 轨迹冗余点过滤默认容差(米),用于移除 GPS 漂移产生的重复点 */\nexport const TRACK_DEFAULT_DUPLICATE_TOLERANCE = 0.5;\n\n/** 轨迹简化默认容差(经纬度单位),Douglas-Peucker 算法参数 */\nexport const TRACK_DEFAULT_SIMPLIFY_TOLERANCE = 0.0001;\n\n/** Marker 模式默认缩放阈值,低于此级别显示 Marker 而非轨迹线 */\nexport const TRACK_DEFAULT_MARKER_ZOOM_THRESHOLD = 14;\n\n/** Marker 模式默认目标缩放级别,点击 Marker 后飞行的目标级别 */\nexport const TRACK_DEFAULT_MARKER_ZOOM_TO_LEVEL = 16;\n\n/** 聚合默认半径(像素),supercluster 聚合气泡半径 */\nexport const CLUSTER_DEFAULT_RADIUS = 40;\n\n/** 聚合默认最大缩放级别,超过此级别不再聚合 */\nexport const CLUSTER_DEFAULT_MAX_ZOOM = 14;\n\n/** 聚合默认最小点数,达到此数量才触发聚合 */\nexport const CLUSTER_DEFAULT_MIN_POINTS = 2;\n\n/** 地图动画默认 padding,fitBounds 操作的内边距 [x, y] */\nexport const MAP_FIT_BOUNDS_DEFAULT_PADDING: [number, number] = [40, 40];\n\n/** 默认编辑距离容差(像素),编辑模式下的吸附距离 */\nexport const EDIT_DEFAULT_SNAP_DISTANCE = 20;\n\n/** 默认图标尺寸 [width, height] */\nexport const ICON_DEFAULT_SIZE: [number, number] = [24, 24];\n\n/** 默认脉冲图标动画启用 */\nexport const PULSE_ICON_DEFAULT_ANIMATED = true;\n\n/** 加载动画默认持续时间(毫秒) */\nexport const LOADING_DEFAULT_DURATION = 300;\n\n/** 性能监控默认采样率 */\nexport const PERFORMANCE_DEFAULT_SAMPLING_RATE = 100;\n\n/** 默认虚拟化最小缩放级别,低于此级别不渲染 */\nexport const VIRTUALIZATION_DEFAULT_MIN_ZOOM = 10;\n\n/** 默认虚拟化最大缩放级别,高于此级别不渲染 */\nexport const VIRTUALIZATION_DEFAULT_MAX_ZOOM = 18;\n\n/** 默认 Tooltip 偏移 [x, y],用于 Marker 提示框定位 */\nexport const TOOLTIP_DEFAULT_OFFSET: [number, number] = [0, -48];\n\n/** 默认起点/终点图标尺寸 [width, height] */\nexport const START_END_ICON_DEFAULT_SIZE: [number, number] = [24, 24];\n\n/** 默认选中放大倍数,选中状态下的图标/标记缩放比例 */\nexport const SELECTED_SCALE_FACTOR = 1.5;\n\n/** 默认光晕线宽,未选中状态下的外圈光晕宽度 */\nexport const HALO_STROKE_WIDTH = 2;\n\n/** 默认选中光晕线宽,选中状态下的外圈光晕宽度 */\nexport const SELECTED_HALO_STROKE_WIDTH = 3;\n\n// ========== 性能优化相关常量 ==========\n\n/** 视口防抖默认延迟(毫秒)- zoom 事件 */\nexport const VIEWPORT_ZOOM_DEBOUNCE_DELAY = 100;\n\n/** 视口防抖默认延迟(毫秒)- move 事件 */\nexport const VIEWPORT_MOVE_DEBOUNCE_DELAY = 150;\n\n/** 增量更新默认批量大小 */\nexport const INCREMENTAL_UPDATE_BATCH_SIZE = 100;\n\n/** RAF 节流默认间隔(毫秒) */\nexport const RAF_THROTTLE_DEFAULT_INTERVAL = 16;\n\n/** 批量更新默认间隔(毫秒) */\nexport const BATCH_UPDATE_DEFAULT_INTERVAL = 100;\n\n/** Web Worker 超时时间(毫秒) */\nexport const WORKER_DEFAULT_TIMEOUT = 30000;\n\n// ========== 数据验证相关常量 ==========\n\n/** 有效纬度范围 */\nexport const LATITUDE_RANGE = { min: -90, max: 90 } as const;\n\n/** 有效经度范围 */\nexport const LONGITUDE_RANGE = { min: -180, max: 180 } as const;\n\n/** 默认最小坐标点数量 - 多边形 */\nexport const MIN_POLYGON_POINTS = 3;\n\n/** 默认最小坐标点数量 - 折线 */\nexport const MIN_POLYLINE_POINTS = 2;\n\n/** 默认最小坐标点数量 - 点 */\nexport const MIN_POINT_COUNT = 1;\n\n// ========== 缓存相关常量 ==========\n\n/** LRU 缓存默认大小 */\nexport const LRU_CACHE_DEFAULT_SIZE = 100;\n\n/** 样式缓存默认大小 */\nexport const STYLE_CACHE_DEFAULT_SIZE = 500;\n\n/** 图标缓存默认大小 */\nexport const ICON_CACHE_DEFAULT_SIZE = 50;\n\n// ========== 聚合相关常量 ==========\n\n/** 聚合点击展开模式 */\nexport const CLUSTER_CLICK_BEHAVIOR = {\n ZOOM: 'zoom',\n EXPAND: 'expand',\n} as const;\n\n/** 聚合默认点击行为 */\nexport const CLUSTER_DEFAULT_CLICK_BEHAVIOR = CLUSTER_CLICK_BEHAVIOR.ZOOM;\n","/**\n * 统一地图边界适配 Hook\n * @description 提供统一的 fitBounds 方法,自动适配所有图层或指定图层数据\n * @since 2.1.0\n *\n * @example\n * ```tsx\n * // 基础用法:适配所有已注册图层\n * const { fitBounds } = useUnifiedFitBounds();\n * <button onClick={() => fitBounds()}>适配全部</button>\n *\n * // 指定图层类型\n * <button onClick={() => fitBounds({ include: ['marker', 'plot'] })}>\n * 只适配标注和地块\n * </button>\n *\n * // 直接传入数据源\n * <button onClick={() => fitBounds({ data: { markers: markerData } })}>\n * 适配指定数据\n * </button>\n * ```\n */\n\nimport { useCallback } from 'react';\nimport L from 'leaflet';\nimport { useMap } from '../context/MapContext';\nimport { computeDataBounds } from '../utils/area';\nimport { MAP_FIT_BOUNDS_DEFAULT_PADDING } from '../constants/common';\n\n// ========== 类型定义 ==========\n\n/** 支持的图层类型 */\nexport type FitBoundsLayerType = 'marker' | 'plot' | 'road' | 'irrigation' | 'track';\n\n/** fitBounds 选项 */\nexport interface UnifiedFitBoundsOptions {\n /** 要包含的图层类型(默认全部) */\n include?: FitBoundsLayerType[];\n /** 要排除的图层类型 */\n exclude?: FitBoundsLayerType[];\n /** 直接传入数据源(优先级高于自动收集) */\n data?: {\n markers?: { position: [number, number] }[];\n plots?: { positions: [number, number][] | [number, number][][] }[];\n roads?: { points: [number, number][] }[];\n irrigations?: { points: [number, number][] }[];\n tracks?: { segments: { coordinates: [number, number][] }[] }[];\n };\n /** 最大缩放级别 */\n maxZoom?: number;\n /** 边距 */\n padding?: number | [number, number];\n /** 是否启用动画 */\n animate?: boolean;\n}\n\n/** 数据获取器类型 */\ntype DataGetter<T = unknown> = () => T[] | null;\n\n/** 图层注册接口 */\nexport interface LayerRegistry {\n /** 注册图层数据获取函数(返回注销函数) */\n register: <T = unknown>(type: FitBoundsLayerType, getData: DataGetter<T>) => () => void;\n /** 注销指定类型的所有数据获取器 */\n unregister: (type: FitBoundsLayerType) => void;\n}\n\n// ========== 全局注册表 ==========\n\nlet nextRegistryId = 0;\nconst layerRegistry = new Map<FitBoundsLayerType, Map<string, DataGetter>>();\n\nexport const registry: LayerRegistry = {\n register: (type, getData) => {\n const id = `${type}_${nextRegistryId++}`;\n if (!layerRegistry.has(type)) {\n layerRegistry.set(type, new Map());\n }\n layerRegistry.get(type)!.set(id, getData);\n // 返回注销函数\n return () => {\n layerRegistry.get(type)?.delete(id);\n };\n },\n unregister: type => {\n layerRegistry.delete(type);\n },\n};\n\n// ========== Hook 实现 ==========\n\n/**\n * 统一地图边界适配 Hook\n * @returns fitBounds 函数和图层注册工具\n */\nexport function useUnifiedFitBounds() {\n const map = useMap();\n\n const fitBounds = useCallback(\n (options?: UnifiedFitBoundsOptions) => {\n if (!map) return;\n\n const allPoints: L.LatLng[] = [];\n\n // 如果传入了自定义数据,直接使用\n if (options?.data) {\n const { data } = options;\n\n // 处理标注点\n if (data.markers?.length) {\n data.markers.forEach(m => {\n if (m.position) {\n allPoints.push(L.latLng(m.position[0], m.position[1]));\n }\n });\n }\n\n // 处理地块\n if (data.plots?.length) {\n const boundsResult = computeDataBounds(\n data.plots as unknown as Record<string, unknown>[],\n 'positions'\n );\n if (boundsResult) {\n allPoints.push(\n L.latLng(boundsResult.southWest[0], boundsResult.southWest[1]),\n L.latLng(boundsResult.northEast[0], boundsResult.northEast[1])\n );\n }\n }\n\n // 处理道路\n if (data.roads?.length) {\n data.roads.forEach(road => {\n road.points.forEach(p => {\n allPoints.push(L.latLng(p[0], p[1]));\n });\n });\n }\n\n // 处理灌溉渠\n if (data.irrigations?.length) {\n data.irrigations.forEach(ch => {\n ch.points.forEach(p => {\n allPoints.push(L.latLng(p[0], p[1]));\n });\n });\n }\n\n // 处理轨迹\n if (data.tracks?.length) {\n data.tracks.forEach(track => {\n track.segments?.forEach(seg => {\n seg.coordinates?.forEach(c => {\n allPoints.push(L.latLng(c[0], c[1]));\n });\n });\n });\n }\n } else {\n // 否则从全局注册表收集数据\n const include = options?.include || ['marker', 'plot', 'road', 'irrigation', 'track'];\n const exclude = options?.exclude || [];\n\n const activeTypes = include.filter(t => !exclude.includes(t)) as FitBoundsLayerType[];\n\n activeTypes.forEach(type => {\n const getters = layerRegistry.get(type);\n if (!getters) return;\n\n getters.forEach(getData => {\n const data = getData();\n if (!data || data.length === 0) return;\n\n switch (type) {\n case 'marker': {\n (data as { position: [number, number] }[]).forEach(m => {\n if (m.position) {\n allPoints.push(L.latLng(m.position[0], m.position[1]));\n }\n });\n break;\n }\n case 'plot': {\n const boundsResult = computeDataBounds(\n data as unknown as Record<string, unknown>[],\n 'positions'\n );\n if (boundsResult) {\n allPoints.push(\n L.latLng(boundsResult.southWest[0], boundsResult.southWest[1]),\n L.latLng(boundsResult.northEast[0], boundsResult.northEast[1])\n );\n }\n break;\n }\n case 'road': {\n (data as { points: [number, number][] }[]).forEach(road => {\n road.points.forEach(p => {\n allPoints.push(L.latLng(p[0], p[1]));\n });\n });\n break;\n }\n case 'irrigation': {\n (data as { points: [number, number][] }[]).forEach(ch => {\n ch.points.forEach(p => {\n allPoints.push(L.latLng(p[0], p[1]));\n });\n });\n break;\n }\n case 'track': {\n // 支持 ParsedTrack[] 格式(Track 组件的实际数据格式)\n (\n data as {\n allPoints?: { position: [number, number] }[];\n segments?: Record<string, [number, number, number, number, number][]>;\n }[]\n ).forEach(track => {\n // 优先使用 allPoints(已解析的坐标数组)\n if (track.allPoints?.length) {\n track.allPoints.forEach(p => {\n allPoints.push(L.latLng(p.position[0], p.position[1]));\n });\n } else if (track.segments) {\n // 否则从 segments 中提取\n Object.values(track.segments).forEach(segment => {\n segment.forEach(point => {\n allPoints.push(L.latLng(point[0], point[1]));\n });\n });\n }\n });\n break;\n }\n }\n });\n });\n }\n\n // 执行 fitBounds\n if (allPoints.length > 0) {\n const bounds = L.latLngBounds(allPoints);\n map.fitBounds(bounds, {\n maxZoom: options?.maxZoom ?? 18,\n padding:\n typeof options?.padding === 'number'\n ? [options.padding, options.padding]\n : (options?.padding ?? MAP_FIT_BOUNDS_DEFAULT_PADDING),\n animate: options?.animate ?? true,\n });\n }\n },\n [map]\n );\n\n return {\n fitBounds,\n registry,\n };\n}\n\nexport default useUnifiedFitBounds;\n","/**\n * @fileoverview 统一数据源标准化 Hook\n * @description 提供 fieldNames 合并、数据验证、fitBoundsRegistry 注册等公共逻辑\n * @module hooks/useNormalizedDataSource\n */\n\nimport { useMemo, useEffect } from 'react';\nimport type {\n DataSourceValidationConfig,\n ValidationStats,\n MapComponentType,\n} from '../types/dataSource';\nimport type { FitBoundsLayerType } from './useUnifiedFitBounds';\nimport { registry as fitBoundsRegistry } from './useUnifiedFitBounds';\n\n/**\n * 动态数据项类型\n * @description 内部使用,通过 fieldNames 动态访问\n */\nexport type DynamicDataItem = Record<string, unknown>;\n\ninterface UseNormalizedDataSourceOptions<TOutput = unknown> {\n /** 数据源 */\n dataSource: DynamicDataItem[] | undefined;\n /** 默认字段名映射 */\n defaultFieldNames: Record<string, string>;\n /** 自定义字段名映射 */\n fieldNames?: Partial<Record<string, string>>;\n /** 验证配置 */\n validation?: DataSourceValidationConfig;\n /** 组件类型(用于日志和注册) */\n componentType: MapComponentType | string;\n /** 可选的数据映射函数,用于直接输出目标类型 */\n mapper?: (item: DynamicDataItem, fieldNames: Record<string, string>) => TOutput;\n}\n\ninterface UseNormalizedDataSourceResult<TOutput = unknown> {\n /** 标准化后的数据数组(如果提供了 mapper,则为映射后的 TOutput[]) */\n data: TOutput[];\n /** 合并后的字段名映射(默认 + 自定义) */\n fieldNames: Record<string, string>;\n /** 验证结果统计 */\n validation: ValidationStats;\n}\n\n/**\n * 统一的 dataSource 标准化 Hook\n *\n * 功能:\n * 1. 合并 fieldNames(默认 + 自定义)\n * 2. 数据验证(必需字段、坐标范围)\n * 3. 注册到 fitBoundsRegistry\n * 4. 可选的 mapper 进行类型转换\n *\n * 注意:\n * - autoFit 逻辑由各组件自行处理(使用 useAutoFit hook)\n * - dataSource 需要是 DynamicDataItem[](即 Record<string, unknown>[]),由调用方保证\n *\n * @example\n * ```tsx\n * const { data, fieldNames, validation } = useNormalizedDataSource({\n * dataSource: dataSource as DynamicDataItem[],\n * defaultFieldNames: { id: 'id', position: 'position' },\n * fieldNames: { id: 'markerId' },\n * validation: { requiredFields: ['id', 'position'] },\n * componentType: 'Marker',\n * mapper: (item, fn) => ({\n * id: item[fn.id] as string,\n * position: item[fn.position] as [number, number],\n * }),\n * });\n * ```\n */\nexport function useNormalizedDataSource<TOutput = unknown>({\n dataSource,\n defaultFieldNames,\n fieldNames,\n validation,\n componentType,\n mapper,\n}: UseNormalizedDataSourceOptions<TOutput>): UseNormalizedDataSourceResult<TOutput> {\n // 1. 合并 fieldNames\n const mergedFieldNames = useMemo((): Record<string, string> => {\n const result: Record<string, string> = { ...defaultFieldNames };\n // 过滤掉 undefined 值\n if (fieldNames) {\n for (const [key, value] of Object.entries(fieldNames)) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n }\n return result;\n }, [defaultFieldNames, fieldNames]);\n\n // 2. 数据验证\n const { validatedData, validationResult } = useMemo(() => {\n if (!Array.isArray(dataSource)) {\n return {\n validatedData: [] as DynamicDataItem[],\n validationResult: {\n total: 0,\n valid: 0,\n invalid: 0,\n errors: ['dataSource 不是数组'],\n } as ValidationStats,\n };\n }\n\n const errors: string[] = [];\n const validItems: DynamicDataItem[] = [];\n\n dataSource.forEach((item, index) => {\n // 假设数据项有效\n let isValid = true;\n\n // 空值检查\n if (!item) {\n errors.push(`[${index}] 数据项为空`);\n isValid = false;\n }\n\n // 必需字段验证\n if (isValid && validation?.requiredFields) {\n for (const field of validation.requiredFields) {\n // 直接从 item 获取字段值(简单字段名)\n const fieldValue = (item as Record<string, unknown>)[field as string];\n if (fieldValue === undefined || fieldValue === null) {\n errors.push(`[${index}] 缺少必需字段: ${field}`);\n isValid = false;\n break;\n }\n }\n }\n\n // 坐标验证\n if (isValid && validation?.coordinateFields && validation?.coordinateBounds) {\n for (const field of validation.coordinateFields) {\n const coord = (item as Record<string, unknown>)[field as string] as\n | [number, number]\n | undefined;\n if (coord && Array.isArray(coord) && coord.length >= 2) {\n const [lat, lng] = coord;\n const bounds = validation.coordinateBounds;\n\n if (bounds.lat && (lat < bounds.lat.min || lat > bounds.lat.max)) {\n errors.push(`[${index}] ${field}[0] 超出范围 [${bounds.lat.min}, ${bounds.lat.max}]`);\n isValid = false;\n }\n if (bounds.lng && (lng < bounds.lng.min || lng > bounds.lng.max)) {\n errors.push(`[${index}] ${field}[1] 超出范围 [${bounds.lng.min}, ${bounds.lng.max}]`);\n isValid = false;\n }\n }\n }\n }\n\n // 自定义验证函数\n if (isValid && validation?.customValidator) {\n const customResult = validation.customValidator(item as Record<string, unknown>, index);\n if (!customResult.valid && customResult.errors) {\n errors.push(...customResult.errors);\n isValid = false;\n }\n }\n\n // 只有通过所有验证才添加到有效列表\n if (isValid) {\n validItems.push(item as DynamicDataItem);\n }\n });\n\n return {\n validatedData: validItems,\n validationResult: {\n total: dataSource.length,\n valid: validItems.length,\n invalid: dataSource.length - validItems.length,\n errors,\n },\n };\n }, [dataSource, validation]);\n\n // 3. 如果提供了 mapper,对数据进行映射\n const mappedData = useMemo((): TOutput[] => {\n if (!mapper) {\n return validatedData as unknown as TOutput[];\n }\n return validatedData.map(item => mapper(item, mergedFieldNames));\n }, [validatedData, mergedFieldNames, mapper]);\n\n // 4. 注册到 fitBoundsRegistry\n useEffect(() => {\n if (!componentType) return;\n // 安全的类型转换:确保 componentType 是有效的 FitBoundsLayerType\n const layerType = componentType as FitBoundsLayerType;\n const unregister = fitBoundsRegistry.register(layerType, () => mappedData);\n return unregister;\n }, [componentType, mappedData]);\n\n return {\n data: mappedData,\n fieldNames: mergedFieldNames,\n validation: validationResult,\n };\n}\n\n/**\n * 快速创建 Marker 数据源标准化配置的辅助函数\n */\nexport function createMarkerValidationConfig() {\n return {\n requiredFields: ['id', 'position'],\n coordinateFields: ['position'],\n coordinateBounds: {\n lat: { min: -90, max: 90 },\n lng: { min: -180, max: 180 },\n },\n };\n}\n\n/**\n * 快速创建 Road 数据源标准化配置的辅助函数\n */\nexport function createRoadValidationConfig() {\n return {\n requiredFields: ['id', 'points'],\n coordinateFields: ['points'],\n coordinateBounds: {\n lat: { min: -90, max: 90 },\n lng: { min: -180, max: 180 },\n },\n };\n}\n\n/**\n * 快速创建 Irrigation 数据源标准化配置的辅助函数\n */\nexport function createIrrigationValidationConfig() {\n return {\n requiredFields: ['id', 'points'],\n coordinateFields: ['points'],\n coordinateBounds: {\n lat: { min: -90, max: 90 },\n lng: { min: -180, max: 180 },\n },\n };\n}\n\n/**\n * 快速创建 Plot 数据源标准化配置的辅助函数\n */\nexport function createPlotValidationConfig() {\n return {\n requiredFields: ['id'],\n // Plot 的 positions 验证较复杂,由各组件自行处理\n };\n}\n","/**\n * @fileoverview 数据标准化 Hook\n * @description 专门处理数据映射逻辑,与 useNormalizedDataSource 配合使用\n * @module hooks/useDataNormalizer\n */\n\nimport { useMemo } from 'react';\n\nexport interface UseDataNormalizerOptions<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = TInput,\n> {\n /** 原始数据源 */\n dataSource: TInput[] | undefined;\n /** 合并后的字段名映射 */\n fieldNames: Record<string, string>;\n /** 数据提取映射函数 */\n extract: (item: TInput, fieldNames: Record<string, string>) => TOutput;\n /** 验证函数,返回 true 表示有效 */\n validate?: (item: TOutput, index: number) => boolean;\n}\n\nexport interface UseDataNormalizerResult<TOutput> {\n /** 标准化后的数据数组 */\n data: TOutput[];\n /** 数据总数 */\n total: number;\n /** 有效数据数量 */\n validCount: number;\n /** 无效数据数量 */\n invalidCount: number;\n}\n\n/**\n * 数据标准化 Hook\n *\n * 专门处理数据映射逻辑,将原始数据转换为目标类型。\n * 通常与 useNormalizedDataSource 配合使用。\n *\n * @example\n * ```tsx\n * const { fieldNames } = useNormalizedDataSource({\n * dataSource,\n * defaultFieldNames: DEFAULT_FIELD_NAMES,\n * fieldNames,\n * componentType: 'marker',\n * });\n *\n * const { data: normalizedData } = useDataNormalizer({\n * dataSource: dataSource as unknown as Record<string, unknown>[],\n * fieldNames,\n * extract: (item, fn) => ({\n * id: item[fn.id] as string,\n * position: item[fn.position] as [number, number],\n * title: item[fn.title] as string | undefined,\n * }),\n * validate: (item) => item.id != null && item.position != null,\n * });\n * ```\n */\nexport function useDataNormalizer<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = TInput,\n>({\n dataSource,\n fieldNames,\n extract,\n validate,\n}: UseDataNormalizerOptions<TInput, TOutput>): UseDataNormalizerResult<TOutput> {\n return useMemo(() => {\n if (!Array.isArray(dataSource)) {\n return {\n data: [],\n total: 0,\n validCount: 0,\n invalidCount: 0,\n };\n }\n\n const result: TOutput[] = [];\n let validCount = 0;\n let invalidCount = 0;\n\n for (let i = 0; i < dataSource.length; i++) {\n const item = dataSource[i];\n if (!item) {\n invalidCount++;\n continue;\n }\n\n try {\n const mapped = extract(item as TInput, fieldNames);\n\n if (validate && !validate(mapped, i)) {\n invalidCount++;\n continue;\n }\n\n result.push(mapped);\n validCount++;\n } catch {\n invalidCount++;\n }\n }\n\n return {\n data: result,\n total: dataSource.length,\n validCount,\n invalidCount,\n };\n }, [dataSource, fieldNames, extract, validate]);\n}\n\n/**\n * 快速创建坐标验证函数\n */\nexport function createCoordinateValidator(\n coordField: string,\n bounds?: { lat?: { min: number; max: number }; lng?: { min: number; max: number } }\n) {\n return function validateCoordinate(\n item: Record<string, unknown>,\n fieldNames: Record<string, string>\n ): boolean {\n const coord = item[fieldNames[coordField]] as [number, number] | undefined;\n if (!coord || !Array.isArray(coord) || coord.length < 2) {\n return false;\n }\n const [lat, lng] = coord;\n if (typeof lat !== 'number' || typeof lng !== 'number') {\n return false;\n }\n if (bounds?.lat && (lat < bounds.lat.min || lat > bounds.lat.max)) {\n return false;\n }\n if (bounds?.lng && (lng < bounds.lng.min || lng > bounds.lng.max)) {\n return false;\n }\n return true;\n };\n}\n","/**\n * @fileoverview 自动适配地图视野 Hook\n * @description 统一处理 autoFit 逻辑,消除组件内重复代码\n * @module hooks/useAutoFit\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport L from 'leaflet';\nimport type { Coordinate } from '../types';\n\nexport interface AutoFitOptions {\n maxZoom?: number;\n padding?: number | [number, number];\n}\n\nexport type AutoFitConfig = boolean | AutoFitOptions;\n\nexport interface UseAutoFitOptions<T> {\n /** 数据数组 */\n data: T[];\n /** Leaflet 地图实例 */\n map: L.Map | null;\n /** autoFit 配置:false=禁用,true=启用,object=带选项 */\n autoFit?: AutoFitConfig;\n /** 从数据项提取坐标的函数 */\n getCoordinates: (item: T) => Coordinate[];\n}\n\ninterface UseAutoFitResult {\n /** 手动触发 fitBounds(重置后执行) */\n triggerFit: () => void;\n /** 是否已执行过 fitBounds */\n hasFitted: boolean;\n}\n\n/**\n * 自动适配地图视野 Hook\n *\n * 统一处理 autoFit 逻辑,支持不同的数据结构和坐标提取方式。\n *\n * @example\n * ```tsx\n * // Marker 场景\n * const { triggerFit } = useAutoFit({\n * data: normalizedData,\n * map,\n * autoFit,\n * getCoordinates: (item) => [item.position],\n * });\n *\n * // Road/Irrigation 场景\n * const { triggerFit } = useAutoFit({\n * data: normalizedData,\n * map,\n * autoFit,\n * getCoordinates: (item) => item.points,\n * });\n * ```\n */\nexport function useAutoFit<T>({\n data,\n map,\n autoFit,\n getCoordinates,\n}: UseAutoFitOptions<T>): UseAutoFitResult {\n const hasFittedRef = useRef(false);\n\n useEffect(() => {\n if (autoFit === false || hasFittedRef.current || !map || data.length === 0) {\n return;\n }\n\n hasFittedRef.current = true;\n\n // 提取所有坐标\n const allCoords: L.LatLngExpression[] = [];\n for (const item of data) {\n const coords = getCoordinates(item);\n for (const coord of coords) {\n allCoords.push([coord[0], coord[1]]);\n }\n }\n\n if (allCoords.length === 0) return;\n\n const bounds = L.latLngBounds(allCoords);\n if (!bounds.isValid()) return;\n\n const options = typeof autoFit === 'object' ? autoFit : {};\n const padding: [number, number] = Array.isArray(options.padding)\n ? options.padding\n : ((options.padding ?? [50, 50]) as [number, number]);\n const maxZoom = options.maxZoom ?? 18;\n\n map.fitBounds(bounds, { padding, maxZoom });\n }, [map, data, autoFit, getCoordinates]);\n\n const triggerFit = useCallback(() => {\n hasFittedRef.current = false;\n }, []);\n\n return {\n triggerFit,\n hasFitted: hasFittedRef.current,\n };\n}\n\n/**\n * 快捷创建 Marker 坐标提取函数\n */\nexport function createMarkerCoordinateGetter<T extends { position: Coordinate }>() {\n return function getMarkerCoords(item: T): Coordinate[] {\n return [item.position];\n };\n}\n\n/**\n * 快捷创建 Polyline(Road/Irrigation)坐标提取函数\n */\nexport function createPolylineCoordinateGetter<T extends { points: Coordinate[] }>() {\n return function getPolylineCoords(item: T): Coordinate[] {\n return item.points;\n };\n}\n"],"names":["useLatestRef","value","ref","useRef","useEffect","current","useSyncRef","useAutoSyncRef","initialValue","_useState","useState","_useState2","_slicedToArray","_setValue","useMapLifecycle","options","map","lifecycle","isReady","hasReadyFired","prevViewportRef","rafIdRef","_lifecycle$onMapReady","onMapReady","call","onViewportChange","handleViewportChange","_triggerEvent","requestAnimationFrame","center","getCenter","zoom","getZoom","bounds","getBounds","prev","hasChanged","Math","abs","lat","lng","_lifecycle$onViewport","on","cancelAnimationFrame","off","MapContext","createContext","mapRef","displayName","useMap","_useContext","useContext","MapProvider","_ref","children","_ref$options","onReady","style","className","_ref$destroyOnUnmount","destroyOnUnmount","containerRef","setIsReady","onReadyRef","lifecycleRef","effectiveZoom","_options$zoomControl","_options$attributionC","mapOptions","zoomControl","attributionControl","crs","undefined","maxZoom","minZoom","scrollWheelZoom","maxBounds","layers","preferCanvas","L","_onReadyRef$current","remove","contextValue","useMemo","_jsx","Provider","_objectSpread","position","JSON","stringify","ThemeContext","theme","setTheme","isDark","useTheme","ConfigContext","useConfig","FILTER_CONTAINER_ID","DARK_FILTER_ID","svgFilterInjected","ensureDarkFilterInjected","document","getElementById","svgFilters","createElementNS","setAttribute","defs","darkFilter","colorMatrix","componentTransfer","feFuncR","feFuncG","feFuncB","feFuncA","appendChild","body","LAYER_TYPES","VECTOR","SATELLITE","TERRAIN","LAYER_LABELS","_defineProperty","LAYER_URLS","base","annotation","TianDiTuLayer","memo","apiKey","_ref$showAnnotation","showAnnotation","_ref$layerType","layerType","layerTypeProp","tileUrl","annotationUrl","overlayUrl","subdomains","_maxZoom","_minZoom","_ref$attribution","attribution","themeProp","_ref$showLayerSelecto","showLayerSelector","onLayerTypeChange","config","currentLayerType","setCurrentLayerType","_useState3","_useState4","selectorVisible","setSelectorVisible","baseLayerRef","annotationLayerRef","overlayLayerRef","handleLayerChange","useCallback","type","isDarkTheme","mapContainer","getContainer","removeAttribute","baseLayer","tileLayer","addTo","annotationLayer","useCustomUrl","layerConfig","url","replace","setUrl","overlayLayer","concat","LayerSelector","_jsxs","onClick","_Fragment","createPortal","hexToRgba","hex","length","r","parseInt","slice","g","b","a","toFixed","DualScaleControl","configProp","scaleColorProp","scaleColor","controlBgProp","controlBg","controlTextProp","controlText","configContext","getConfig","_config$metric","_config$imperial","metric","imperial","shouldShow","contextConfig","dualScaleControl","finalConfig","_getConfig","scaleRef","textRef","mapInstance","animationFrameId","isCleanup","existingContainers","querySelectorAll","forEach","el","container","DomUtil","create","scale","textEl","getControlColors","bg","text","isSatelliteLight","isTerrainDark","needDarkControl","_getControlColors","backgroundColor","color","setProperty","getRoundNum","distance","isFinite","exponent","floor","log","LN10","fraction","pow","roundedFraction","getCandidateMeters","targetMeters","filter","m","update","isDestroyed","mapAny","_loaded","_mapPane","contains","_unused","mapSize","getSize","west","getWest","east","getEast","centerLat","point1","latLng","point2","maxMeters","metersPerPixel","x","targetPixels","candidates","bestMeters","bestDiff","Infinity","meters","pixels","diff","tickInterval","max","min","round","displayDistance","displayText","getMetricText","getImperialText","textContent","feet","safeUpdate","removeChild","MapSizeHandler","arguments","_ref$enabled","enabled","_ref$delay","delay","_ref$retries","retries","initialized","timers","Array","from","_","i","setTimeout","invalidateSize","clearTimeout","ZoomControl","_ref$position","zoomControlRef","zoomLevelRef","controlColors","existingControls","layerSelector","querySelector","hasLayerSelector","checkVisibility","positionStyles","topleft","top","left","bottom","right","topright","bottomleft","bottomright","Object","assign","zoomIn","innerHTML","title","zoomLevel","zoomOut","DomEvent","e","stopPropagation","preventDefault","updateZoomLevel","String","layerSelectorObserver","MutationObserver","isVisible","observe","attributes","attributeFilter","subtree","disconnect","noop","FullscreenControl","fullscreenControlRef","fullscreenControl","zIndex","display","alignItems","justifyContent","width","height","borderRadius","cursor","boxShadow","transition","addEventListener","iconContainer","renderIcon","isFullscreen","isCurrentlyFullscreen","fullscreenElement","handleFullscreenChange","handleClick","_mapContainer$request","requestFullscreen","catch","err","console","error","_document$exitFullscr","_document","exitFullscreen","removeEventListener","generateLoadingSpinnerSvg","animated","rotateAnim","generateLoadingDotsSvg","dotRadius","spacing","centerX","centerY","colors","dots","bounceAnim","push","join","DEFAULT_ICON_GROUPS","label","icons","name","_i","_DEFAULT_ICON_GROUPS","group","_iterator","_createForOfIteratorHelper","_step","s","n","done","icon","f","LOADING_DEFAULT_MASK_BACKGROUND","LOADING_DEFAULT_MASK_ZINDEX","Loading","_ref$icon","description","_ref$size","size","mask","iconSize","sizeMap","small","default","large","maskConfig","_mask$enabled","background","svgContent","content","flexDirection","gap","dangerouslySetInnerHTML","__html","fontSize","_maskConfig$zIndex","pointerEvents","getDualScaleControlConfig","getMapSizeHandlerConfig","getZoomControlConfig","getFullscreenControlConfig","MapContainer","_ref$zoom","_ref$radius","radius","_ref$maxZoom","_ref$scrollWheelZoom","_ref$zoomControl","_ref$attributionContr","whenReady","tianDiTuLayer","mapSizeHandler","loading","fullscreen","_useTheme","globalTheme","mergedStyle","defaultStyle","dualScaleConfig","mapSizeConfig","zoomControlConfig","fullscreenConfig","configValue","tianDiTuLayerValue","_typeof","THEME_CONFIG","light","primaryColor","borderColor","shadowColor","dark","getThemeColors","useLifecycle","componentType","dataSource","currentState","prevState","isRendered","renderStats","isMounted","hasRendered","prevStatusRef","dataLengthRef","dataSourceRef","renderStatsRef","_lifecycleRef$current","_lifecycleRef$current2","shouldContinue","onBeforeMount","warn","_lifecycleRef$current5","_lifecycleRef$current6","_lifecycleRef$current3","_lifecycleRef$current4","onFirstRender","totalCount","renderedCount","virtualized","prevStatus","stateChanged","mode","plotId","action","roadId","irrigationId","markerId","_lifecycleRef$current7","_lifecycleRef$current8","onStateChange","_lifecycleRef$current9","_lifecycleRef$current0","onBeforeUnmount","useEditMode","editModeProp","defaultButtons","editEnabled","enabledButtons","_toConsumableArray","isArray","toolbar","iconOnly","customToolbar","usePolylineRenderer","normalizedData","currentMode","renderItem","layerGroupRef","layerByIdRef","editingLayerRef","deps","isUnmountedRef","prevDataRef","dataChanged","currentMap","removeLayer","renderItems","layerGroup","item","index","usePolylineEditor","mapInput","_options$pmEventsEnab","pmEventsEnabled","onDrawnLayer","pmCreateGuard","setCurrentMode","tempPoints","setTempPoints","pendingCreateRef","originalPointsRef","currentModeRef","onDrawnLayerRef","pmCreateGuardRef","handleCancel","pm","_map$pm$globalEditMod","_map$pm","disableDraw","globalEditModeEnabled","disableGlobalEditMode","handleCancelRef","handleKeyDown","key","window","prevNormalizedDataRef","handleCreate","pmEvent","drawnLayer","layer","latlngs","getLatLngs","coords","ll","handleChange","first","usePolylineSave","onCreateSave","onEditSave","onCreateSaveRef","onEditSaveRef","handleSave","newPoints","_editingLayerRef$curr","_editingLayerRef$curr2","disable","_map$pm$globalEditMod2","_map$pm2","useLoadingOverlay","loadingMask","_options$icon","_options$size","_loadingMask$zIndex","maskEnabled","maskBackground","maskZIndex","shallowEqual","keysA","keys","keysB","_keysA","deepEqual","every","_i2","_keysA2","includes","useMemoCompare","compute","equal","computed","useShallowCompare","useDeepCompare","useCallbackRef","callback","_ref$current","_len","args","_key","apply","useLazyRef","init","defaultLogConfig","process","minLevel","prefix","currentLogConfig","level","componentName","message","_console","_console2","_console3","_console4","levels","minLevelIndex","indexOf","currentLevelIndex","debug","info","logger","component","_len2","_key2","_len3","_key3","_len4","_key4","_len5","_key5","usePerformanceMonitor","_config$enabled","_config$reportToServi","reportToService","serviceUrl","extraData","metricsRef","renderCount","startTimeRef","performance","now","renderCountRef","recordRenderPerformance","renderType","endTime","duration","initialRenderTime","updateRenderTime","mapOperationTime","observeMapOperation","operationName","operation","start","result","reportPerformance","_asyncToGenerator","_regenerator","_callee","metrics","_t","w","_context","p","timestamp","Date","location","href","userAgent","navigator","sendBeacon","v","getMemoryUsage","mem","memory","usedJSHeapSize","usedJSHeapSizeMB","getMetrics","useSpatialIndexWorker","_options$cellSize","cellSize","_options$indexType","indexType","_options$maxRetries","maxRetries","_options$retryDelay","retryDelay","workerRef","queryIdRef","pendingQueries","Map","pendingBuild","pendingUpdate","retryCountRef","lastErrorRef","isBuilding","setIsBuilding","_useState5","_useState6","itemCount","setItemCount","_useState7","_useState8","buildTime","setBuildTime","_useState9","_useState0","queryTime","setQueryTime","_useState1","_useState10","updateTime","setUpdateTime","_useState11","_useState12","currentIndexType","setCurrentIndexType","_useState13","_useState14","setError","_useState15","_useState16","retryCount","setRetryCount","Worker","URL","import","meta","onmessage","event","data","_pendingBuild$current","_pendingUpdate$curren","queryId","resolve","get","items","delete","onerror","errorMessage","_workerRef$current","terminate","buildIndex","plots","Promise","reject","Error","plot","id","boundaries","positions","flat","postMessage","query","set","bbox","updateIndex","addedItems","removedIds","updatedItems","clear","resetError","useGeometryWorker","_useState17","_useState18","isCalculating","setIsCalculating","_workerRef$current2","calculateAreas","handler","_workerRef$current3","payload","areas","_workerRef$current4","computeBounds","_workerRef$current5","_workerRef$current6","simplifyGeometry","tolerance","_workerRef$current7","simplifiedPlots","_workerRef$current8","DEFAULT_PLOT_STATE","selectedId","editingLayer","tempCoordinates","clipFragments","selectedFragmentId","isPreview","editAreaLabel","PlotStateMachine","initialState","_classCallCheck","defineProperty","state","_createClass","getState","reduce","dispatch","createPlotReducer","machine","usePlotDraw","callbacks","callbacksRef","handleDrawVertex","handleDrawCreate","_callbacksRef$current","_callbacksRef$current2","onCreate","coordinates","generateFragmentId","random","toString","substr","usePlotClip","handleCut","_layers$","getLayers","fragmentId","newCoords","handleSaveClip","selectedPlotId","onClip","originalId","fragments","AREA_UNIT_CONFIGS","square_meters","unit","factor","hectares","mu","acres","calculatePolygonArea","area","sumLat","avgLat","latRad","PI","latToMeters","lngToMeters","cos","j","lat1","lng1","lat2","lng2","convertArea","areaSquareMeters","formatArea","precision","convertedArea","computeDataBounds","positionsField","minLat","minLng","maxLat","maxLng","found","_loop","flatten","_iterator2","_step2","c","southWest","northEast","usePlotMove","updateAreaLabel","existingMarker","areaUnit","sumLng","coord","centroid","span","createElement","areaIcon","divIcon","html","outerHTML","iconAnchor","setLatLng","setIcon","marker","interactive","handleDrag","areaMarkerRef","handleDragEnd","onMove","enableMoveMode","pmLayer","enableLayerDrag","toggleEdit","allowSelfIntersection","draggable","initLatlngs","initCoords","disableMoveMode","disableLayerDrag","usePlotRedraw","handleEdit","handleSaveRedraw","onRedraw","enableRedrawMode","enable","disableRedrawMode","usePlotStateMachine","reducer","_useReducer","useReducer","_useReducer2","onSave","onDelete","onEdit","_usePlotDraw","_usePlotClip","_pm","_callbacksRef$current3","_callbacksRef$current4","_callbacksRef$current5","_callbacksRef$current6","_callbacksRef$current7","_callbacksRef$current8","_callbacksRef$current9","_callbacksRef$current0","_callbacksRef$current1","_callbacksRef$current10","flatCoords","handleRedraw","handleClip","handleMove","_callbacksRef$current11","_callbacksRef$current12","handleDelete","_callbacksRef$current13","_callbacksRef$current14","startEdit","clearTempLayer","editMode","isPreviewMode","clipHintMessage","DEFAULT_OPTIONS","vertexColor","vertexSize","useVertexStyleFix","mergedOptions","timerRef","fixVertexStyle","_container$current","markers","currentBg","currentBorder","border","expectedBorder","observer","_container$current2","childList","getDistance","latlng1","latlng2","distanceTo","getMiddlePoint","formatDistance","createDistanceIcon","angle","labelClass","labelType","useDistanceLabels","points","labels","middlePoint","deltaLng","deltaLat","atan2","zIndexOffset","useDistanceData","total","segments","middle","useIncrementalUpdate","getId","isEqual","applyUpdate","createInitial","resultRef","getDiff","prevItems","newItems","prevMap","newMap","_iterator3","_step3","_step3$value","newItem","prevItem","_iterator4","_step4","_step4$value","has","applyIncremental","_iterator5","_step5","rebuild","_iterator6","_step6","useLayerStyleIncremental","getStyle","getLayerById","prevItemsRef","prevSelectedIdsRef","Set","updateStyles","selectedIds","_iterator7","_step7","_iterator8","_step8","_iterator9","_step9","_step9$value","isSelected","setStyle","updateSelection","prevSelectedIds","newSelectedIds","changedIds","_iterator0","_step0","add","_iterator1","_step1","_iterator10","_step10","find","useRafThrottle","rafRef","lastArgsRef","callbackRef","throttledFn","useDebouncedCallback","debouncedFn","fn","cancel","useViewportDebounce","_options$zoomDebounce","zoomDebounceDelay","_options$moveDebounce","moveDebounceDelay","_options$useRaf","useRaf","_options$listenResize","listenResize","realtimeZoom","setRealtimeZoom","realtimeViewVersion","setRealtimeViewVersion","realtimeBoundsRef","realtimeCenterRef","debouncedZoom","setDebouncedZoom","debouncedViewVersion","setDebouncedViewVersion","debouncedBounds","setDebouncedBounds","debouncedCenter","setDebouncedCenter","debouncedSetZoom","debouncedSetViewVersion","version","throttledSetViewVersion","forceUpdate","initialZoom","initialBounds","initialCenter","handleZoomEnd","handleMoveEnd","newVersion","handleResize","realtime","viewVersion","useLayerIncrementalUpdate","createLayer","updateLayer","_options$getId","_options$enabled","layersMapRef","defaultRemoveLayer","actualRemoveLayer","performUpdate","newData","currentIds","existingIds","entry","existing","success","newLayer","count","layersMap","useEnhancedVirtualization","dataLength","_config$autoEnableThr","autoEnableThreshold","_config$buffer","buffer","_config$throttleMs","throttleMs","_config$minZoom","_config$maxZoom","_config$simplifyZoomT","simplifyZoomThreshold","_config$chunkedLoadin","chunkedLoading","_config$chunkSize","chunkSize","maxConcurrentChunks","isVirtualized","viewport","setViewport","loadedChunksRef","throttleTimerRef","updateViewport","bufferedBBox","throttledUpdateViewport","isInZoomRange","shouldSimplify","totalChunks","ceil","getVisibleChunks","centerLng","hash","visibleChunk","chunks","chunkIndex","clearChunks","loadedChunks","useIsomorphicLayoutEffect","useLayoutEffect","is3DPositions","isCoordinateInBounds","_coord","isPlotInBounds","rings","ring","useBoxZoomSelection","fieldNames","_fieldNames","onSelectionChange","setInternalSelectedIds","enabledRef","setInternalSelectedIdsRef","onSelectionChangeRef","handleBoxZoomEnd","boxZoomEvent","boxZoomBounds","MAP_FIT_BOUNDS_DEFAULT_PADDING","nextRegistryId","layerRegistry","registry","register","getData","_layerRegistry$get","unregister","useUnifiedFitBounds","fitBounds","allPoints","_data$markers","_data$plots","_data$roads","_data$irrigations","_data$tracks","boundsResult","roads","road","irrigations","ch","tracks","track","_track$segments","seg","_seg$coordinates","include","exclude","activeTypes","t","getters","_track$allPoints","values","segment","point","_options$maxZoom","_options$padding","_options$animate","latLngBounds","padding","animate","useNormalizedDataSource","defaultFieldNames","validation","mapper","mergedFieldNames","_Object$entries","entries","_Object$entries$_i","_useMemo","validatedData","validationResult","valid","invalid","errors","validItems","isValid","requiredFields","field","fieldValue","coordinateFields","coordinateBounds","customValidator","customResult","mappedData","fitBoundsRegistry","createMarkerValidationConfig","createRoadValidationConfig","createIrrigationValidationConfig","createPlotValidationConfig","useDataNormalizer","extract","validate","validCount","invalidCount","mapped","createCoordinateValidator","coordField","validateCoordinate","useAutoFit","autoFit","getCoordinates","hasFittedRef","allCoords","triggerFit","hasFitted","createMarkerCoordinateGetter","getMarkerCoords","createPolylineCoordinateGetter","getPolylineCoords"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../../src/hooks/useLatestRef.ts","../../src/hooks/useSyncRef.ts","../../src/hooks/useMapLifecycle.ts","../../src/context/MapContext.tsx","../../src/context/ThemeContext.tsx","../../src/context/ConfigContext.tsx","../../src/utils/darkThemeFilter.ts","../../src/components/TianDiTuLayer/index.tsx","../../src/components/DualScaleControl/index.tsx","../../src/components/MapSizeHandler/index.tsx","../../src/components/ZoomControl/index.tsx","../../src/components/FullscreenControl/index.tsx","../../src/utils/pulseIcon.ts","../../src/constants/icon.ts","../../src/constants/styles.ts","../../src/components/Loading/index.tsx","../../src/components/MapContainer/index.tsx","../../src/constants/theme.ts","../../src/hooks/useTheme.ts","../../src/hooks/useLifecycle.ts","../../src/hooks/useEditMode.ts","../../src/hooks/usePolylineRenderer.ts","../../src/hooks/usePolylineEditor.ts","../../src/hooks/useLoadingOverlay.tsx","../../src/hooks/useRenderOptimization.ts","../../src/utils/errorHandling.ts","../../src/hooks/usePerformanceMonitor.ts","../../src/hooks/useWorker.ts","../../src/hooks/plotStateMachine/types.ts","../../src/hooks/plotStateMachine/plotStateMachine.ts","../../src/hooks/plotStateMachine/hooks/usePlotDraw.ts","../../src/hooks/plotStateMachine/hooks/usePlotClip.ts","../../src/utils/area.ts","../../src/hooks/plotStateMachine/hooks/usePlotMove.ts","../../src/hooks/plotStateMachine/hooks/usePlotRedraw.ts","../../src/hooks/plotStateMachine/index.ts","../../src/hooks/useVertexStyleFix.ts","../../src/utils/geometry.ts","../../src/utils/leafletIcons.ts","../../src/hooks/useDistanceLabels.ts","../../src/hooks/useIncrementalUpdate.ts","../../src/utils/rafThrottle.ts","../../src/hooks/useViewportDebounce.ts","../../src/hooks/useLayerIncrementalUpdate.ts","../../src/hooks/useEnhancedVirtualization.ts","../../src/hooks/useIsomorphicLayoutEffect.ts","../../src/types/basic.ts","../../src/hooks/useBoxZoomSelection.ts","../../src/constants/common.ts","../../src/hooks/useUnifiedFitBounds.ts","../../src/hooks/useNormalizedDataSource.ts","../../src/hooks/useDataNormalizer.ts","../../src/hooks/useAutoFit.ts"],"sourcesContent":["/**\n * 保持 ref 始终指向最新值的 Hook\n * @description 用于在回调中访问最新值,避免闭包陷阱\n */\n\nimport { useRef, useEffect } from 'react';\n\n/**\n * 返回一个 ref,其 current 始终指向传入的最新值\n * @param value 需要保持引用的值\n * @returns React.MutableRefObject<T>\n *\n * @example\n * ```ts\n * const onClickRef = useLatestRef(onClick);\n * // 在回调中使用 onClickRef.current\n * ```\n */\nexport function useLatestRef<T>(value: T) {\n const ref = useRef(value);\n useEffect(() => {\n ref.current = value;\n }, [value]);\n return ref;\n}\n\nexport default useLatestRef;\n","/**\n * 统一 ref 同步 Hook\n * @description 将值同步到 ref,避免多处重复编写相同的同步逻辑\n *\n * 使用场景:\n * - 需要在事件回调中访问最新 state 值\n * - 避免闭包陷阱导致的 stale closure 问题\n * - 替代多处重复的 useEffect + ref 同步逻辑\n *\n * @packageDocumentation\n */\n\nimport { useRef, useEffect, useState } from 'react';\n\n/**\n * 将值同步到 ref 的通用 Hook\n *\n * @param ref 目标 ref\n * @param value 需要同步的值\n *\n * @example\n * ```tsx\n * import { useRef } from 'react';\n * import { useSyncRef } from './hooks';\n *\n * function MyComponent({ value }) {\n * const valueRef = useRef(null);\n * useSyncRef(valueRef, value);\n *\n * const handleClick = () => {\n * // 访问最新值\n * console.log(valueRef.current);\n * };\n *\n * return <button onClick={handleClick}>Click</button>;\n * }\n * ```\n *\n * @see {@link https://react.dev/reference/react/useRef}\n */\nexport function useSyncRef<T>(ref: React.MutableRefObject<T | null>, value: T): void {\n useEffect(() => {\n ref.current = value;\n }, [ref, value]);\n}\n\n/**\n * 自动创建 ref 并同步值的 Hook\n *\n * @template T - 值类型\n * @param initialValue - 初始值\n * @returns [ref, currentValue] - ref 对象和当前值的元组\n *\n * @example\n * ```tsx\n * import { useAutoSyncRef } from './hooks';\n *\n * function MyComponent({ data }) {\n * const [dataRef, currentData] = useAutoSyncRef(initialData);\n *\n * // currentData 始终与 data 同步\n * // dataRef.current 可在回调中访问最新值\n *\n * return <div>{currentData}</div>;\n * }\n * ```\n */\nexport function useAutoSyncRef<T>(initialValue: T): [React.MutableRefObject<T | null>, T] {\n const ref = useRef<T | null>(null);\n const [value, _setValue] = useState(initialValue);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return [ref, value] as const;\n}\n\nexport default useSyncRef;\n","/**\n * @fileoverview 地图生命周期管理 Hook(极简方案)\n * @description 为 MapContainer 提供极简的生命周期管理\n * @since 1.4.0\n * @module hooks/useMapLifecycle\n *\n * @example\n * ```tsx\n * useMapLifecycle({\n * map,\n * lifecycle: {\n * onMapReady: ({ map }) => console.log('地图就绪'),\n * onViewportChange: (data) => saveViewport(data),\n * },\n * isReady: true,\n * });\n * ```\n */\n\n/* eslint-disable react-hooks/exhaustive-deps -- ref 回调稳定 */\n\nimport { useEffect, useRef } from 'react';\nimport type L from 'leaflet';\nimport type { MapLifecycleConfig } from '../types/mapLifecycle';\n\n/**\n * useMapLifecycle 配置选项\n */\nexport interface UseMapLifecycleOptions {\n /** 地图实例 */\n map: L.Map | null;\n /** 生命周期配置 */\n lifecycle?: MapLifecycleConfig;\n /** 地图是否已就绪 */\n isReady: boolean;\n}\n\n/**\n * 地图生命周期管理 Hook(极简方案)\n * @description 只管理两个核心生命周期事件:onMapReady 和 onViewportChange\n *\n * @param options - 配置选项\n *\n * @example\n * ```tsx\n * function MapProvider({ lifecycle, children }) {\n * const [map, setMap] = useState(null);\n * const [isReady, setIsReady] = useState(false);\n *\n * // 初始化地图\n * useEffect(() => {\n * const newMap = L.map(containerRef.current);\n * setMap(newMap);\n * setIsReady(true);\n * }, []);\n *\n * // 生命周期管理\n * useMapLifecycle({ map, lifecycle, isReady });\n *\n * return <div>{children}</div>;\n * }\n * ```\n */\nexport function useMapLifecycle(options: UseMapLifecycleOptions): void {\n const { map, lifecycle, isReady } = options;\n const hasReadyFired = useRef(false);\n const prevViewportRef = useRef<{ center: L.LatLng; zoom: number } | null>(null);\n const rafIdRef = useRef<number | null>(null);\n\n // ========== MOUNT: onMapReady ==========\n useEffect(() => {\n // 必须地图实例存在且已就绪\n if (!map || !isReady) {\n return;\n }\n\n // 防止重复触发\n if (hasReadyFired.current) {\n return;\n }\n\n hasReadyFired.current = true;\n\n // 触发 onMapReady 回调\n lifecycle?.onMapReady?.({ map });\n\n // 注意:不在这里监听 'load' 事件\n // 因为现代浏览器和 Leaflet 版本中,'load' 事件可能不会触发\n // 如果需要知道瓦片加载完成,应该在 TileLayer 中监听\n }, [map, isReady]);\n\n // ========== UPDATE: onViewportChange ==========\n useEffect(() => {\n // 必须地图实例存在且已就绪\n if (!map || !isReady || !lifecycle?.onViewportChange) {\n return;\n }\n\n /**\n * 视口变化处理函数\n * @description 使用 RAF 防抖,避免高频触发\n */\n const handleViewportChange = (_triggerEvent: 'moveend' | 'zoomend') => {\n // 如果已有 RAF 待执行,跳过\n if (rafIdRef.current !== null) {\n return;\n }\n\n rafIdRef.current = requestAnimationFrame(() => {\n const center = map.getCenter();\n const zoom = map.getZoom();\n const bounds = map.getBounds();\n\n // 检测是否真的发生了变化(避免重复触发)\n const prev = prevViewportRef.current;\n const hasChanged =\n !prev ||\n Math.abs(prev.center.lat - center.lat) > 0.0001 ||\n Math.abs(prev.center.lng - center.lng) > 0.0001 ||\n Math.abs(prev.zoom - zoom) > 0.001;\n\n if (hasChanged) {\n // 触发回调\n lifecycle.onViewportChange?.({\n center,\n zoom,\n bounds,\n });\n\n // 更新上一个视口引用\n prevViewportRef.current = { center, zoom };\n }\n\n // 清除 RAF ID\n rafIdRef.current = null;\n });\n };\n\n // 监听移动和缩放事件\n map.on('moveend', () => handleViewportChange('moveend'));\n map.on('zoomend', () => handleViewportChange('zoomend'));\n\n // 清理函数\n return () => {\n // 清除待执行的 RAF\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n\n // 移除事件监听\n map.off('moveend');\n map.off('zoomend');\n };\n }, [map, isReady, lifecycle?.onMapReady, lifecycle?.onViewportChange]);\n\n // ========== UNMOUNT: 清理 ==========\n useEffect(() => {\n return () => {\n // 清除待执行的 RAF\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n };\n }, []);\n}\n\nexport default useMapLifecycle;\n","/**\n * @fileoverview 地图上下文 - 替代 react-leaflet 的 MapContainer 和 useMap\n * @description 提供地图实例的上下文管理和访问 Hook,API 与 react-leaflet 保持一致\n * @module context/MapContext\n * @since 2.0.0\n * @since 1.4.0 添加极简生命周期管理支持\n */\n\n/* eslint-disable react-hooks/exhaustive-deps -- 地图配置选项变更频率低 */\n\nimport React, { createContext, useContext, useRef, useEffect, useState, useMemo } from 'react';\nimport L from 'leaflet';\nimport { useMapLifecycle } from '../hooks/useMapLifecycle';\nimport type { MapLifecycleConfig } from '../types/mapLifecycle';\n\n// ========== 类型定义 ==========\n\n/**\n * 地图上下文值\n */\nexport interface MapContextValue {\n /** Leaflet 地图实例 */\n map: L.Map | null;\n /** 地图实例 ref(用于命令式访问) */\n mapRef: React.MutableRefObject<L.Map | null>;\n /** 地图是否已初始化完成 */\n isReady: boolean;\n}\n\n/**\n * MapProvider 组件属性\n */\nexport interface MapProviderProps {\n /** 子组件 */\n children: React.ReactNode;\n /** 初始中心点 */\n center: [number, number];\n /** 初始缩放级别 */\n zoom: number;\n /** Leaflet 地图选项 */\n options?: L.MapOptions;\n /** 地图初始化完成回调 */\n onReady?: (map: L.Map) => void;\n /** 容器样式 */\n style?: React.CSSProperties;\n /** 容器类名 */\n className?: string;\n /** 是否在组件卸载时销毁地图 */\n destroyOnUnmount?: boolean;\n /**\n * 地图生命周期回调配置\n * @since 1.4.0\n * @description 极简方案:只保留 onMapReady 和 onViewportChange\n * @example\n * ```tsx\n * lifecycle={{\n * onMapReady: ({ map }) => console.log('地图就绪'),\n * onViewportChange: (data) => saveViewport(data),\n * }}\n * ```\n */\n lifecycle?: MapLifecycleConfig;\n}\n\n// ========== Context 创建 ==========\n\nconst MapContext = createContext<MapContextValue>({\n map: null,\n mapRef: { current: null },\n isReady: false,\n});\n\nMapContext.displayName = 'MapContext';\n\n// ========== Hook 导出 ==========\n\n/**\n * 获取地图实例的 Hook\n * @description 与 react-leaflet 的 useMap API 保持一致,方便迁移\n * @returns Leaflet 地图实例,如果地图未初始化则返回 null\n * @example\n * ```tsx\n * const map = useMap();\n *\n * useEffect(() => {\n * if (!map) return;\n * // 使用地图实例\n * map.fitBounds(bounds);\n * }, [map]);\n * ```\n */\nexport const useMap = (): L.Map | null => {\n const { map } = useContext(MapContext);\n return map;\n};\n\n/**\n * 获取地图实例(保证非空)\n * @description 如果地图未初始化则抛出错误,用于确定地图一定存在的场景\n * @returns 地图实例\n * @throws 如果地图未初始化\n * @example\n * ```tsx\n * function MyComponent() {\n * // 组件在 MapProvider 内部,map 一定存在\n * const map = useMapGuaranteed();\n * // TypeScript 知道 map 不是 null\n * map.fitBounds(bounds);\n * }\n * ```\n */\nexport const useMapGuaranteed = (): L.Map => {\n const map = useMap();\n if (!map) {\n throw new Error(\n 'Map is not available. Make sure you are inside a MapProvider and the map has been initialized.'\n );\n }\n return map;\n};\n\n/**\n * 获取地图实例 ref 的 Hook\n * @description 用于在事件处理器中获取最新地图实例(避免闭包问题)\n * @returns 地图实例 ref\n */\nexport const useMapRef = (): React.MutableRefObject<L.Map | null> => {\n const { mapRef } = useContext(MapContext);\n return mapRef;\n};\n\n/**\n * 判断地图是否就绪的 Hook\n * @returns 地图是否已初始化完成\n */\nexport const useMapReady = (): boolean => {\n const { isReady } = useContext(MapContext);\n return isReady;\n};\n\n/**\n * 获取完整上下文值的 Hook\n * @description 用于需要同时访问 map、mapRef、isReady 的场景\n * @returns 地图上下文值\n */\nexport const useMapContext = (): MapContextValue => {\n return useContext(MapContext);\n};\n\n// ========== Provider 组件 ==========\n\n/**\n * 地图容器 Provider 组件\n * @description 替代 react-leaflet 的 MapContainer,提供地图实例上下文\n * @example\n * ```tsx\n * import { MapProvider, useMapInstance } from 'agri-map-components';\n *\n * function MyMapComponent() {\n * return (\n * <MapProvider center={[30, 120]} zoom={10}>\n * <MyLayer />\n * </MapProvider>\n * );\n * }\n *\n * function MyLayer() {\n * const map = useMapInstance();\n * // 使用 map...\n * return null;\n * }\n * ```\n */\nexport const MapProvider: React.FC<MapProviderProps> = ({\n children,\n center,\n zoom,\n options = {},\n onReady,\n style,\n className,\n destroyOnUnmount = true,\n lifecycle,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const mapRef = useRef<L.Map | null>(null);\n const [isReady, setIsReady] = useState(false);\n const onReadyRef = useRef(onReady);\n const lifecycleRef = useRef(lifecycle);\n\n // 保持 lifecycle 最新\n useEffect(() => {\n lifecycleRef.current = lifecycle;\n }, [lifecycle]);\n\n // 给 zoom 添加默认值\n const effectiveZoom = zoom ?? 12;\n\n // 保持 onReady 回调最新\n useEffect(() => {\n onReadyRef.current = onReady;\n }, [onReady]);\n\n // 初始化地图\n useEffect(() => {\n if (!containerRef.current) return;\n\n // 防止重复初始化\n if (mapRef.current) return;\n\n // 地图选项 - 必须包含 center 和 zoom 用于初始化\n // 注意:不要使用 ...options 展开,因为 undefined 值会覆盖默认值\n const mapOptions: L.MapOptions = {\n center,\n zoom: effectiveZoom,\n zoomControl: options.zoomControl ?? true,\n attributionControl: options.attributionControl ?? true,\n };\n\n // 只添加有值的选项,避免 undefined 覆盖默认值\n if (options.crs !== undefined) mapOptions.crs = options.crs;\n if (options.maxZoom !== undefined) mapOptions.maxZoom = options.maxZoom;\n if (options.minZoom !== undefined) mapOptions.minZoom = options.minZoom;\n if (options.scrollWheelZoom !== undefined) mapOptions.scrollWheelZoom = options.scrollWheelZoom;\n if (options.maxBounds !== undefined) mapOptions.maxBounds = options.maxBounds;\n if (options.layers !== undefined) mapOptions.layers = options.layers;\n if (options.preferCanvas !== undefined) mapOptions.preferCanvas = options.preferCanvas;\n\n // 创建地图\n const map = L.map(containerRef.current, mapOptions);\n\n mapRef.current = map;\n setIsReady(true);\n\n // 触发 onReady 回调\n if (onReadyRef.current) {\n // 使用 RAF 确保地图渲染完成\n requestAnimationFrame(() => {\n onReadyRef.current?.(map);\n });\n }\n\n // 清理函数\n return () => {\n if (destroyOnUnmount && mapRef.current) {\n mapRef.current.remove();\n mapRef.current = null;\n setIsReady(false);\n }\n };\n }, []); // 只在挂载时执行一次\n\n // ========== 生命周期管理 ==========\n useMapLifecycle({\n map: mapRef.current,\n lifecycle: lifecycleRef.current,\n isReady,\n });\n\n // 更新 center 和 zoom(如果需要)\n // 如果需要受控模式,可以取消注释以下代码\n // const updateCenterZoom = useCallback(() => {\n // if (!mapRef.current || !isReady) return;\n // const currentCenter = mapRef.current.getCenter();\n // const currentZoom = mapRef.current.getZoom();\n // if (currentCenter.lat !== center[0] || currentCenter.lng !== center[1] || currentZoom !== zoom) {\n // mapRef.current.setView(center, zoom, { animate: false });\n // }\n // }, [center, zoom, isReady]);\n\n // 响应 center/zoom 变化(可选行为,默认不响应)\n // 如果需要受控模式,可以取消注释以下代码\n // useEffect(() => {\n // updateCenterZoom();\n // }, [updateCenterZoom]);\n\n const contextValue: MapContextValue = useMemo(\n () => ({\n map: mapRef.current,\n mapRef,\n isReady,\n }),\n // 只依赖 isReady,因为 mapRef 是稳定的 ref 对象\n // 修复记录 (2024-06-08): 使用 useMemo 缓存 contextValue,避免每次渲染创建新对象\n // 问题:原始代码在每次渲染时创建新对象 { map: mapRef.current, mapRef, isReady },\n // 导致使用 useContext(MapContext) 的组件重新渲染\n [isReady]\n );\n\n return (\n <MapContext.Provider value={contextValue}>\n <div\n ref={containerRef}\n className={className}\n style={{\n position: 'relative',\n ...(style || {}),\n }}\n data-map-container-style={JSON.stringify(style)}\n >\n {isReady && children}\n </div>\n </MapContext.Provider>\n );\n};\n\nMapProvider.displayName = 'MapProvider';\n\n// ========== 工具 Hook ==========\n\n/**\n * 地图事件监听 Hook\n * @description 简化地图事件的绑定和解绑\n * @param eventType 事件类型\n * @param handler 事件处理函数\n * @example\n * ```tsx\n * useMapEvent('click', (e) => {\n * console.log('点击位置:', e.latlng);\n * });\n * ```\n */\nexport const useMapEvent = <K extends keyof L.LeafletEventHandlerFnMap>(\n eventType: K,\n handler: L.LeafletEventHandlerFnMap[K]\n): void => {\n const map = useMap();\n const handlerRef = useRef(handler);\n\n useEffect(() => {\n handlerRef.current = handler;\n }, [handler]);\n\n useEffect(() => {\n if (!map) return;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wrappedHandler = (e: any) => {\n handlerRef.current?.(e);\n };\n\n map.on(eventType, wrappedHandler as L.LeafletEventHandlerFn);\n\n return () => {\n map.off(eventType, wrappedHandler as L.LeafletEventHandlerFn);\n };\n }, [map, eventType]);\n};\n\n/**\n * 多事件监听 Hook\n * @description 同时监听多个地图事件,与 react-leaflet 的 useMapEvents API 一致\n * @param events 事件处理函数映射对象\n * @returns 地图实例\n * @example\n * ```tsx\n * const map = useMapEvents({\n * click: (e) => {\n * console.log('点击位置:', e.latlng);\n * },\n * zoomend: (e) => {\n * console.log('缩放结束:', map.getZoom());\n * },\n * moveend: (e) => {\n * console.log('移动结束:', map.getCenter());\n * },\n * });\n * ```\n */\nexport const useMapEvents = <K extends keyof L.LeafletEventHandlerFnMap>(\n events: Partial<L.LeafletEventHandlerFnMap>\n): L.Map | null => {\n const map = useMap();\n const eventsRef = useRef(events);\n\n // 保持 events 最新\n useEffect(() => {\n eventsRef.current = events;\n }, [events]);\n\n useEffect(() => {\n if (!map) return;\n\n // 为每个事件类型注册监听器\n const registeredEvents: K[] = [];\n\n for (const eventType in eventsRef.current) {\n if (eventsRef.current[eventType as K]) {\n const handler = eventsRef.current[eventType as K]!;\n const wrappedHandler = (e: L.LeafletEvent) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (handler as any)(e);\n };\n map.on(eventType, wrappedHandler as L.LeafletEventHandlerFn);\n registeredEvents.push(eventType as K);\n }\n }\n\n return () => {\n // 清理所有注册的事件\n for (const eventType of registeredEvents) {\n map.off(eventType);\n }\n };\n }, [map]);\n\n return map;\n};\n\n/**\n * 地图视口变化监听 Hook\n * @description 监听地图 zoom 和 move 事件\n * @param callback 视口变化回调\n * @example\n * ```tsx\n * useMapViewportChange(({ center, zoom, bounds }) => {\n * console.log('视口变化:', center, zoom);\n * });\n * ```\n */\nexport const useMapViewportChange = (\n callback: (viewport: { center: L.LatLng; zoom: number; bounds: L.LatLngBounds }) => void\n): void => {\n const map = useMap();\n const callbackRef = useRef(callback);\n\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n useEffect(() => {\n if (!map) return;\n\n const handleChange = () => {\n callbackRef.current({\n center: map.getCenter(),\n zoom: map.getZoom(),\n bounds: map.getBounds(),\n });\n };\n\n map.on('zoomend', handleChange);\n map.on('moveend', handleChange);\n\n return () => {\n map.off('zoomend', handleChange);\n map.off('moveend', handleChange);\n };\n }, [map]);\n};\n\nexport { MapContext };\n","/**\n * 主题上下文\n * @description 提供全局主题状态管理,支持 MapContainer 等组件自动同步主题\n * @since 2.0.0\n */\n\n/* eslint-disable @typescript-eslint/no-empty-function */\nimport React, { createContext, useContext, useState, useEffect, useCallback, useMemo } from 'react';\n\n// ========== 类型定义 ==========\n\nexport type ThemeMode = 'light' | 'dark';\n\nexport interface ThemeContextValue {\n /** 当前主题 */\n theme: ThemeMode;\n /** 设置主题 */\n setTheme: (theme: ThemeMode) => void;\n /** 是否为深色主题 */\n isDark: boolean;\n}\n\n// ========== 上下文 ==========\n\nconst ThemeContext = createContext<ThemeContextValue>({\n theme: 'light',\n setTheme: () => {},\n isDark: false,\n});\n\n/**\n * 获取主题上下文的 Hook\n * @returns 主题上下文值\n */\nexport const useTheme = (): ThemeContextValue => {\n return useContext(ThemeContext);\n};\n\n// ========== Provider 组件 ==========\n\nexport interface ThemeProviderProps {\n /** 子组件 */\n children: React.ReactNode;\n /** 初始主题,默认从 localStorage 读取或使用 'light' */\n defaultTheme?: ThemeMode;\n /** 主题变化回调 */\n onThemeChange?: (theme: ThemeMode) => void;\n}\n\n/**\n * 主题 Provider 组件\n * @description 提供全局主题状态,自动同步 localStorage 和 DOM 属性\n *\n * @example\n * ```tsx\n * // 在应用入口包裹\n * <ThemeProvider defaultTheme=\"dark\">\n * <App />\n * </ThemeProvider>\n *\n * // 在组件中使用\n * const { theme, setTheme, isDark } = useTheme();\n * ```\n */\nexport function ThemeProvider({\n children,\n defaultTheme,\n onThemeChange,\n}: ThemeProviderProps): JSX.Element {\n // 初始化主题:优先使用 props,其次 localStorage,最后默认 'light'\n const [theme, setThemeState] = useState<ThemeMode>(() => {\n if (defaultTheme) return defaultTheme;\n // 检查是否在浏览器环境中\n if (typeof window !== 'undefined' && window.localStorage) {\n const stored = localStorage.getItem('theme');\n if (stored === 'light' || stored === 'dark') return stored;\n }\n return 'light';\n });\n\n // 同步到 DOM 和 localStorage\n useEffect(() => {\n document.documentElement.setAttribute('data-theme', theme);\n document.body.setAttribute('data-theme', theme);\n if (typeof window !== 'undefined' && window.localStorage) {\n localStorage.setItem('theme', theme);\n }\n }, [theme]);\n\n // 设置主题\n const setTheme = useCallback(\n (newTheme: ThemeMode) => {\n setThemeState(newTheme);\n onThemeChange?.(newTheme);\n },\n [onThemeChange]\n );\n\n const value = useMemo(\n () => ({\n theme,\n setTheme,\n isDark: theme === 'dark',\n }),\n [theme, setTheme]\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nexport default ThemeProvider;\n","/**\n * 配置上下文\n * @description 用于在子组件中获取 MapContainer 的配置\n * @module context/ConfigContext\n * @since 2.0.0\n */\n\nimport { createContext, useContext } from 'react';\nimport type {\n DualScaleControlConfig,\n MapSizeHandlerConfig,\n TianDiTuLayerConfig,\n PathOptions,\n IconConfig,\n AntPathConfig,\n TrackStyle,\n ClusterIconConfig,\n} from '../types';\n\n// ========== 类型定义 ==========\n\n/**\n * PlotLayer 配置\n */\nexport interface PlotLayerConfig {\n /** 编辑模式样式 */\n editing?: PathOptions | null | false;\n}\n\n/**\n * Marker 配置\n */\nexport interface MarkerConfig {\n /** 编辑中状态图标配置 */\n editing?: IconConfig | null | false;\n /** 聚合气泡图标 - undefined|null|false|{} → 使用 CLUSTER_DEFAULT_ICON */\n cluster?: ClusterIconConfig | null | false;\n}\n\n/**\n * Road 配置\n */\nexport interface RoadConfig {\n /** 编辑态样式配置 */\n editing?: PathOptions | null | false;\n /** 蚁行路径配置 */\n antPath?: AntPathConfig | null | false;\n}\n\n/**\n * Irrigation 配置\n */\nexport interface IrrigationConfig {\n /** 编辑态样式配置 */\n editing?: PathOptions | null | false;\n /** 蚁行路径配置 */\n antPath?: AntPathConfig | null | false;\n /** 进水口图标配置 */\n inlet?: IconConfig | null | false;\n /** 出水口图标配置 */\n outlet?: IconConfig | null | false;\n}\n\n/**\n * Track 配置\n * @since 2.0.0 使用 TRACK_STYLE.default 替代 working,使用 TRACK_STYLE.nonWorking 替代 nonWorking\n */\nexport interface TrackConfig {\n /** 作业中轨迹样式 - undefined|null|false|{} → 使用 TRACK_STYLE.default */\n default?: TrackStyle | null | false;\n /** 非作业/路上轨迹样式 - undefined|null|false|{} → 使用 TRACK_STYLE.nonWorking */\n nonWorking?: TrackStyle | null | false;\n /** 选中轨迹样式 - undefined|null|false|{} → 使用 TRACK_STYLE.selected */\n selected?: TrackStyle | null | false;\n /** 起点图标 - undefined|null|false|{} → 使用 TRACK_DEFAULT_START_ICON */\n start?: IconConfig | null | false;\n /** 终点图标 - undefined|null|false|{} → 使用 TRACK_DEFAULT_END_ICON */\n end?: IconConfig | null | false;\n /** 聚合气泡图标 - undefined|null|false|{} → 使用 CLUSTER_DEFAULT_ICON */\n cluster?: ClusterIconConfig | null | false;\n}\n\n/**\n * 配置上下文值\n */\nexport interface ConfigContextValue {\n /** 主题模式 */\n theme: 'light' | 'dark';\n /** 双向标尺配置 */\n dualScaleControl?: DualScaleControlConfig | false;\n /** 天地图图层配置 */\n tianDiTuLayer?: TianDiTuLayerConfig | false;\n /** 地图尺寸处理器配置 */\n mapSizeHandler?: MapSizeHandlerConfig | false;\n /** PlotLayer 配置 */\n plotLayer?: PlotLayerConfig;\n /** Marker 配置 */\n marker?: MarkerConfig;\n /** Road 配置 */\n road?: RoadConfig;\n /** Irrigation 配置 */\n irrigation?: IrrigationConfig;\n /** Track 配置 */\n track?: TrackConfig;\n}\n\n// ========== Context 创建 ==========\n\n/**\n * 配置上下文\n */\nconst ConfigContext = createContext<ConfigContextValue>({\n theme: 'light',\n});\n\nConfigContext.displayName = 'ConfigContext';\n\n// ========== Hook 导出 ==========\n\n/**\n * 获取配置上下文的 Hook\n * @returns 配置对象\n * @example\n * ```tsx\n * const { theme, tianDiTuLayer } = useConfig();\n * ```\n */\nexport const useConfig = (): ConfigContextValue => {\n return useContext(ConfigContext);\n};\n\nexport { ConfigContext };\n","/**\n * 深色主题 SVG 滤镜工具\n * @description 为 Leaflet 地图组件提供深色主题支持\n */\n\nexport const FILTER_CONTAINER_ID = 'map-theme-filters';\nexport const DARK_FILTER_ID = 'tianditu-dark-filter';\n\nlet svgFilterInjected = false;\n\n/**\n * 确保深色滤镜已注入 DOM\n * 仅在首次调用时注入,全局只注入一次\n */\nexport function ensureDarkFilterInjected(): void {\n if (svgFilterInjected) return;\n if (document.getElementById(FILTER_CONTAINER_ID)) {\n svgFilterInjected = true;\n return;\n }\n\n const svgFilters = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svgFilters.setAttribute('id', FILTER_CONTAINER_ID);\n svgFilters.setAttribute('aria-hidden', 'true');\n svgFilters.setAttribute('style', 'position: absolute; width: 0; height: 0; overflow: hidden;');\n svgFilters.setAttribute('version', '1.1');\n\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n\n const darkFilter = document.createElementNS('http://www.w3.org/2000/svg', 'filter');\n darkFilter.setAttribute('id', DARK_FILTER_ID);\n darkFilter.setAttribute('x', '-20%');\n darkFilter.setAttribute('y', '-20%');\n darkFilter.setAttribute('width', '140%');\n darkFilter.setAttribute('height', '140%');\n darkFilter.setAttribute('filterUnits', 'objectBoundingBox');\n darkFilter.setAttribute('primitiveUnits', 'userSpaceOnUse');\n darkFilter.setAttribute('color-interpolation-filters', 'sRGB');\n\n const colorMatrix = document.createElementNS('http://www.w3.org/2000/svg', 'feColorMatrix');\n colorMatrix.setAttribute('type', 'matrix');\n colorMatrix.setAttribute('values', '1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0');\n colorMatrix.setAttribute('in', 'SourceGraphic');\n colorMatrix.setAttribute('result', 'colormatrix');\n\n const componentTransfer = document.createElementNS(\n 'http://www.w3.org/2000/svg',\n 'feComponentTransfer'\n );\n componentTransfer.setAttribute('in', 'colormatrix');\n componentTransfer.setAttribute('result', 'componentTransfer');\n\n const feFuncR = document.createElementNS('http://www.w3.org/2000/svg', 'feFuncR');\n feFuncR.setAttribute('type', 'table');\n feFuncR.setAttribute('tableValues', '0.12 0.18 0.35');\n\n const feFuncG = document.createElementNS('http://www.w3.org/2000/svg', 'feFuncG');\n feFuncG.setAttribute('type', 'table');\n feFuncG.setAttribute('tableValues', '0.12 0.18 0.35');\n\n const feFuncB = document.createElementNS('http://www.w3.org/2000/svg', 'feFuncB');\n feFuncB.setAttribute('type', 'table');\n feFuncB.setAttribute('tableValues', '0.2 0.25 0.45');\n\n const feFuncA = document.createElementNS('http://www.w3.org/2000/svg', 'feFuncA');\n feFuncA.setAttribute('type', 'table');\n feFuncA.setAttribute('tableValues', '0 0.3 1');\n\n componentTransfer.appendChild(feFuncR);\n componentTransfer.appendChild(feFuncG);\n componentTransfer.appendChild(feFuncB);\n componentTransfer.appendChild(feFuncA);\n\n darkFilter.appendChild(colorMatrix);\n darkFilter.appendChild(componentTransfer);\n defs.appendChild(darkFilter);\n svgFilters.appendChild(defs);\n\n document.body.appendChild(svgFilters);\n svgFilterInjected = true;\n}\n","/**\n * 天地图图层组件\n * @description 封装天地图的矢量图层和标注图层,支持多种图层风格和自定义瓦片 URL\n * @since 2.0.0 已移除 react-leaflet 依赖,改用原生 Leaflet API\n * @since 2.1.0 重构:分离图层创建和 URL 更新逻辑,学习 react-leaflet 的设计模式\n *\n * ## 重构说明 (2024-06-08)\n *\n * **问题**: 原始实现在单个 useEffect 中处理图层创建和更新,导致任何 props 变化都会删除并重建图层,\n * 触发大量瓦片请求。\n *\n * **解决方案**: 学习 react-leaflet 的设计模式,分离关注点:\n * 1. 图层创建 useEffect - 只依赖 `map`,只执行一次\n * 2. URL 更新 useEffect - 依赖 URL 相关 props,使用 `layer.setUrl()` 更新\n * 3. 选项更新 useEffect - 依赖选项 props,使用 `layer.setOptions()` 更新\n *\n * **优势**:\n * - URL 变化时不会删除重建图层,只调用 `setUrl()` 更新\n * - 减少不必要的瓦片请求\n * - 代码更清晰,每个 useEffect 职责单一\n *\n * ## 使用示例\n *\n * ```tsx\n * <MapContainer center={[30, 120]} zoom={12}>\n * <TianDiTuLayer apiKey=\"your-api-key\" />\n * <Marker dataSource={markers} />\n * </MapContainer>\n * ```\n *\n * ## 性能优化要点\n *\n * 1. **图层实例复用** - 图层一旦创建,就通过 ref 存储,避免重复创建\n * 2. **setUrl() 更新** - URL 变化时调用 setUrl() 而非删除重建\n * 3. **缩小依赖范围** - 每个 useEffect 只依赖必要的 props\n */\n\nimport { useEffect, useState, useRef, memo, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport L from 'leaflet';\nimport { useMap } from '../../context/MapContext';\nimport { useConfig } from '../../context/ConfigContext';\nimport { ensureDarkFilterInjected } from '../../utils/darkThemeFilter';\nimport type { LayerType, TianDiTuLayerProps } from '../../types';\n\n// ========== 图层配置 ==========\n\n// 图层类型配置\nexport const LAYER_TYPES = {\n VECTOR: 'vector', // 矢量图层(默认)\n SATELLITE: 'satellite', // 卫星影像图层\n TERRAIN: 'terrain', // 地形图层\n} as const;\n\n// 图层类型标签\nconst LAYER_LABELS: Record<LayerType, string> = {\n [LAYER_TYPES.VECTOR]: '矢量',\n [LAYER_TYPES.SATELLITE]: '影像',\n [LAYER_TYPES.TERRAIN]: '地形',\n};\n\n// 天地图图层 URL 配置\nconst LAYER_URLS: Record<LayerType, { base: string; annotation: string }> = {\n // 矢量图层(浅色)\n [LAYER_TYPES.VECTOR]: {\n base: 'https://t{s}.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk={key}',\n annotation:\n 'https://t{s}.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk={key}',\n },\n // 卫星影像图层\n [LAYER_TYPES.SATELLITE]: {\n base: 'https://t{s}.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk={key}',\n annotation:\n 'https://t{s}.tianditu.gov.cn/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk={key}',\n },\n // 地形图层\n [LAYER_TYPES.TERRAIN]: {\n base: 'https://t{s}.tianditu.gov.cn/ter_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=ter&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk={key}',\n annotation:\n 'https://t{s}.tianditu.gov.cn/cta_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cta&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk={key}',\n },\n};\n\n// ========== TianDiTuLayer 组件 ==========\n\n/**\n * 天地图图层组件\n */\nexport const TianDiTuLayer = memo<TianDiTuLayerProps>(function TianDiTuLayer({\n apiKey,\n showAnnotation = true,\n layerType: layerTypeProp = LAYER_TYPES.VECTOR,\n tileUrl,\n annotationUrl,\n overlayUrl,\n // subdomains, maxZoom, minZoom 在当前实现中未使用,保留用于未来扩展或 API 兼容\n subdomains: _subdomains = ['0', '1', '2', '3', '4', '5', '6', '7'],\n maxZoom: _maxZoom = 18,\n minZoom: _minZoom = 0,\n attribution = null,\n theme: themeProp,\n showLayerSelector = false,\n onLayerTypeChange,\n}: TianDiTuLayerProps): JSX.Element | null {\n // 从 ConfigProvider 获取 theme,优先使用 props 传入的 theme\n const config = useConfig();\n const theme = themeProp || config.theme || 'light';\n const map = useMap();\n const [currentLayerType, setCurrentLayerType] = useState<LayerType>(layerTypeProp as LayerType);\n const [selectorVisible, setSelectorVisible] = useState(false);\n\n // 同步外部传入的 layerType prop\n useEffect(() => {\n setCurrentLayerType(layerTypeProp as LayerType);\n }, [layerTypeProp]);\n\n // 图层引用\n const baseLayerRef = useRef<L.TileLayer | null>(null);\n const annotationLayerRef = useRef<L.TileLayer | null>(null);\n const overlayLayerRef = useRef<L.TileLayer | null>(null);\n\n // 图层类型切换\n const handleLayerChange = useCallback(\n (type: LayerType) => {\n setCurrentLayerType(type);\n setSelectorVisible(false);\n onLayerTypeChange?.(type);\n },\n [onLayerTypeChange]\n );\n\n // 深色模式:仅对矢量图应用滤镜\n const isDarkTheme = theme === 'dark' && currentLayerType === LAYER_TYPES.VECTOR;\n\n // 根据主题切换地图容器的 data-theme 属性\n useEffect(() => {\n if (!map) return;\n\n const mapContainer = map.getContainer();\n\n if (isDarkTheme) {\n ensureDarkFilterInjected();\n mapContainer.setAttribute('data-theme', 'dark');\n } else {\n mapContainer.removeAttribute('data-theme');\n }\n }, [map, isDarkTheme]);\n\n // ============================================================================\n // 图层管理(学习 react-leaflet 的设计模式:分离创建和更新)\n // ============================================================================\n\n // ========== 1. 图层创建(只在 map 变化时执行,只执行一次) ==========\n // 设计思想:图层实例一旦创建,就应该尽可能复用,避免频繁创建/销毁\n // 依赖项:只依赖 [map, showAnnotation, attribution],确保只在地图实例初始化时执行一次\n useEffect(() => {\n if (!map) return;\n\n // 创建底图图层(初始为空 URL,URL 由后续的 useEffect 更新)\n const baseLayer = L.tileLayer('', {\n subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],\n maxZoom: 18,\n minZoom: 0,\n attribution: attribution === null ? undefined : attribution,\n }).addTo(map);\n baseLayerRef.current = baseLayer;\n\n // 创建标注图层\n if (showAnnotation) {\n const annotationLayer = L.tileLayer('', {\n subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],\n maxZoom: 18,\n minZoom: 0,\n attribution: attribution === null ? undefined : attribution,\n }).addTo(map);\n annotationLayerRef.current = annotationLayer;\n }\n\n // 清理函数:只在组件卸载时执行\n return () => {\n if (baseLayerRef.current) {\n baseLayerRef.current.remove();\n baseLayerRef.current = null;\n }\n if (annotationLayerRef.current) {\n annotationLayerRef.current.remove();\n annotationLayerRef.current = null;\n }\n if (overlayLayerRef.current) {\n overlayLayerRef.current.remove();\n overlayLayerRef.current = null;\n }\n };\n }, [map, showAnnotation, attribution]); // 依赖 map, showAnnotation, attribution\n\n // ========== 2. 底图 URL 更新(独立于创建逻辑) ==========\n // 设计思想:URL 变化时,使用 layer.setUrl() 更新,而不是删除重建图层\n // 优势:避免触发大量瓦片请求,提升性能\n // 依赖项:只依赖 URL 相关的 props [tileUrl, currentLayerType, apiKey]\n useEffect(() => {\n if (!baseLayerRef.current) return;\n\n const useCustomUrl = !!tileUrl;\n const layerConfig = LAYER_URLS[currentLayerType] || LAYER_URLS[LAYER_TYPES.VECTOR];\n const url = useCustomUrl && tileUrl ? tileUrl : layerConfig.base.replace('{key}', apiKey || '');\n\n // 使用 setUrl() 更新图层 URL,Leaflet 会自动处理瓦片过渡\n baseLayerRef.current.setUrl(url);\n }, [tileUrl, currentLayerType, apiKey]); // 只依赖 URL 相关的 props\n\n // ========== 3. 标注 URL 更新 ==========\n // 设计思想:与底图 URL 更新相同,使用 setUrl() 而非重建\n // 依赖项:[annotationUrl, tileUrl, currentLayerType, apiKey, showAnnotation]\n useEffect(() => {\n if (!annotationLayerRef.current || !showAnnotation) return;\n\n const useCustomUrl = !!tileUrl;\n const layerConfig = LAYER_URLS[currentLayerType] || LAYER_URLS[LAYER_TYPES.VECTOR];\n const url =\n useCustomUrl && annotationUrl\n ? annotationUrl\n : layerConfig.annotation.replace('{key}', apiKey || '');\n\n if (url) {\n annotationLayerRef.current.setUrl(url);\n } else if (annotationLayerRef.current) {\n // 如果没有标注 URL,移除标注图层\n annotationLayerRef.current.remove();\n annotationLayerRef.current = null;\n }\n }, [annotationUrl, tileUrl, currentLayerType, apiKey, showAnnotation]);\n\n // ========== 4. 叠加图层处理 ==========\n // 设计思想:叠加图层(overlay)独立管理,因为它的 URL 模式不同\n // 依赖项:[map, overlayUrl]\n useEffect(() => {\n if (!map) return;\n\n // 清理旧的叠加图层\n if (overlayLayerRef.current) {\n overlayLayerRef.current.remove();\n overlayLayerRef.current = null;\n }\n\n // 创建新的叠加图层\n if (overlayUrl) {\n const overlayLayer = L.tileLayer(`${overlayUrl}/{z}/{x}/{y}.webp`, {\n subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],\n maxZoom: 18,\n minZoom: 0,\n }).addTo(map);\n overlayLayerRef.current = overlayLayer;\n }\n }, [map, overlayUrl]);\n\n // 图层选择器组件\n const LayerSelector = showLayerSelector && map && (\n <div className=\"tianditu-layer-selector\" data-theme={theme}>\n <div\n className=\"tianditu-layer-selector-btn\"\n onClick={() => setSelectorVisible(!selectorVisible)}\n >\n <div className=\"tianditu-layer-selector-preview\" data-type={currentLayerType} />\n <span className=\"tianditu-layer-selector-label\">{LAYER_LABELS[currentLayerType]}</span>\n </div>\n {selectorVisible && (\n <div className=\"tianditu-layer-selector-dropdown\">\n {([LAYER_TYPES.VECTOR, LAYER_TYPES.SATELLITE, LAYER_TYPES.TERRAIN] as LayerType[]).map(\n type => (\n <div\n key={type}\n className={`tianditu-layer-selector-item ${currentLayerType === type ? 'active' : ''}`}\n onClick={() => handleLayerChange(type)}\n >\n <div className=\"tianditu-layer-selector-preview\" data-type={type} />\n <span className=\"tianditu-layer-selector-label\">{LAYER_LABELS[type]}</span>\n </div>\n )\n )}\n </div>\n )}\n </div>\n );\n\n // 如果地图未初始化,返回 null\n if (!map) return null;\n\n return <>{LayerSelector && createPortal(LayerSelector, map.getContainer())}</>;\n});\n\nTianDiTuLayer.displayName = 'TianDiTuLayer';\n\nexport default TianDiTuLayer;\n\n// 重新导出深色滤镜工具函数供其他组件使用\nexport { ensureDarkFilterInjected } from '../../utils/darkThemeFilter';\n","/**\n * 双向标尺组件\n * @description 在地图上同时显示水平和垂直两个标尺,覆盖整个地图窗口\n * @since 2.0.0 已移除 react-leaflet 依赖\n * @since 2.0.0 缩放控件已独立为 ZoomControl 组件\n */\n\nimport { useEffect, useRef, type MutableRefObject } from 'react';\nimport L from 'leaflet';\nimport { useMap } from '../../context/MapContext';\nimport { useConfig } from '../../context/ConfigContext';\nimport type { DualScaleControlProps, DualScaleControlConfig } from '../../types';\nimport { LAYER_TYPES } from '../TianDiTuLayer';\n\n// 将十六进制颜色转换为 rgba 字符串\nconst hexToRgba = (hex: string): string => {\n // 处理 #rrggbb 格式\n if (hex.length === 7) {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, 1)`;\n }\n // 处理 #rrggbbaa 格式(带透明度)\n if (hex.length === 9) {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n const a = parseInt(hex.slice(7, 9), 16) / 255;\n return `rgba(${r}, ${g}, ${b}, ${a.toFixed(2)})`;\n }\n // 如果是 rgba 或 rgb 格式,直接返回\n return hex;\n};\n\n/**\n * 双向标尺组件\n */\nconst DualScaleControl = ({\n config: configProp,\n theme: themeProp,\n layerType,\n scaleColor: scaleColorProp,\n controlBg: controlBgProp,\n controlText: controlTextProp,\n}: DualScaleControlProps): null => {\n // 从 ConfigProvider 获取配置\n const configContext = useConfig();\n\n // 获取 map 实例\n const map = useMap();\n\n // 解析配置:优先使用 props,其次使用 ConfigProvider\n const getConfig = (config: DualScaleControlConfig | undefined): DualScaleControlConfig => {\n return {\n metric: config?.metric ?? true,\n imperial: config?.imperial ?? false,\n scaleColor: config?.scaleColor,\n controlBg: config?.controlBg,\n controlText: config?.controlText,\n };\n };\n\n // 判断是否显示\n // - 如果 props 传了 config,则按 props 显示(包括空对象 {} 也会显示默认配置)\n // - 如果 props 没传 config,则看 ConfigProvider 的 dualScaleControl\n // - 如果 dualScaleControl 为 false,不显示\n // - 如果 dualScaleControl 为 undefined(没配置),显示默认\n // - 如果 dualScaleControl 为对象,使用该配置\n const shouldShow = () => {\n if (configProp !== undefined) {\n return true; // props 传了配置就显示\n }\n const contextConfig = configContext.dualScaleControl;\n return contextConfig !== false; // undefined 或对象都显示\n };\n\n // 如果不显示,返回 null\n if (!shouldShow()) {\n return null;\n }\n\n // 获取最终配置\n const finalConfig =\n configProp !== undefined\n ? configProp\n : configContext.dualScaleControl === false\n ? undefined\n : configContext.dualScaleControl;\n\n const { metric, imperial } = getConfig(finalConfig);\n\n // 主题:优先使用 props,其次使用 ConfigProvider\n const theme = themeProp || configContext.theme || 'light';\n\n // 提前初始化 refs,避免条件调用\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const containerRef: MutableRefObject<HTMLElement | null> = useRef(null);\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const scaleRef: MutableRefObject<HTMLElement | null> = useRef(null);\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const textRef: MutableRefObject<HTMLElement | null> = useRef(null);\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useEffect(() => {\n // null 检查\n if (!map) return;\n\n // 使用局部变量避免闭包中的 null 检查问题\n const mapInstance = map;\n let animationFrameId: number | null = null;\n let isCleanup = false;\n\n // 获取地图容器\n const mapContainer = mapInstance.getContainer();\n\n // 清理所有已存在的旧 container(防止重复)\n const existingContainers = mapContainer.querySelectorAll('.leaflet-control-dual-scale');\n existingContainers.forEach(el => {\n el.remove();\n });\n\n // 创建覆盖层容器,添加主题类名\n const container = L.DomUtil.create(\n 'div',\n `leaflet-control-dual-scale${theme === 'dark' ? ' dark' : ''}`\n );\n containerRef.current = container;\n\n // 创建 scale 容器(覆盖整个地图窗口)\n const scale = L.DomUtil.create('div', 'scale', container);\n scaleRef.current = scale;\n\n // 创建文本显示\n const textEl = L.DomUtil.create('div', 'scale-text', container);\n textRef.current = textEl;\n\n // 直接设置样式确保生效(避免 CSS 缓存问题)\n // 根据图层类型和主题组合确定颜色\n // satellite 在 light 主题下需要深色(卫星影像较暗)\n // terrain 在 dark 主题下需要浅色(地形图层较亮)\n // 优先级:props > config > 自动计算\n const getControlColors = () => {\n // 如果用户配置了颜色,直接使用\n if (scaleColorProp || controlBgProp || controlTextProp) {\n return {\n bg:\n controlBgProp ||\n (theme === 'dark' ? 'rgba(0, 0, 0, 0.7)' : 'rgba(255, 255, 255, 0.85)'),\n text: controlTextProp || (theme === 'dark' ? '#fff' : '#333'),\n scaleColor: scaleColorProp\n ? hexToRgba(scaleColorProp)\n : theme === 'dark'\n ? 'rgba(255, 255, 255, 0.7)'\n : 'rgba(51, 51, 51, 0.7)',\n };\n }\n\n // 如果 config 中配置了颜色,使用 config\n if (finalConfig?.scaleColor || finalConfig?.controlBg || finalConfig?.controlText) {\n return {\n bg:\n finalConfig.controlBg ||\n (theme === 'dark' ? 'rgba(0, 0, 0, 0.7)' : 'rgba(255, 255, 255, 0.85)'),\n text: finalConfig.controlText || (theme === 'dark' ? '#fff' : '#333'),\n scaleColor: finalConfig.scaleColor\n ? hexToRgba(finalConfig.scaleColor)\n : theme === 'dark'\n ? 'rgba(255, 255, 255, 0.7)'\n : 'rgba(51, 51, 51, 0.7)',\n };\n }\n\n // 否则根据图层类型和主题自动计算\n const isSatelliteLight = layerType === LAYER_TYPES.SATELLITE && theme === 'light';\n const isTerrainDark = layerType === LAYER_TYPES.TERRAIN && theme === 'dark';\n\n // 需要深色控件的情况:dark 主题 或 satellite + light(但 terrain + dark 除外)\n const needDarkControl = (theme === 'dark' || isSatelliteLight) && !isTerrainDark;\n\n if (needDarkControl) {\n return {\n bg: 'rgba(0, 0, 0, 0.7)',\n text: '#fff',\n scaleColor: 'rgba(255, 255, 255, 0.7)',\n };\n } else {\n return {\n bg: 'rgba(255, 255, 255, 0.85)',\n text: '#333',\n scaleColor: 'rgba(51, 51, 51, 0.7)',\n };\n }\n };\n\n const { bg: controlBg, text: controlText, scaleColor } = getControlColors();\n textEl.style.backgroundColor = controlBg;\n textEl.style.color = controlText;\n // 直接设置 scale 元素的颜色变量\n scale.style.setProperty('--scale-color', scaleColor);\n\n // 添加到地图容器\n mapContainer.appendChild(container);\n\n // 获取合适的刻度距离值(1, 2, 5 的倍数)\n const getRoundNum = (distance: number): number => {\n if (distance <= 0 || !isFinite(distance)) return 1;\n\n const exponent = Math.floor(Math.log(distance) / Math.LN10);\n const fraction = distance / Math.pow(10, exponent);\n let roundedFraction: number;\n\n if (fraction < 1.5) {\n roundedFraction = 1;\n } else if (fraction < 3.5) {\n roundedFraction = 2;\n } else if (fraction < 7.5) {\n roundedFraction = 5;\n } else {\n roundedFraction = 10;\n }\n\n return roundedFraction * Math.pow(10, exponent);\n };\n\n // 获取所有候选的 Nice Meters\n const getCandidateMeters = (targetMeters: number): number[] => {\n if (targetMeters <= 0 || !isFinite(targetMeters)) return [1];\n\n const exponent = Math.floor(Math.log(targetMeters) / Math.LN10);\n const base = Math.pow(10, exponent);\n\n // 返回 1, 2, 5 倍数的候选值\n return [\n base * 0.5, // 小一级的 5\n base * 1, // 当前级的 1\n base * 2, // 当前级的 2\n base * 5, // 当前级的 5\n base * 10, // 大一级的 1\n ].filter(m => m > 0);\n };\n\n // 更新函数\n const update = (): void => {\n // 检查是否已清理或销毁\n if (isCleanup || isDestroyed) return;\n\n // 检查地图是否已完全初始化\n const mapAny = mapInstance as L.Map & { _loaded?: boolean; _mapPane?: HTMLElement };\n if (!mapAny._loaded || !mapAny._mapPane) return;\n\n // 检查地图容器是否存在(防止在销毁后调用)\n try {\n const mapContainer = mapInstance.getContainer();\n if (!mapContainer || !document.contains(mapContainer)) return;\n } catch {\n // 如果获取容器失败,说明地图可能已被销毁\n return;\n }\n\n const mapSize = mapInstance.getSize();\n const bounds = mapInstance.getBounds();\n\n // 计算地图可视范围的实际距离\n const west = bounds.getWest();\n const east = bounds.getEast();\n const centerLat = bounds.getCenter().lat;\n const point1 = L.latLng(centerLat, west);\n const point2 = L.latLng(centerLat, east);\n const maxMeters = mapInstance.distance(point1, point2);\n\n // 计算每像素对应的米数\n const metersPerPixel = maxMeters / mapSize.x;\n\n // 计算合适的刻度间隔(像素)\n // 目标:每个刻度间隔在 40-80 像素之间\n const targetPixels = 60;\n const targetMeters = metersPerPixel * targetPixels;\n\n // 获取候选值并选择最接近目标的\n const candidates = getCandidateMeters(targetMeters);\n let bestMeters = candidates[0];\n let bestDiff = Infinity;\n\n candidates.forEach(meters => {\n const pixels = meters / metersPerPixel;\n const diff = Math.abs(pixels - targetPixels);\n if (diff < bestDiff) {\n bestDiff = diff;\n bestMeters = meters;\n }\n });\n\n const tickInterval = Math.max(30, Math.min(100, Math.round(bestMeters / metersPerPixel)));\n\n // 设置 CSS 变量到 scale 和 textEl\n if (scaleRef.current) {\n scaleRef.current.style.setProperty('--tick-interval', tickInterval + 'px');\n }\n if (textRef.current) {\n textRef.current.style.setProperty('--tick-interval', tickInterval + 'px');\n }\n\n // 计算显示距离\n const displayDistance = getRoundNum(maxMeters * 0.1); // 显示约 1/10 地图宽度的距离\n\n let displayText = '';\n if (metric) {\n displayText = getMetricText(displayDistance);\n }\n if (imperial) {\n if (displayText) displayText += ' / ';\n displayText += getImperialText(displayDistance);\n }\n if (textRef.current) {\n textRef.current.textContent = displayText;\n }\n };\n\n const getMetricText = (distance: number): string => {\n if (distance >= 1000) {\n return (distance / 1000).toFixed(1) + ' km';\n }\n if (distance < 1) {\n return (distance * 100).toFixed(0) + ' cm';\n }\n if (distance < 10) {\n return distance.toFixed(1) + ' m';\n }\n return distance.toFixed(0) + ' m';\n };\n\n const getImperialText = (distance: number): string => {\n const feet = distance * 3.28084;\n if (feet >= 5280) {\n return (feet / 5280).toFixed(1) + ' mi';\n }\n if (feet < 1) {\n return (feet * 12).toFixed(0) + ' in';\n }\n return feet.toFixed(0) + ' ft';\n };\n\n // 标记是否已销毁\n let isDestroyed = false;\n\n // 包装 update 函数,在调用前检查是否已销毁\n const safeUpdate = () => {\n if (!isDestroyed && !isCleanup) {\n update();\n }\n };\n\n // 初始化 - 使用 RAF 确保地图已完全渲染\n animationFrameId = requestAnimationFrame(() => {\n if (!isDestroyed && !isCleanup) {\n const mapAny = mapInstance as L.Map & { _loaded?: boolean; _mapPane?: HTMLElement };\n if (mapAny._loaded && mapAny._mapPane) {\n update();\n }\n }\n });\n\n // 监听地图事件\n mapInstance.on('moveend', safeUpdate);\n mapInstance.on('zoomend', safeUpdate);\n mapInstance.on('resize', safeUpdate);\n\n // 清理函数\n return () => {\n isCleanup = true;\n isDestroyed = true;\n if (animationFrameId) {\n cancelAnimationFrame(animationFrameId);\n }\n mapInstance.off('moveend', safeUpdate);\n mapInstance.off('zoomend', safeUpdate);\n mapInstance.off('resize', safeUpdate);\n if (container && mapContainer.contains(container)) {\n mapContainer.removeChild(container);\n }\n };\n }, [\n map,\n metric,\n imperial,\n theme,\n layerType,\n scaleColorProp,\n controlBgProp,\n controlTextProp,\n finalConfig,\n ]);\n\n return null;\n};\n\nexport default DualScaleControl;\n","/**\n * 地图尺寸处理器组件\n * @description 解决地图容器尺寸变化后(如抽屉/对话框打开),地图不自动刷新的问题\n * @module components/MapSizeHandler\n * @since 2.0.0 已移除 react-leaflet 依赖\n *\n * ## 解决的问题\n *\n * 当地图容器的 DOM 尺寸发生变化时,Leaflet 地图**不会自动重新计算和渲染**,\n * 导致地图显示异常(如:瓦片缺失、只显示一部分、标尺位置错误等)。\n *\n * 常见触发场景:\n * - 抽屉/侧边栏打开或关闭\n * - 对话框弹出\n * - 窗口大小调整\n * - Tab 切换导致容器从隐藏变为显示\n * - 父容器动态改变尺寸\n *\n * ## 核心原理\n *\n * 调用 Leaflet 的 `map.invalidateSize()` 方法,通知地图重新计算容器尺寸并刷新视图。\n *\n * ## 配置参数\n *\n * | 参数 | 说明 | 类型 | 默认值 |\n * |------|------|------|--------|\n * | enabled | 是否启用尺寸处理 | boolean | true |\n * | delay | 每次刷新的间隔时间(毫秒) | number | 100 |\n * | retries | 调用 invalidateSize 的次数 | number | 3 |\n *\n * ## 工作流程\n *\n * 组件挂载后会多次调用 invalidateSize:\n * - 延迟 100ms → invalidateSize()\n * - 延迟 200ms → invalidateSize()\n * - 延迟 300ms → invalidateSize()\n * - (共重试 retries 次,确保容器完全渲染)\n *\n * **为什么需要多次重试?**\n * 因为某些 CSS 动画或布局变化需要时间完成,单次调用可能无法捕获最终尺寸。\n *\n * @example\n * // 方式1:通过 MapContainer 的 mapSizeHandler 属性(推荐)\n * <MapContainer\n * center={[30, 120]}\n * zoom={10}\n * mapSizeHandler // 启用默认配置\n * />\n *\n * // 方式2:自定义配置\n * <MapContainer\n * center={[30, 120]}\n * zoom={10}\n * mapSizeHandler={{ delay: 200, retries: 5 }}\n * />\n *\n * // 方式3:禁用\n * <MapContainer\n * center={[30, 120]}\n * zoom={10}\n * mapSizeHandler={false}\n * />\n *\n * // 方式4:在 ConfigProvider 中配置(用于 MapProvider + MapContent 模式)\n * <ConfigProvider mapSizeHandler={{ delay: 200, retries: 5 }}>\n * <MapProvider center={[30, 120]} zoom={10}>\n * <MapContent />\n * </MapProvider>\n * </ConfigProvider>\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useMap } from '../../context/MapContext';\nimport type { MapSizeHandlerConfig } from '../../types';\n\n/**\n * 地图尺寸处理器组件\n * @description 通过多次调用 invalidateSize 确保地图在容器尺寸变化后正确渲染\n *\n * @example\n * // 在 MapContent 中自动使用,通过 ConfigProvider 配置\n * <ConfigProvider mapSizeHandler>\n * <MapProvider center={[30, 120]} zoom={10}>\n * <MapContent />\n * </MapProvider>\n * </ConfigProvider>\n *\n * // 自定义配置\n * <ConfigProvider mapSizeHandler={{ delay: 200, retries: 5 }}>\n * ...\n * </ConfigProvider>\n */\nconst MapSizeHandler = ({\n enabled = true,\n delay = 100,\n retries = 3,\n}: MapSizeHandlerConfig = {}): null => {\n const map = useMap();\n const initialized = useRef(false);\n\n useEffect(() => {\n if (!enabled || !map || initialized.current) return;\n initialized.current = true;\n\n // 多次调用 invalidateSize 以确保容器已完全渲染\n const timers = Array.from({ length: retries }, (_, i) =>\n setTimeout(() => map!.invalidateSize(), delay * (i + 1))\n );\n\n return () => timers.forEach(clearTimeout);\n }, [map, enabled, delay, retries]);\n\n return null;\n};\n\nexport default MapSizeHandler;\n","/**\n * 缩放控件组件\n * @description 提供放大、缩小按钮和缩放级别显示\n * @module components/ZoomControl\n * @since 2.0.0\n */\n\nimport { useEffect, useMemo, useRef, type MutableRefObject } from 'react';\nimport L from 'leaflet';\nimport { useMap } from '../../context/MapContext';\nimport { useConfig } from '../../context/ConfigContext';\nimport type { ZoomControlPosition } from '../../types';\n\n/**\n * 缩放控件配置\n */\nexport interface ZoomControlConfig {\n /** 控件位置 */\n position?: ZoomControlPosition;\n /** 控件背景色 */\n controlBg?: string;\n /** 控件文字颜色 */\n controlText?: string;\n}\n\n/**\n * 缩放控件属性\n */\nexport interface ZoomControlProps {\n /** 控件位置,默认 'bottomleft' */\n position?: ZoomControlPosition;\n /** 控件背景色 */\n controlBg?: string;\n /** 控件文字颜色 */\n controlText?: string;\n /** 主题模式 */\n theme?: 'light' | 'dark';\n}\n\n/**\n * ZoomControl 缩放控件组件\n *\n * @description\n * 提供地图缩放控制功能:\n * - 放大/缩小按钮\n * - 当前缩放级别显示\n * - 支持四个位置:topleft、topright、bottomleft、bottomright\n * - 自动适配主题(light/dark)\n *\n * @example\n * ```tsx\n * import { ZoomControl } from 'agri-map-components';\n *\n * // 基础用法\n * <ZoomControl />\n *\n * // 自定义位置\n * <ZoomControl position=\"topright\" />\n *\n * // 自定义颜色\n * <ZoomControl controlBg=\"rgba(0, 0, 0, 0.8)\" controlText=\"#fff\" />\n * ```\n */\nconst ZoomControl: React.FC<ZoomControlProps> = ({\n position = 'bottomleft',\n controlBg: controlBgProp,\n controlText: controlTextProp,\n theme: themeProp,\n}): null => {\n const map = useMap();\n const configContext = useConfig();\n const zoomControlRef: MutableRefObject<HTMLElement | null> = useRef(null);\n const zoomLevelRef: MutableRefObject<HTMLElement | null> = useRef(null);\n\n // 主题:优先使用 props,其次使用 ConfigProvider\n const theme = themeProp || configContext.theme || 'light';\n\n // 获取控件颜色\n const controlColors = useMemo(() => {\n if (controlBgProp || controlTextProp) {\n return {\n bg:\n controlBgProp || (theme === 'dark' ? 'rgba(0, 0, 0, 0.7)' : 'rgba(255, 255, 255, 0.85)'),\n text: controlTextProp || (theme === 'dark' ? '#fff' : '#333'),\n };\n }\n return {\n bg: theme === 'dark' ? 'rgba(0, 0, 0, 0.7)' : 'rgba(255, 255, 255, 0.85)',\n text: theme === 'dark' ? '#fff' : '#333',\n };\n }, [theme, controlBgProp, controlTextProp]);\n\n useEffect(() => {\n // 确保 map 实例已准备好\n if (!map) return;\n\n const mapContainer = map.getContainer();\n const { bg: controlBg, text: controlText } = controlColors;\n\n // 清理已存在的旧控件(防止重复)\n const existingControls = mapContainer.querySelectorAll('.agri-zoom-control');\n existingControls.forEach(el => el.remove());\n\n // 创建缩放控件容器\n const zoomControl = L.DomUtil.create(\n 'div',\n `agri-zoom-control${theme === 'dark' ? ' dark' : ''}`\n );\n zoomControlRef.current = zoomControl;\n\n // 检测图层选择器是否可见(在右下角)\n const layerSelector = mapContainer.querySelector('.tianditu-layer-selector');\n const hasLayerSelector = layerSelector && layerSelector.checkVisibility();\n\n // 根据位置设置样式\n // 注意:左侧位置(topleft、bottomleft)需要为垂直标尺留出空间(30px)\n // bottomright 位置如果有图层选择器,需要向上移动避免遮挡(100px)\n const positionStyles: Record<ZoomControlPosition, React.CSSProperties> = {\n topleft: {\n top: '10px',\n left: '30px',\n bottom: 'auto',\n right: 'auto',\n },\n topright: {\n top: '10px',\n right: '10px',\n bottom: 'auto',\n left: 'auto',\n },\n bottomleft: {\n bottom: '50px', // 为底部水平标尺留出空间\n left: '30px', // 为左侧垂直标尺留出空间\n top: 'auto',\n right: 'auto',\n },\n bottomright: {\n bottom: hasLayerSelector ? '100px' : '10px',\n right: '10px',\n top: 'auto',\n left: 'auto',\n },\n };\n\n Object.assign(zoomControl.style, positionStyles[position]);\n\n // 放大按钮\n const zoomIn = L.DomUtil.create('button', 'zoom-btn zoom-in', zoomControl);\n zoomIn.innerHTML = '+';\n zoomIn.title = '放大';\n zoomIn.style.backgroundColor = controlBg;\n zoomIn.style.color = controlText;\n\n // 缩放级别显示\n const zoomLevel = L.DomUtil.create('div', 'zoom-level', zoomControl);\n zoomLevelRef.current = zoomLevel;\n zoomLevel.style.backgroundColor = controlBg;\n zoomLevel.style.color = controlText;\n\n // 缩小按钮\n const zoomOut = L.DomUtil.create('button', 'zoom-btn zoom-out', zoomControl);\n zoomOut.innerHTML = '−';\n zoomOut.title = '缩小';\n zoomOut.style.backgroundColor = controlBg;\n zoomOut.style.color = controlText;\n\n // 绑定事件\n L.DomEvent.on(zoomIn, 'click', e => {\n L.DomEvent.stopPropagation(e);\n L.DomEvent.preventDefault(e);\n map.zoomIn();\n });\n\n L.DomEvent.on(zoomOut, 'click', e => {\n L.DomEvent.stopPropagation(e);\n L.DomEvent.preventDefault(e);\n map.zoomOut();\n });\n\n // 更新缩放级别显示\n const updateZoomLevel = (): void => {\n if (zoomLevelRef.current) {\n zoomLevelRef.current.textContent = String(map.getZoom());\n }\n };\n updateZoomLevel();\n map.on('zoomend', updateZoomLevel);\n\n // 添加到地图容器\n mapContainer.appendChild(zoomControl);\n\n // 监听图层选择器的可见性变化,动态调整位置\n let layerSelectorObserver: MutationObserver | null = null;\n if (layerSelector) {\n layerSelectorObserver = new MutationObserver(() => {\n const isVisible = layerSelector.checkVisibility();\n if (zoomControlRef.current && position === 'bottomright') {\n zoomControlRef.current.style.bottom = isVisible ? '100px' : '10px';\n }\n });\n\n layerSelectorObserver.observe(layerSelector, {\n attributes: true,\n attributeFilter: ['style', 'class'],\n subtree: true,\n });\n }\n\n // 清理函数\n return () => {\n map.off('zoomend', updateZoomLevel);\n if (layerSelectorObserver) {\n layerSelectorObserver.disconnect();\n }\n if (zoomControl && mapContainer.contains(zoomControl)) {\n mapContainer.removeChild(zoomControl);\n }\n };\n }, [map, position, theme, controlColors]);\n\n return null;\n};\n\nexport default ZoomControl;\n","/**\n * 全屏控件组件\n * @description 提供地图全屏切换功能\n * @module components/FullscreenControl\n * @since 2.1.0\n */\n\nimport { useEffect, useRef, type MutableRefObject } from 'react';\nimport L from 'leaflet';\nimport { useMap } from '../../context/MapContext';\nimport { useConfig } from '../../context/ConfigContext';\nimport type { FullscreenControlPosition } from '../../types';\n\n// 空函数,用于清理事件监听器\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst noop = () => {};\n\n/**\n * 全屏控件属性\n */\nexport interface FullscreenControlProps {\n /** 控件位置,默认 'topleft' */\n position?: FullscreenControlPosition;\n /** 控件背景色 */\n controlBg?: string;\n /** 控件文字颜色 */\n controlText?: string;\n /** 主题模式 */\n theme?: 'light' | 'dark';\n}\n\n/**\n * FullscreenControl 全屏控件组件\n *\n * @description\n * 提供地图全屏切换功能:\n * - 点击按钮进入/退出全屏\n * - 支持四个位置:topleft、topright、bottomleft、bottomright\n * - 自动适配主题(light/dark)\n * - 全屏状态自动更新按钮图标\n *\n * @example\n * ```tsx\n * import { FullscreenControl } from 'agri-map-components';\n *\n * // 基础用法\n * <FullscreenControl />\n *\n * // 自定义位置\n * <FullscreenControl position=\"topright\" />\n *\n * // 自定义颜色\n * <FullscreenControl controlBg=\"rgba(0, 0, 0, 0.8)\" controlText=\"#fff\" />\n * ```\n */\nconst FullscreenControl: React.FC<FullscreenControlProps> = ({\n position = 'topleft',\n controlBg: controlBgProp,\n controlText: controlTextProp,\n theme: themeProp,\n}): null => {\n const map = useMap();\n const configContext = useConfig();\n const fullscreenControlRef: MutableRefObject<HTMLElement | null> = useRef(null);\n\n // 主题:优先使用 props,其次使用 ConfigProvider\n const theme = themeProp || configContext.theme || 'light';\n\n // 计算控件颜色\n const controlBg =\n controlBgProp || (theme === 'dark' ? 'rgba(0, 0, 0, 0.7)' : 'rgba(255, 255, 255, 0.85)');\n const controlText = controlTextProp || (theme === 'dark' ? '#fff' : '#333');\n\n useEffect(() => {\n // 确保 map 实例已准备好\n if (!map) return;\n\n const mapContainer = map.getContainer();\n\n // 清理已存在的旧控件(防止重复)\n const existingControls = mapContainer.querySelectorAll('.agri-fullscreen-control');\n existingControls.forEach(el => el.remove());\n\n // 创建全屏控件容器\n const fullscreenControl = L.DomUtil.create('div', 'agri-fullscreen-control');\n fullscreenControlRef.current = fullscreenControl;\n\n // 检测图层选择器是否可见(在右下角)\n const layerSelector = mapContainer.querySelector('.tianditu-layer-selector');\n const hasLayerSelector = layerSelector && layerSelector.checkVisibility();\n\n // 根据位置设置样式\n const positionStyles: Record<FullscreenControlPosition, React.CSSProperties> = {\n topleft: {\n position: 'absolute',\n top: '10px',\n left: '10px',\n bottom: 'auto',\n right: 'auto',\n zIndex: 1000,\n },\n topright: {\n position: 'absolute',\n top: '10px',\n right: '10px',\n bottom: 'auto',\n left: 'auto',\n zIndex: 1000,\n },\n bottomleft: {\n position: 'absolute',\n bottom: '10px',\n left: '10px',\n top: 'auto',\n right: 'auto',\n zIndex: 1000,\n },\n bottomright: {\n position: 'absolute',\n bottom: hasLayerSelector ? '100px' : '10px',\n right: '10px',\n top: 'auto',\n left: 'auto',\n zIndex: 1000,\n },\n };\n\n Object.assign(fullscreenControl.style, positionStyles[position]);\n\n // 设置控件基础样式\n Object.assign(fullscreenControl.style, {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n backgroundColor: controlBg,\n borderRadius: '4px',\n cursor: 'pointer',\n boxShadow: '0 1px 3px rgba(0, 0, 0, 0.3)',\n transition: 'background-color 0.2s',\n });\n\n // 鼠标悬停效果\n fullscreenControl.addEventListener('mouseenter', () => {\n fullscreenControl.style.backgroundColor =\n theme === 'dark' ? 'rgba(0, 0, 0, 0.9)' : 'rgba(255, 255, 255, 0.95)';\n });\n\n fullscreenControl.addEventListener('mouseleave', () => {\n fullscreenControl.style.backgroundColor = controlBg;\n });\n\n // 创建图标容器\n const iconContainer = L.DomUtil.create('div', 'agri-fullscreen-icon', fullscreenControl);\n Object.assign(iconContainer.style, {\n width: '20px',\n height: '20px',\n color: controlText,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n });\n\n // 渲染图标\n const renderIcon = (isFullscreen: boolean) => {\n iconContainer.innerHTML = isFullscreen\n ? `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"${controlText}\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 3v3a2 2 0 0 1-2 2H3m13 0h3a2 2 0 0 1 2 2v3m0 13v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3\"/></svg>`\n : `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"${controlText}\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\"/></svg>`;\n };\n\n // 初始渲染图标\n const isCurrentlyFullscreen = !!document.fullscreenElement;\n renderIcon(isCurrentlyFullscreen);\n\n // 监听全屏状态变化\n const handleFullscreenChange = () => {\n const isFullscreen = !!document.fullscreenElement;\n renderIcon(isFullscreen);\n };\n\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n\n // 点击事件\n const handleClick = (e: Event) => {\n L.DomEvent.stopPropagation(e);\n L.DomEvent.preventDefault(e);\n\n if (!document.fullscreenElement) {\n // 进入全屏\n mapContainer.requestFullscreen?.().catch(err => {\n console.error('全屏模式启用失败:', err);\n });\n } else {\n // 退出全屏\n document.exitFullscreen?.().catch(err => {\n console.error('全屏模式退出失败:', err);\n });\n }\n };\n\n fullscreenControl.addEventListener('click', handleClick);\n\n // 添加到地图容器\n mapContainer.appendChild(fullscreenControl);\n\n // 监听图层选择器的可见性变化,动态调整位置\n let layerSelectorObserver: MutationObserver | null = null;\n if (layerSelector) {\n layerSelectorObserver = new MutationObserver(() => {\n const isVisible = layerSelector.checkVisibility();\n if (fullscreenControlRef.current && position === 'bottomright') {\n fullscreenControlRef.current.style.bottom = isVisible ? '100px' : '10px';\n }\n });\n\n layerSelectorObserver.observe(layerSelector, {\n attributes: true,\n attributeFilter: ['style', 'class'],\n subtree: true,\n });\n }\n\n // 清理函数\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n fullscreenControl.removeEventListener('click', handleClick);\n fullscreenControl.removeEventListener('mouseenter', noop);\n fullscreenControl.removeEventListener('mouseleave', noop);\n if (layerSelectorObserver) {\n layerSelectorObserver.disconnect();\n }\n if (fullscreenControl && mapContainer.contains(fullscreenControl)) {\n mapContainer.removeChild(fullscreenControl);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, position, theme, controlBgProp, controlTextProp]);\n\n return null;\n};\n\nexport default FullscreenControl;\n","/**\n * 同心圆脉冲图标 SVG 生成器\n * @description 生成带扩散/收缩脉冲动画的同心圆地图标记 SVG\n */\n\nimport type { PresetIconName } from '../types/icon';\n\n/** 脉冲图标颜色配置 */\nconst PULSE_COLORS: Record<string, { outer: string; inner: string }> = {\n 'pulse-blue': { outer: '#D7EDFE', inner: '#409FFF' },\n 'pulse-green': { outer: '#D4EDDA', inner: '#52C41A' },\n 'pulse-red': { outer: '#F8D7DA', inner: '#E53935' },\n 'pulse-orange': { outer: '#FFE0B2', inner: '#FB8C00' },\n 'pulse-purple': { outer: '#E8DAEF', inner: '#7C4DFF' },\n 'pulse-arrow': { outer: '#FFB199', inner: '#FF6C35' },\n};\n\n/**\n * 生成同心圆脉冲图标 SVG\n * @param iconType - 标记类型(pulse/pulse-blue/green/red/orange/purple/arrow)\n * @param width - SVG 宽度\n * @param height - SVG 高度\n * @param animated - 是否启用脉冲动画\n * @param color - 可选的自定义颜色,当 iconType 为 'pulse' 时使用此颜色\n * @returns SVG HTML 字符串,非脉冲图标返回空字符串\n */\nexport function generatePulseSvg(\n iconType: PresetIconName,\n width: number,\n height: number,\n animated: boolean,\n color?: string\n): string {\n // 'pulse' 类型使用传入的 color 生成双色脉冲\n if (iconType === 'pulse') {\n const pulseColor = color || '#52c41a';\n return generateUniversalPulseSvg(width, height, animated, pulseColor);\n }\n\n const colors = PULSE_COLORS[iconType];\n if (!colors) return '';\n\n // pulse-arrow 特殊处理:带箭头的脉冲图标\n if (iconType === 'pulse-arrow') {\n return generatePulseArrowSvg(width, height, animated, colors);\n }\n\n // 外圈扩散动画:从 r=256 放大到 r=384 同时 opacity 从 1→0,模拟波纹\n const outerAnim = animated\n ? `<circle cx=\"512\" cy=\"512\" r=\"256\" fill=\"${colors.outer}\">\n <animate attributeName=\"r\" values=\"256;384;256\" dur=\"2s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n <animate attributeName=\"opacity\" values=\"1;0;1\" dur=\"2s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>\n <circle cx=\"512\" cy=\"512\" r=\"256\" fill=\"${colors.outer}\" opacity=\"0.6\">\n <animate attributeName=\"r\" values=\"256;384;256\" dur=\"2s\" begin=\"0.7s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n <animate attributeName=\"opacity\" values=\"0.6;0;0.6\" dur=\"2s\" begin=\"0.7s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>`\n : `<circle cx=\"512\" cy=\"512\" r=\"320\" fill=\"${colors.outer}\"/>`;\n\n // 内圈收缩动画:从 r=160 缩小到 r=120 再恢复\n const innerAnim = animated\n ? `<circle cx=\"512\" cy=\"512\" r=\"160\" fill=\"${colors.inner}\">\n <animate attributeName=\"r\" values=\"160;120;160\" dur=\"2s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>`\n : `<circle cx=\"512\" cy=\"512\" r=\"160\" fill=\"${colors.inner}\"/>`;\n\n return `\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" width=\"${width}\" height=\"${height}\" style=\"overflow:visible;display:block;\">\n ${outerAnim}\n ${innerAnim}\n </svg>\n `;\n}\n\n/**\n * 生成通用脉冲图标 SVG(使用自定义颜色)\n * @param width - SVG 宽度\n * @param height - SVG 高度\n * @param animated - 是否启用脉冲动画\n * @param color - 自定义颜色\n * @returns SVG HTML 字符串\n */\nfunction generateUniversalPulseSvg(\n width: number,\n height: number,\n animated: boolean,\n color: string\n): string {\n // 将颜色转换为外圈浅色版本(添加透明度)\n const outerColor = `${color}30`; // 约 20% 透明度\n\n // 外圈扩散动画\n const outerAnim = animated\n ? `<circle cx=\"512\" cy=\"512\" r=\"256\" fill=\"${outerColor}\">\n <animate attributeName=\"r\" values=\"256;384;256\" dur=\"2s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n <animate attributeName=\"opacity\" values=\"1;0;1\" dur=\"2s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>\n <circle cx=\"512\" cy=\"512\" r=\"256\" fill=\"${outerColor}\" opacity=\"0.6\">\n <animate attributeName=\"r\" values=\"256;384;256\" dur=\"2s\" begin=\"0.7s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n <animate attributeName=\"opacity\" values=\"0.6;0;0.6\" dur=\"2s\" begin=\"0.7s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>`\n : `<circle cx=\"512\" cy=\"512\" r=\"320\" fill=\"${outerColor}\"/>`;\n\n // 内圈收缩动画\n const innerAnim = animated\n ? `<circle cx=\"512\" cy=\"512\" r=\"160\" fill=\"${color}\">\n <animate attributeName=\"r\" values=\"160;120;160\" dur=\"2s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>`\n : `<circle cx=\"512\" cy=\"512\" r=\"160\" fill=\"${color}\"/>`;\n\n return `\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" width=\"${width}\" height=\"${height}\" style=\"overflow:visible;display:block;\">\n ${outerAnim}\n ${innerAnim}\n </svg>\n `;\n}\n\n/**\n * 生成带箭头的脉冲图标 SVG\n * @description 圆形脉冲 + 中间箭头向前动画\n */\nfunction generatePulseArrowSvg(\n width: number,\n height: number,\n animated: boolean,\n colors: { outer: string; inner: string }\n): string {\n // 外圈脉冲动画:与普通脉冲图标保持一致(r=256)\n const outerPulse = animated\n ? `<circle cx=\"512\" cy=\"512\" r=\"256\" fill=\"${colors.outer}\">\n <animate attributeName=\"r\" values=\"256;384;256\" dur=\"1.5s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n <animate attributeName=\"opacity\" values=\"1;0;1\" dur=\"1.5s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>\n <circle cx=\"512\" cy=\"512\" r=\"256\" fill=\"${colors.outer}\" opacity=\"0.6\">\n <animate attributeName=\"r\" values=\"256;384;256\" dur=\"1.5s\" begin=\"0.5s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n <animate attributeName=\"opacity\" values=\"0.6;0;0.6\" dur=\"1.5s\" begin=\"0.5s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>`\n : `<circle cx=\"512\" cy=\"512\" r=\"320\" fill=\"${colors.outer}\"/>`;\n\n // 内圈脉冲动画:与普通脉冲图标保持一致(r=160)\n const innerPulse = animated\n ? `<circle cx=\"512\" cy=\"512\" r=\"160\" fill=\"${colors.inner}\">\n <animate attributeName=\"r\" values=\"160;120;160\" dur=\"1.5s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n </circle>`\n : `<circle cx=\"512\" cy=\"512\" r=\"160\" fill=\"${colors.inner}\"/>`;\n\n // 箭头向前动画:向右平移(三角形箭头,适配内圈 r=160)\n const arrowAnim = animated\n ? `<g>\n <animateTransform attributeName=\"transform\" type=\"translate\" values=\"0 0;18 0;0 0\" dur=\"0.8s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>\n <path d=\"M460 440 L580 512 L460 584 Z\" fill=\"#FFFFFF\"/>\n </g>`\n : `<path d=\"M460 440 L580 512 L460 584 Z\" fill=\"#FFFFFF\"/>`;\n\n return `\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" width=\"${width}\" height=\"${height}\" style=\"overflow:visible;display:block;\">\n ${outerPulse}\n ${innerPulse}\n ${arrowAnim}\n </svg>\n `;\n}\n\n/** 所有脉冲图标名称列表 */\nexport const PULSE_ICONS: PresetIconName[] = [\n 'pulse',\n 'pulse-blue',\n 'pulse-green',\n 'pulse-red',\n 'pulse-orange',\n 'pulse-purple',\n 'pulse-arrow',\n];\n\n/**\n * 生成 Loading Spinner 图标 SVG\n * @description 旋转圆环加载动画\n */\nexport function generateLoadingSpinnerSvg(\n width: number,\n height: number,\n animated: boolean\n): string {\n const rotateAnim = animated\n ? '<animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 512 512\" to=\"360 512 512\" dur=\"1s\" repeatCount=\"indefinite\"/>'\n : '';\n\n return `\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" width=\"${width}\" height=\"${height}\" style=\"overflow:visible;display:block;\">\n <g>${rotateAnim}\n <circle cx=\"512\" cy=\"512\" r=\"360\" fill=\"none\" stroke=\"#E0E0E0\" stroke-width=\"40\"/>\n <path d=\"M512 152 A360 360 0 0 1 872 512\" fill=\"none\" stroke=\"#1890FF\" stroke-width=\"40\" stroke-linecap=\"round\"/>\n </g>\n </svg>\n `;\n}\n\n/**\n * 生成 Loading Dots 图标 SVG\n * @description 跳动圆点加载动画\n */\nexport function generateLoadingDotsSvg(width: number, height: number, animated: boolean): string {\n const dotRadius = 60;\n const spacing = 180;\n const centerX = 512 - spacing;\n const centerY = 512;\n const colors = ['#1890FF', '#52C41A', '#FAAD14'];\n const dots: string[] = [];\n\n for (let i = 0; i < 3; i++) {\n const x = centerX + i * spacing;\n const bounceAnim = animated\n ? `<animate attributeName=\"cy\" values=\"${centerY};${centerY - 80};${centerY}\" dur=\"0.6s\" begin=\"${i * 0.15}s\" repeatCount=\"indefinite\" calcMode=\"spline\" keySplines=\"0.4 0 0.2 1;0.4 0 0.2 1\"/>`\n : '';\n dots.push(\n `<circle cx=\"${x}\" cy=\"${centerY}\" r=\"${dotRadius}\" fill=\"${colors[i]}\" opacity=\"0.9\">${bounceAnim}</circle>`\n );\n }\n\n return `\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" width=\"${width}\" height=\"${height}\" style=\"overflow:visible;display:block;\">\n ${dots.join('\\n ')}\n </svg>\n `;\n}\n\n/** 所有 Loading 图标名称列表 */\nexport const LOADING_ICONS: PresetIconName[] = ['loading-spinner', 'loading-dots'];\n","/**\n * 图标常量集中管理\n * @description 所有图标相关的常量统一在此文件定义\n */\n\nimport type { IconConfig, ClusterIconConfig } from '../types/icon';\n\n// ==================== 预设图标 ====================\n\n/**\n * 所有预设图标名称列表\n */\nexport const PRESET_ICONS = [\n 'marker',\n 'marker-red',\n 'marker-blue',\n 'marker-green',\n 'marker-orange',\n 'marker-yellow',\n 'pulse',\n 'pulse-red',\n 'pulse-blue',\n 'pulse-green',\n 'pulse-orange',\n 'pulse-purple',\n 'pulse-arrow',\n 'point',\n 'position',\n 'position-red',\n 'drone',\n 'down',\n 'tractor',\n 'tractor-2',\n 'tractorTopdown',\n 'truck',\n 'truck-2',\n 'agri-drone',\n 'agri-drone-side',\n 'loading-spinner',\n 'loading-dots',\n 'monitor',\n 'alert',\n 'flag',\n 'target',\n 'wind',\n 'flag-double',\n] as const;\n\n/** SVG 彩色图标(水滴形 pin) */\nexport const SVG_MARKER_ICONS = [\n 'marker-red',\n 'marker-blue',\n 'marker-green',\n 'marker-orange',\n 'marker-yellow',\n] as const;\n\n/** SVG 脉冲图标(带扩散动画) */\nexport const PULSE_ICONS = [\n 'pulse',\n 'pulse-red',\n 'pulse-blue',\n 'pulse-green',\n 'pulse-orange',\n 'pulse-purple',\n 'pulse-arrow',\n] as const;\n\n/** Loading 加载图标 */\nexport const LOADING_ICONS = ['loading-spinner', 'loading-dots'] as const;\n\n/**\n * SelectIcon 组件中支持自定义颜色的图标\n * @description 用于控制哪些图标在 SelectIcon 中显示颜色选择器\n */\nexport const COLOR_ENABLED_ICONS = [\n 'marker',\n 'pulse',\n 'monitor',\n 'alert',\n 'flag',\n 'target',\n 'wind',\n 'flag-double',\n] as const;\n\n/** 支持自定义颜色的图标(全量) */\nexport const COLOR_SUPPORTED_ICONS = [\n 'marker',\n 'pulse',\n 'tractor',\n 'tractor-2',\n 'truck',\n 'truck-2',\n 'agri-drone',\n 'agri-drone-side',\n 'monitor',\n 'alert',\n 'flag',\n 'target',\n 'wind',\n 'flag-double',\n] as const;\n\n// ==================== 图标分组 ====================\n\n/** 图标分组类型 */\nexport type IconGroupType = 'color' | 'sprite' | 'vehicle';\n\n/** 图标分组项 */\nexport interface IconGroupItem {\n type: string;\n name: string;\n}\n\n/** 图标分组 */\nexport interface IconGroup {\n label: string;\n icons: IconGroupItem[];\n}\n\n/** 默认图标分组 */\nexport const DEFAULT_ICON_GROUPS: IconGroup[] = [\n {\n label: '颜色标记',\n icons: [\n { type: 'marker', name: '颜色位置' },\n { type: 'pulse', name: '颜色脉冲' },\n { type: 'monitor', name: '监测站' },\n { type: 'alert', name: '警示警报' },\n { type: 'flag', name: '旗帜' },\n { type: 'target', name: '靶心' },\n { type: 'wind', name: '风向' },\n { type: 'flag-double', name: '双旗帜' },\n ],\n },\n {\n label: '精灵图',\n icons: [\n { type: 'point', name: '圆点' },\n { type: 'position', name: '定位' },\n { type: 'position-red', name: '红点' },\n { type: 'drone', name: '无人机' },\n { type: 'down', name: '下行' },\n ],\n },\n {\n label: '农机设备',\n icons: [\n { type: 'tractor', name: '拖拉机' },\n { type: 'tractor-2', name: '收割机' },\n { type: 'tractorTopdown', name: '农机(俯视)' },\n { type: 'truck', name: '货车' },\n { type: 'truck-2', name: '三轮货车' },\n { type: 'agri-drone', name: '农业无人机' },\n { type: 'agri-drone-side', name: '无人机(侧视)' },\n ],\n },\n];\n\n/** 所有预设图标的名称映射 */\nexport const ICON_NAME_MAP: Record<string, string> = (() => {\n const map: Record<string, string> = {};\n for (const group of DEFAULT_ICON_GROUPS) {\n for (const icon of group.icons) {\n map[icon.type] = icon.name;\n }\n }\n return map;\n})();\n\n// ==================== 预设尺寸 ====================\n\n/** 预设尺寸列表 - 12的倍数 */\nexport const PRESET_SIZES = [24, 36, 48, 60, 72, 84, 96, 108] as const;\n\n// ==================== 预设颜色 ====================\n\n/** DOMPurify 配置:允许 SVG 动画元素 */\nexport const DOMPURIFY_CONFIG = {\n ADD_TAGS: ['animate', 'animateTransform', 'animateMotion', 'set', 'mpath'],\n ADD_ATTR: [\n 'attributeName',\n 'type',\n 'from',\n 'to',\n 'dur',\n 'repeatCount',\n 'begin',\n 'values',\n 'keyTimes',\n 'keySplines',\n 'calcMode',\n ],\n};\n\n// ==================== 默认图标配置 ====================\n\n/** 标注点默认图标 */\nexport const MARKER_DEFAULT_ICON: IconConfig = {\n icon: 'marker-blue',\n iconSize: [48, 48],\n animated: true,\n};\n\n/** 标注点选中图标 */\nexport const MARKER_DEFAULT_SELECTED_ICON: IconConfig = {\n icon: 'marker-red',\n iconSize: [48, 48],\n animated: true,\n};\n\n/** 标注点编辑中图标 */\nexport const MARKER_DEFAULT_EDIT_ICON: IconConfig = {\n icon: 'marker-yellow',\n iconSize: [48, 48],\n animated: true,\n};\n\n/** 聚合气泡图标 */\nexport const CLUSTER_DEFAULT_ICON: ClusterIconConfig = {\n icon: 'pulse-red',\n iconSize: [48, 48],\n animated: true,\n showCount: false,\n};\n\n/** 轨迹起点图标 */\nexport const TRACK_DEFAULT_START_ICON: IconConfig = {\n icon: 'pulse',\n iconSize: 48,\n iconAnchor: [24, 24],\n animated: true,\n};\n\n/** 轨迹终点图标 */\nexport const TRACK_DEFAULT_END_ICON: IconConfig = {\n icon: 'pulse',\n iconSize: 48,\n iconAnchor: [24, 24],\n animated: true,\n};\n\n/** 轨迹播放图标 */\nexport const TRACKPLAYER_DEFAULT_ICON: IconConfig = {\n icon: 'tractorTopdown',\n iconSize: [48, 48],\n};\n\n/** 灌溉渠进水口图标 */\nexport const DEFAULT_INLET_ICON: IconConfig = {\n icon: 'pulse-green',\n iconSize: [48, 48],\n animated: true,\n};\n\n/** 灌溉渠出水口图标 */\nexport const DEFAULT_OUTLET_ICON: IconConfig = {\n icon: 'pulse-orange',\n iconSize: [48, 48],\n animated: true,\n};\n","/**\n * 默认 PathOptions 样式常量\n * @description 集中管理各组件的默认视觉样式,便于全局统一调整\n *\n * ⚠️ 颜色值必须与 src/styles/_variables.scss 中的语义色变量保持同步:\n * PLOT_DEFAULT_PATH.color/fillColor → $color-plot (#1668dc)\n * PLOT_DEFAULT_SELECTED_PATH.color/fillColor → $color-plot-selected (#d32029)\n * PLOT_DEFAULT_EDIT_PATH.color/fillColor → $color-plot-edit (#faad14)\n * PLOT_DEFAULT_HIGHLIGHT_PATH.color/fillColor → $color-plot-highlight (#fa8c16)\n * PLOT_CLIP_FRAGMENT_*.color → $color-success (#52c41a)\n *\n * @since 2.0.0 线段组件样式(Road、Irrigation、Track、TrackPlayer)已迁移到 constants/polylineStyles.ts\n * @since 2.0.0 TrackStyle 类型已迁移到 types/polyline.ts\n * @since 2.1.0 图标常量已迁移到 constants/icon.ts\n */\n\nimport type { PathOptions } from '../types';\n\n// ==================== 图标常量(从 constants/icon.ts 导入)===================\nexport {\n MARKER_DEFAULT_ICON,\n MARKER_DEFAULT_SELECTED_ICON,\n MARKER_DEFAULT_EDIT_ICON,\n CLUSTER_DEFAULT_ICON,\n TRACK_DEFAULT_START_ICON,\n TRACK_DEFAULT_END_ICON,\n TRACKPLAYER_DEFAULT_ICON,\n DEFAULT_INLET_ICON,\n DEFAULT_OUTLET_ICON,\n} from './icon';\nexport type { IconConfig, ClusterIconConfig } from '../types/icon';\n\n// ==================== 地块 PlotLayer ====================\n\n/** 地块默认样式 */\nexport const PLOT_DEFAULT_PATH: PathOptions = {\n color: '#1668dc',\n opacity: 1,\n weight: 2,\n fillColor: '#1668dc',\n fillOpacity: 0.2,\n};\n\n/** 地块选中样式 */\nexport const PLOT_DEFAULT_SELECTED_PATH: PathOptions = {\n color: '#d32029',\n opacity: 1,\n weight: 2,\n fillColor: '#d32029',\n fillOpacity: 0.2,\n};\n\n/** 地块编辑样式 */\nexport const PLOT_DEFAULT_EDIT_PATH: PathOptions = {\n color: '#faad14',\n opacity: 1,\n weight: 2,\n fillColor: '#faad14',\n fillOpacity: 0.2,\n dashArray: '5, 5',\n // 顶点样式默认值\n vertexBorderColor: '#ffffff',\n vertexFillColor: '#d32029',\n vertexFillOpacity: 0.5,\n};\n\n/** 地块高亮样式(分组高亮) */\nexport const PLOT_DEFAULT_HIGHLIGHT_PATH: PathOptions = {\n color: '#fa8c16',\n fillColor: '#fa8c16',\n fillOpacity: 0.4,\n weight: 2,\n};\n\n/** 地块无类型时的回退样式 */\nexport const PLOT_FALLBACK_PATH: PathOptions = {\n fillColor: '#ccc',\n color: '#999',\n weight: 2,\n opacity: 0.8,\n fillOpacity: 0.5,\n};\n\n/** 地块新建绘制时的 PM 样式 */\nexport const PLOT_PM_CREATE_OPTIONS: PathOptions = {\n color: '#1890ff',\n fillColor: '#1890ff',\n fillOpacity: 0.3,\n weight: 2,\n};\n\n/** 地块剪切碎片默认样式 */\nexport const PLOT_CLIP_FRAGMENT_DEFAULT: PathOptions = {\n color: '#52c41a',\n weight: 2,\n fillColor: '#52c41a',\n fillOpacity: 0.3,\n dashArray: '8, 6',\n};\n\n/** 地块剪切碎片选中样式 */\nexport const PLOT_CLIP_FRAGMENT_SELECTED: PathOptions = {\n color: '#52c41a',\n weight: 3,\n fillColor: '#52c41a',\n fillOpacity: 0.4,\n dashArray: '',\n};\n\n// ==================== 公共 PM 绘制样式 ====================\n\n/** PM 绘制时的临时线样式(templineStyle) */\nexport const PM_TEMPLATE_LINE_STYLE: PathOptions = {\n color: '#1677ff',\n weight: 4,\n dashArray: '10, 10',\n};\n\n/** PM 绘制时的提示线样式(hintlineStyle) */\nexport const PM_HINT_LINE_STYLE: PathOptions = {\n color: '#1677ff',\n weight: 2,\n dashArray: '5, 5',\n};\n\n/** 灌溉渠 PM 编辑器全局样式 */\nexport const IRRIGATION_PM_PATH_OPTIONS: PathOptions = {\n color: '#1E90FF',\n weight: 4,\n};\n\n// ==================== Loading 加载组件 ====================\n\n/** Loading 遮罩默认背景色 */\nexport const LOADING_DEFAULT_MASK_BACKGROUND = 'rgba(0, 0, 0, 0.5)';\n\n/** Loading 遮罩默认层级 */\nexport const LOADING_DEFAULT_MASK_ZINDEX = 1000;\n\n/** Loading 遮罩默认配置 */\nexport const LOADING_DEFAULT_MASK = {\n background: LOADING_DEFAULT_MASK_BACKGROUND,\n zIndex: LOADING_DEFAULT_MASK_ZINDEX,\n} as const;\n","/**\n * @fileoverview Loading 加载组件\n * @description 显示加载状态的组件,支持多种加载图标和自定义配置\n * @module components/Loading\n */\n\nimport { useMemo } from 'react';\nimport type { LoadingProps, LoadingMaskConfig } from '../../types';\nimport { generateLoadingSpinnerSvg, generateLoadingDotsSvg } from '../../utils/pulseIcon';\nimport {\n LOADING_DEFAULT_MASK_BACKGROUND,\n LOADING_DEFAULT_MASK_ZINDEX,\n} from '../../constants/styles';\n\n/**\n * Loading 加载组件\n *\n * @description\n * 显示加载状态,支持以下功能:\n * - 多种加载图标:loading-spinner(旋转圆圈)、loading-dots(跳动圆点)\n * - 自定义尺寸:small、default、large 或数字\n * - 描述文案:可选的加载提示文字\n * - 遮罩配置:支持自定义背景色、层级等\n *\n * @example\n * ```tsx\n * import { Loading } from 'agri-map-components';\n *\n * // 基础用法\n * <Loading />\n *\n * // 自定义图标和描述\n * <Loading icon=\"loading-dots\" description=\"加载中...\" />\n *\n * // 自定义尺寸\n * <Loading size=\"large\" />\n * <Loading size={64} />\n *\n * // 带遮罩\n * <Loading mask />\n * <Loading mask={{ background: 'rgba(0, 0, 0, 0.5)', zIndex: 999 }} />\n *\n * // 在 Marker 中使用\n * <Marker loading={true} />\n * ```\n */\nconst Loading: React.FC<LoadingProps> = ({\n icon = 'loading-spinner',\n description,\n size = 'default',\n mask,\n className,\n style,\n}) => {\n // 计算图标尺寸\n const iconSize = useMemo(() => {\n const sizeMap: Record<string, number> = {\n small: 24,\n default: 32,\n large: 48,\n };\n\n if (typeof size === 'number') {\n return size;\n }\n return sizeMap[size] || sizeMap.default;\n }, [size]);\n\n // 解析遮罩配置\n const maskConfig = useMemo((): LoadingMaskConfig => {\n // 明确禁用遮罩\n if (mask === false || mask === null) {\n return { enabled: false };\n }\n // mask 为 true 或未设置时,默认启用遮罩\n if (mask === true || mask === undefined) {\n return { enabled: true };\n }\n // 传入对象时,除非明确设置 enabled: false,否则启用\n return {\n enabled: mask.enabled ?? true,\n background: mask.background,\n zIndex: mask.zIndex,\n };\n }, [mask]);\n\n // 生成 SVG\n const svgContent = useMemo(() => {\n switch (icon) {\n case 'loading-dots':\n return generateLoadingDotsSvg(iconSize, iconSize, true);\n case 'loading-spinner':\n default:\n return generateLoadingSpinnerSvg(iconSize, iconSize, true);\n }\n }, [icon, iconSize]);\n\n const content = (\n <div\n className={`agri-loading ${className || ''}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: description ? 8 : 0,\n ...style,\n }}\n >\n <div\n className=\"agri-loading-icon\"\n dangerouslySetInnerHTML={{ __html: svgContent }}\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n />\n {description && (\n <span className=\"agri-loading-description\" style={{ color: '#666', fontSize: 14 }}>\n {description}\n </span>\n )}\n </div>\n );\n\n // 如果启用遮罩,包裹遮罩层\n if (maskConfig.enabled) {\n return (\n <div\n className=\"agri-loading-mask\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: maskConfig.background || LOADING_DEFAULT_MASK_BACKGROUND,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: maskConfig.zIndex ?? LOADING_DEFAULT_MASK_ZINDEX,\n pointerEvents: 'none',\n }}\n >\n {content}\n </div>\n );\n }\n\n return content;\n};\n\nexport default Loading;\n","/**\n * 地图容器组件\n * @description 集成 MapProvider 和自动渲染功能,提供一站式地图容器\n * @since 2.0.0\n * @since 2.0.0 使用自定义 ZoomControl 替代 Leaflet 原生缩放控件\n * @since 2.1.0 使用 memo 包装,避免父组件状态变化导致不必要的重新渲染\n *\n * ## 修复记录 (2024-06-08)\n *\n * **问题**: 当父组件状态变化时(如修改 Marker 图标配置),MapContainer 会重新渲染,\n * 导致 TianDiTuLayer 的 useEffect 重新执行,瓦片图层被删除并重新创建,触发大量瓦片请求。\n *\n * **原因**: MapContainer 没有使用 memo 包装,即使 props 没有变化,也会在父组件重新渲染时重新渲染。\n *\n * **修复方案**: 使用 `memo<MapContainerProps>(function MapContainer(...) {...})` 包装组件,\n * 只有当 props 变化时才重新渲染。\n */\n\nimport React, { useMemo, memo } from 'react';\nimport type L from 'leaflet';\nimport { MapProvider } from '../../context/MapContext';\nimport { useTheme } from '../../context/ThemeContext';\nimport { ConfigContext, type ConfigContextValue } from '../../context/ConfigContext';\nimport DualScaleControl from '../DualScaleControl';\nimport TianDiTuLayer from '../TianDiTuLayer';\nimport MapSizeHandler from '../MapSizeHandler';\nimport ZoomControl from '../ZoomControl';\nimport FullscreenControl from '../FullscreenControl';\nimport Loading from '../Loading';\nimport type {\n DualScaleControlConfig,\n MapSizeHandlerConfig,\n TianDiTuLayerConfig,\n LoadingProps,\n ZoomControlPosition,\n FullscreenControlPosition,\n MapLifecycleConfig,\n PathOptions,\n PolylineStyle,\n IconConfig,\n AntPathConfig,\n ClusterIconConfig,\n} from '../../types';\n\n// 重导出 useConfig,保持 API 兼容\nexport { useConfig } from '../../context/ConfigContext';\n\n// ========== 类型定义 ==========\n\n/**\n * 缩放控件配置\n */\nexport interface ZoomControlConfig {\n /** 控件位置 */\n position?: ZoomControlPosition;\n /** 控件背景色 */\n controlBg?: string;\n /** 控件文字颜色 */\n controlText?: string;\n}\n\n/**\n * 全屏控件配置\n * @since 2.1.0\n */\nexport interface FullscreenControlConfig {\n /** 控件位置,默认 'topleft' */\n position?: FullscreenControlPosition;\n /** 控件背景色 */\n controlBg?: string;\n /** 控件文字颜色 */\n controlText?: string;\n}\n\n/**\n * 地图容器属性\n */\nexport interface MapContainerProps {\n /** 子组件 */\n children?: React.ReactNode;\n // ========== 地图基础配置 ==========\n /** 中心点 */\n center: [number, number];\n /**\n * 缩放级别\n * @default 12\n */\n zoom?: number;\n /** 样式 */\n style?: React.CSSProperties;\n /** 类名 */\n className?: string;\n /**\n * 容器宽度\n * @description 支持数字(默认单位 px)或字符串(如 '100%', '800px')\n * @default '100%'\n */\n width?: string | number;\n /**\n * 容器高度\n * @description 支持数字(默认单位 px)或字符串(如 '480px', '100vh')\n * @default 480\n */\n height?: string | number;\n /**\n * 容器圆角\n * @description 支持数字(默认单位 px)或字符串(如 '8px', '50%')\n * @default 8\n */\n radius?: string | number;\n /** CRS 坐标系 */\n crs?: L.CRS;\n /** 最大缩放 */\n maxZoom?: number;\n /** 最小缩放 */\n minZoom?: number;\n /** 是否启用滚轮缩放 */\n scrollWheelZoom?: boolean;\n /**\n * 缩放控件配置\n * @description 传入 true 显示默认自定义缩放控件,传入对象自定义配置,false 不显示\n * @since 2.0.0 使用自定义 ZoomControl 替代 Leaflet 原生\n */\n zoomControl?: boolean | ZoomControlConfig;\n /** 是否显示归属控件 */\n attributionControl?: boolean;\n /** 地图就绪回调 */\n whenReady?: (map: L.Map) => void;\n // ========== 配置 ==========\n /** 主题模式 */\n theme?: 'light' | 'dark';\n /**\n * 双向标尺配置\n * @description 传入 true 显示默认配置,传入对象自定义配置,不传或 false 不显示\n */\n dualScaleControl?: boolean | DualScaleControlConfig;\n /**\n * 天地图图层配置\n * @description 配置后自动渲染 TianDiTuLayer\n */\n tianDiTuLayer?: TianDiTuLayerConfig | false;\n /**\n * 地图尺寸处理器配置\n * @description 传入 true 启用默认配置,传入对象自定义配置,不传或 false 不启用\n */\n mapSizeHandler?: boolean | MapSizeHandlerConfig;\n /**\n * 加载状态配置\n * @description 传入 true 显示默认加载动画,传入对象自定义配置,不传或 false 不显示\n * @example\n * // 显示默认加载\n * <MapContainer loading />\n *\n * // 自定义加载\n * <MapContainer loading={{ description: '加载中...', icon: 'loading-dots' }} />\n */\n loading?: boolean | LoadingProps;\n /**\n * 全屏控件\n * @description 传入 true 显示默认全屏按钮,传入对象自定义配置,传入字符串指定位置,不传或 false 不显示\n * @since 2.1.0\n * @example\n * // 显示默认全屏按钮(左上角)\n * <MapContainer fullscreen />\n *\n * // 指定位置\n * <MapContainer fullscreen=\"topright\" />\n *\n * // 自定义配置\n * <MapContainer fullscreen={{ position: 'topright', controlBg: 'rgba(0, 0, 0, 0.8)' }} />\n */\n fullscreen?: boolean | FullscreenControlConfig | FullscreenControlPosition;\n /**\n * 地图生命周期回调配置\n * @description 极简方案:只保留 onMapReady 和 onViewportChange\n * @since 1.4.0\n * @example\n * ```tsx\n * lifecycle={{\n * onMapReady: ({ map }) => console.log('地图就绪'),\n * onViewportChange: (data) => saveViewport(data),\n * }}\n * ```\n */\n lifecycle?: MapLifecycleConfig;\n /**\n * 组件默认配置\n * @description 统一配置各组件的默认属性\n * @example\n * ```tsx\n * config={{\n * plotLayer: {\n * editing: { color: '#faad14', fillColor: '#faad14' },\n * },\n * }}\n * ```\n */\n config?: {\n plotLayer?: {\n editing?: PathOptions | null | false;\n };\n marker?: {\n editing?: IconConfig | null | false;\n };\n road?: {\n default?: PolylineStyle | null | false;\n selected?: PolylineStyle | null | false;\n editing?: PolylineStyle | null | false;\n antPath?: AntPathConfig | null | false;\n };\n irrigation?: {\n default?: PolylineStyle | null | false;\n selected?: PolylineStyle | null | false;\n editing?: PolylineStyle | null | false;\n antPath?: AntPathConfig | null | false;\n inlet?: IconConfig | null | false;\n outlet?: IconConfig | null | false;\n };\n track?: {\n default?: PolylineStyle | null | false;\n nonWorking?: PolylineStyle | null | false;\n selected?: PolylineStyle | null | false;\n start?: IconConfig | null | false;\n end?: IconConfig | null | false;\n cluster?: ClusterIconConfig | null | false;\n };\n };\n}\n\n// ========== 辅助函数 ==========\n\n/** 解析 dualScaleControl 配置 */\nconst getDualScaleControlConfig = (\n config: boolean | DualScaleControlConfig | undefined\n): DualScaleControlConfig | false | undefined => {\n if (config === undefined || config === false) {\n return false;\n }\n return config === true ? {} : config;\n};\n\n/** 解析 mapSizeHandler 配置 */\nconst getMapSizeHandlerConfig = (\n config: boolean | MapSizeHandlerConfig | undefined\n): MapSizeHandlerConfig | false => {\n if (config === undefined || config === false) {\n return false;\n }\n return config === true ? {} : config;\n};\n\n/** 解析 zoomControl 配置 */\nconst getZoomControlConfig = (\n config: boolean | ZoomControlConfig | undefined\n): ZoomControlConfig | false => {\n if (config === undefined || config === false) {\n return false;\n }\n return config === true ? {} : config;\n};\n\n/** 解析 fullscreen 配置 */\nconst getFullscreenControlConfig = (\n config: boolean | FullscreenControlConfig | FullscreenControlPosition | undefined\n): FullscreenControlConfig | false => {\n if (config === undefined || config === false) {\n return false;\n }\n // 如果是字符串(位置),转换为配置对象\n if (typeof config === 'string') {\n return { position: config };\n }\n return config === true ? {} : config;\n};\n\n// ========== 组件 ==========\n\n/**\n * 地图容器组件\n * 集成地图实例上下文、配置上下文和自动渲染功能\n *\n * @example\n * ```tsx\n * // 基础用法(默认 width: 100%, height: 480px)\n * <MapContainer center={[30, 120]} zoom={10}>\n * <Marker dataSource={data} />\n * </MapContainer>\n *\n * // 自定义尺寸(数字,单位 px)\n * <MapContainer center={[30, 120]} zoom={10} width={800} height={600}>\n * <Marker dataSource={data} />\n * </MapContainer>\n *\n * // 自定义尺寸(字符串,支持 px、%、vh 等单位)\n * <MapContainer center={[30, 120]} zoom={10} width=\"100%\" height=\"800px\">\n * <Marker dataSource={data} />\n * </MapContainer>\n *\n * // 使用 style 覆盖尺寸\n * <MapContainer center={[30, 120]} zoom={10} style={{ height: '100vh' }}>\n * <Marker dataSource={data} />\n * </MapContainer>\n *\n * // 自定义圆角\n * <MapContainer center={[30, 120]} zoom={10} radius={12}>\n * <Marker dataSource={data} />\n * </MapContainer>\n *\n * // 带天地图和标尺\n * <MapContainer\n * center={[30, 120]}\n * zoom={10}\n * tianDiTuLayer={{ apiKey: 'your-key' }}\n * dualScaleControl\n * >\n * <Marker dataSource={data} />\n * </MapContainer>\n *\n * // 深色主题\n * <MapContainer\n * center={[30, 120]}\n * zoom={10}\n * theme=\"dark\"\n * tianDiTuLayer={{ apiKey: 'your-key', layerType: 'satellite' }}\n * dualScaleControl={{ showZoomControl: true }}\n * mapSizeHandler\n * >\n * <PlotLayer dataSource={plots} />\n * </MapContainer>\n * ```\n */\nexport const MapContainer = memo<MapContainerProps>(function MapContainer({\n children,\n center,\n zoom = 12,\n style,\n className,\n width,\n height,\n radius = 8,\n crs,\n maxZoom = 22,\n minZoom,\n scrollWheelZoom = true,\n zoomControl = false,\n attributionControl = true,\n whenReady,\n theme: themeProp,\n dualScaleControl,\n tianDiTuLayer,\n mapSizeHandler,\n loading,\n fullscreen,\n lifecycle,\n config,\n}: MapContainerProps) {\n // 从全局 ThemeContext 读取主题,props.theme 优先\n const { theme: globalTheme } = useTheme();\n const theme = themeProp ?? globalTheme;\n\n // 合并尺寸样式:默认 width: '100%', height: 480\n const mergedStyle = useMemo((): React.CSSProperties => {\n const defaultStyle: React.CSSProperties = {\n width: '100%',\n height: 480,\n borderRadius: typeof radius === 'number' ? `${radius}px` : radius,\n };\n\n // 处理 width 和 height 属性\n if (width !== undefined) {\n defaultStyle.width = typeof width === 'number' ? `${width}px` : width;\n }\n if (height !== undefined) {\n defaultStyle.height = typeof height === 'number' ? `${height}px` : height;\n }\n\n // 合并用户传入的 style,用户 style 优先\n return { ...defaultStyle, ...style };\n }, [width, height, style, radius]);\n\n // 解析后的配置\n const dualScaleConfig = getDualScaleControlConfig(dualScaleControl);\n const mapSizeConfig = getMapSizeHandlerConfig(mapSizeHandler);\n const zoomControlConfig = getZoomControlConfig(zoomControl);\n const fullscreenConfig = getFullscreenControlConfig(fullscreen);\n\n // 地图选项:当使用自定义 ZoomControl 时,禁用 Leaflet 原生 zoomControl\n const mapOptions: L.MapOptions = useMemo(\n () => ({\n crs,\n maxZoom,\n minZoom,\n scrollWheelZoom,\n zoomControl: zoomControlConfig !== false ? false : false, // 始终禁用原生,使用自定义\n attributionControl,\n }),\n [crs, maxZoom, minZoom, scrollWheelZoom, zoomControlConfig, attributionControl]\n );\n\n // 配置上下文值\n const configValue = useMemo((): ConfigContextValue => {\n const tianDiTuLayerValue: TianDiTuLayerConfig | false =\n tianDiTuLayer === false || !tianDiTuLayer ? false : tianDiTuLayer;\n\n return {\n theme,\n dualScaleControl: dualScaleConfig,\n tianDiTuLayer: tianDiTuLayerValue,\n mapSizeHandler: mapSizeConfig,\n ...config,\n };\n }, [theme, dualScaleConfig, tianDiTuLayer, mapSizeConfig, config]);\n\n return (\n <ConfigContext.Provider value={configValue}>\n <MapProvider\n center={center}\n zoom={zoom}\n style={mergedStyle}\n className={className}\n options={mapOptions}\n onReady={whenReady}\n lifecycle={lifecycle}\n >\n {/* 自动渲染地图尺寸处理器 */}\n {mapSizeConfig !== false && (\n <MapSizeHandler\n enabled={mapSizeConfig?.enabled}\n delay={mapSizeConfig?.delay}\n retries={mapSizeConfig?.retries}\n />\n )}\n\n {/* 自动渲染天地图图层 */}\n {tianDiTuLayer !== false && tianDiTuLayer && (\n <TianDiTuLayer\n apiKey={tianDiTuLayer.apiKey}\n layerType={tianDiTuLayer.layerType}\n showAnnotation={tianDiTuLayer.showAnnotation}\n overlayUrl={tianDiTuLayer.overlayUrl}\n subdomains={tianDiTuLayer.subdomains}\n maxZoom={tianDiTuLayer.maxZoom}\n minZoom={tianDiTuLayer.minZoom}\n showLayerSelector={tianDiTuLayer.showLayerSelector}\n />\n )}\n\n {/* 自动渲染双向标尺 */}\n {dualScaleConfig !== false && <DualScaleControl />}\n\n {/* 自动渲染缩放控件 */}\n {zoomControlConfig !== false && (\n <ZoomControl\n position={zoomControlConfig?.position}\n controlBg={zoomControlConfig?.controlBg}\n controlText={zoomControlConfig?.controlText}\n />\n )}\n\n {/* 自动渲染全屏控件 */}\n {fullscreenConfig !== false && (\n <FullscreenControl\n position={fullscreenConfig?.position}\n controlBg={fullscreenConfig?.controlBg}\n controlText={fullscreenConfig?.controlText}\n />\n )}\n\n {/* 用户子组件 */}\n {children}\n\n {/* 加载状态 */}\n {loading && <Loading mask {...(typeof loading === 'object' ? loading : {})} />}\n </MapProvider>\n </ConfigContext.Provider>\n );\n});\n\nMapContainer.displayName = 'MapContainer';\n\nexport default MapContainer;\n","/**\n * 主题配置常量\n * @description 集中管理所有主题相关的颜色和样式配置\n *\n * ⚠️ 颜色值必须与 src/styles/_variables.scss 中的主题变量保持同步:\n * light.controlBg → $theme-light-control-bg\n * light.primaryColor → $theme-light-primary / $color-primary\n * dark.controlBg → $theme-dark-control-bg\n * dark.primaryColor → $theme-dark-primary / $dark-color-primary\n */\n\n/**\n * 主题模式类型\n */\nexport type ThemeMode = 'light' | 'dark';\n\n/**\n * 主题颜色配置接口\n * @deprecated 请使用 CSS 变量或 SCSS 变量获取主题颜色,此接口将在下个大版本移除\n */\nexport interface ThemeColors {\n /** 控件背景色 */\n controlBg: string;\n /** 控件文字颜色 */\n controlText: string;\n /** 主色调 */\n primaryColor: string;\n /** 边框颜色 */\n borderColor: string;\n /** 阴影颜色 */\n shadowColor: string;\n}\n\n/**\n * 主题配置映射\n * @deprecated 请使用 CSS 变量或 SCSS 变量获取主题颜色,此接口将在下个大版本移除\n */\nexport const THEME_CONFIG: Record<ThemeMode, ThemeColors> = {\n light: {\n controlBg: 'rgba(255, 255, 255, 0.85)',\n controlText: '#333',\n primaryColor: '#1677ff',\n borderColor: 'rgba(0, 0, 0, 0.1)',\n shadowColor: '0 2px 8px rgba(0, 0, 0, 0.15)',\n },\n dark: {\n controlBg: 'rgba(0, 0, 0, 0.7)',\n controlText: '#fff',\n primaryColor: '#66bb6a',\n borderColor: 'rgba(255, 255, 255, 0.2)',\n shadowColor: '0 2px 8px rgba(0, 0, 0, 0.3)',\n },\n};\n\n/**\n * 根据主题获取颜色配置\n * @deprecated 请使用 CSS 变量或 SCSS 变量获取主题颜色,此函数将在下个大版本移除\n * @param theme 主题模式\n * @returns 主题颜色配置\n */\nexport const getThemeColors = (theme: ThemeMode): ThemeColors => {\n return THEME_CONFIG[theme];\n};\n\n/**\n * CSS 变量映射(用于 JS 运行时设置 CSS 变量给非 Leaflet 控件)\n * ⚠️ 值必须与 src/styles/_variables.scss 保持同步\n */\nexport const THEME_CSS_VARS: Record<ThemeMode, Record<string, string>> = {\n light: {\n '--control-bg': 'rgba(255, 255, 255, 0.85)',\n '--control-text': '#333',\n '--primary-color': '#1677ff',\n '--border-color': 'rgba(0, 0, 0, 0.1)',\n },\n dark: {\n '--control-bg': 'rgba(0, 0, 0, 0.7)',\n '--control-text': '#fff',\n '--primary-color': '#66bb6a',\n '--border-color': 'rgba(255, 255, 255, 0.2)',\n },\n};\n","/**\n * 主题 Hook\n * @description 提供统一的主题访问接口\n */\n\nimport { useConfig } from '../components/MapContainer';\nimport { getThemeColors, type ThemeMode, type ThemeColors } from '../constants/theme';\n\n/**\n * 获取当前主题及颜色配置的 Hook\n * @returns 主题模式和颜色配置\n */\nexport const useTheme = (): { theme: ThemeMode; colors: ThemeColors } => {\n const config = useConfig();\n const theme: ThemeMode = config.theme || 'light';\n return {\n theme,\n colors: getThemeColors(theme),\n };\n};\n","/**\n * @fileoverview 农业图层统一生命周期管理 Hook\n * @description 为 PlotLayer、Road、Irrigation、Marker 提供统一的生命周期管理\n * @since 1.4.0\n * @module hooks/useLifecycle\n *\n * @example\n * ```tsx\n * // 在组件中使用\n * useLifecycle<'PlotLayer'>({\n * componentType: 'PlotLayer',\n * lifecycle,\n * dataSource: normalizedDataSource,\n * currentState: { mode: editMode, prevMode, plotId: selectedPlotId },\n * isRendered: layersReady,\n * renderStats: { totalCount, renderedCount, virtualized },\n * });\n * ```\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any, react-hooks/exhaustive-deps -- 状态机需要 */\n\nimport { useEffect, useRef } from 'react';\nimport type {\n AgriculturalComponentType,\n LifecycleConfig,\n LifecycleRenderStats,\n StateChangeMap,\n} from '../types/lifecycle';\n\n/**\n * useLifecycle 配置选项\n * @template T - 组件类型\n */\nexport interface UseLifecycleOptions<T extends AgriculturalComponentType> {\n /** 组件类型标识 */\n componentType: T;\n /** 生命周期回调配置 */\n lifecycle?: LifecycleConfig<T>;\n /** 标准化后的数据源 */\n dataSource: any[];\n /** 当前状态对象(不同组件类型有不同的状态结构) */\n currentState: T extends keyof StateChangeMap ? StateChangeMap[T] : any;\n /** 上一个状态对象 */\n prevState?: T extends keyof StateChangeMap ? StateChangeMap[T] : any;\n /** 是否已完成首次渲染 */\n isRendered: boolean;\n /** 渲染统计信息 */\n renderStats?: Omit<LifecycleRenderStats, 'componentType'>;\n}\n\n/**\n * 农业图层统一生命周期管理 Hook\n * @description 管理组件的挂载、渲染、状态变化、卸载四个关键生命周期节点\n *\n * @param options - 配置选项\n * @returns void\n *\n * @example\n * ```tsx\n * function PlotLayer({ dataSource, editMode, lifecycle }) {\n * const selectedPlotId = useSelectedPlotId();\n * const layersReady = useLayersReady();\n *\n * useLifecycle<'PlotLayer'>({\n * componentType: 'PlotLayer',\n * lifecycle,\n * dataSource,\n * currentState: {\n * mode: editMode,\n * prevMode: prevEditModeRef.current,\n * plotId: selectedPlotId,\n * },\n * isRendered: layersReady,\n * renderStats: {\n * totalCount: dataSource.length,\n * renderedCount: visiblePlots.length,\n * virtualized: isVirtualized,\n * },\n * });\n *\n * return ...;\n * }\n * ```\n */\nexport function useLifecycle<T extends AgriculturalComponentType>(\n options: UseLifecycleOptions<T>\n): void {\n const {\n componentType,\n lifecycle,\n dataSource,\n currentState,\n prevState: _prevState,\n isRendered,\n renderStats,\n } = options;\n\n const isMounted = useRef(false);\n const hasRendered = useRef(false);\n const prevStatusRef = useRef<any>(null);\n const dataLengthRef = useRef<number>(0);\n\n // 使用 ref 存储 lifecycle 和 dataSource,避免依赖数组变化导致循环\n const lifecycleRef = useRef(lifecycle);\n const dataSourceRef = useRef(dataSource);\n const renderStatsRef = useRef(renderStats);\n\n // 更新 ref\n lifecycleRef.current = lifecycle;\n dataSourceRef.current = dataSource;\n renderStatsRef.current = renderStats;\n\n // ========== MOUNT: 第一次数据挂载之前 ==========\n useEffect(() => {\n // 检测数据源变化(重新挂载的情况)\n if (dataLengthRef.current !== dataSource.length) {\n dataLengthRef.current = dataSource.length;\n // 数据变化时重置状态,允许重新触发生命周期\n isMounted.current = false;\n hasRendered.current = false;\n }\n\n // 防止重复执行\n if (isMounted.current) {\n return;\n }\n\n // 调用 onBeforeMount 回调,可进行数据验证\n const shouldContinue = lifecycleRef.current?.onBeforeMount?.(dataSourceRef.current);\n\n // 如果返回 false,阻止组件挂载\n if (shouldContinue === false) {\n console.warn(`[${componentType}] Mount aborted by onBeforeMount`);\n return;\n }\n\n // 标记为已挂载\n isMounted.current = true;\n }, [dataSource.length]);\n\n // ========== MOUNT: 第一次渲染完成 ==========\n useEffect(() => {\n // 修复:如果 isRendered=true 但 isMounted=false,说明是重新挂载\n // 需要先触发 onBeforeMount,然后标记为已挂载\n if (!isMounted.current && isRendered && renderStats) {\n const shouldContinue = lifecycleRef.current?.onBeforeMount?.(dataSourceRef.current);\n if (shouldContinue === false) {\n console.warn(`[${componentType}] Mount aborted by onBeforeMount`);\n return;\n }\n isMounted.current = true;\n }\n\n // 必须满足以下条件才触发:\n // 1. 组件已挂载\n // 2. 图层已渲染完成\n // 3. 尚未触发过 firstRender(防止重复触发)\n // 4. 有渲染统计数据\n if (!isMounted.current || !isRendered || hasRendered.current || !renderStats) {\n return;\n }\n\n // 标记为已渲染\n hasRendered.current = true;\n\n // 调用 onFirstRender 回调,直接使用当前 renderStats 参数\n lifecycleRef.current?.onFirstRender?.({\n totalCount: renderStats.totalCount,\n renderedCount: renderStats.renderedCount,\n virtualized: renderStats.virtualized,\n componentType,\n });\n }, [\n isRendered,\n renderStats?.totalCount,\n renderStats?.renderedCount,\n renderStats?.virtualized,\n componentType,\n ]);\n\n // ========== UPDATE: 状态变化 ==========\n useEffect(() => {\n // 必须当前状态有效才处理\n if (!currentState) {\n return;\n }\n\n // 获取上一个状态\n const prevStatus = prevStatusRef.current;\n\n // 比较状态是否发生变化(根据具体状态结构比较)\n const stateChanged =\n !prevStatus ||\n ('mode' in prevStatus && 'mode' in currentState && prevStatus.mode !== currentState.mode) ||\n ('plotId' in prevStatus &&\n 'plotId' in currentState &&\n prevStatus.plotId !== currentState.plotId) ||\n ('action' in prevStatus &&\n 'action' in currentState &&\n prevStatus.action !== currentState.action) ||\n ('roadId' in prevStatus &&\n 'roadId' in currentState &&\n prevStatus.roadId !== currentState.roadId) ||\n ('irrigationId' in prevStatus &&\n 'irrigationId' in currentState &&\n prevStatus.irrigationId !== currentState.irrigationId) ||\n ('markerId' in prevStatus &&\n 'markerId' in currentState &&\n prevStatus.markerId !== currentState.markerId);\n\n if (stateChanged) {\n // 调用 onStateChange 回调,传入新旧状态\n lifecycleRef.current?.onStateChange?.({\n ...currentState,\n prevStatus,\n });\n\n // 更新上一个状态引用\n prevStatusRef.current = currentState;\n }\n }, [currentState, componentType]);\n\n // ========== UNMOUNT: 组件卸载前 ==========\n useEffect(() => {\n // 返回清理函数,在组件卸载时执行\n return () => {\n // 只有已挂载的组件才需要清理\n if (!isMounted.current) {\n return;\n }\n\n // 调用 onBeforeUnmount 回调,可进行异步保存等操作\n lifecycleRef.current?.onBeforeUnmount?.();\n\n // 标记为已卸载\n isMounted.current = false;\n };\n }, []);\n}\n\nexport default useLifecycle;\n","/**\n * 解析编辑模式的 Hook\n * @description 统一处理各组件的 editMode 属性解析逻辑\n */\n\nimport { useMemo } from 'react';\nimport type { ReactNode } from 'react';\nimport type { ToolbarColor, ToolbarSize } from '../components/shared/BaseEditToolbar';\n\n/**\n * 编辑模式对象配置\n */\nexport interface EditModeObjectConfig<T extends string> {\n /** 启用的编辑按钮 */\n enabled?: boolean | T[];\n /** 自定义工具栏内容 */\n toolbar?: ReactNode;\n /** 内置按钮的统一颜色(支持预设色和自定义颜色) */\n color?: ToolbarColor;\n /** 内置按钮的统一尺寸(支持预设尺寸和自定义数字) */\n size?: ToolbarSize;\n /** 是否仅显示图标(不显示文字) */\n iconOnly?: boolean;\n}\n\n/**\n * 编辑模式类型\n * - `false`: 禁用编辑\n * - `true`: 启用全部编辑功能\n * - `T[]`: 启用指定的编辑按钮\n * - `EditModeObjectConfig<T>`: 对象配置,支持自定义工具栏\n */\nexport type EditModeConfig<T extends string> = boolean | T[] | EditModeObjectConfig<T>;\n\n/**\n * 编辑模式解析结果\n */\nexport interface EditModeResult<T extends string> {\n /** 是否启用编辑模式 */\n editEnabled: boolean;\n /** 启用的按钮列表 */\n enabledButtons: T[];\n /** 自定义工具栏内容 */\n customToolbar?: ReactNode;\n /** 内置按钮的统一颜色 */\n color?: ToolbarColor;\n /** 内置按钮的统一尺寸 */\n size?: ToolbarSize;\n /** 是否仅显示图标 */\n iconOnly?: boolean;\n}\n\n/**\n * 解析编辑模式配置\n * @param editModeProp 编辑模式属性值\n * @param defaultButtons 当 editMode 为 true 时默认启用的按钮\n * @returns EditModeResult\n *\n * @example\n * ```ts\n * // PlotLayer\n * const { editEnabled, enabledButtons } = useEditMode(\n * editModeProp,\n * ['redraw', 'clip', 'move', 'create', 'delete'] as const\n * );\n *\n * // Marker\n * const { editEnabled, enabledButtons } = useEditMode(\n * editModeProp,\n * ['create', 'move', 'delete'] as const\n * );\n *\n * // 使用对象配置\n * const { editEnabled, enabledButtons, customToolbar } = useEditMode(\n * { enabled: ['create', 'move'], toolbar: <Button>自定义</Button> },\n * ['create', 'move', 'delete'] as const\n * );\n * ```\n */\nexport function useEditMode<T extends string>(\n editModeProp: EditModeConfig<T> | undefined,\n defaultButtons: readonly T[]\n): EditModeResult<T> {\n return useMemo(() => {\n // 处理 undefined 或 false\n if (editModeProp === undefined || editModeProp === false) {\n return { editEnabled: false, enabledButtons: [] };\n }\n\n // 处理 true\n if (editModeProp === true) {\n return { editEnabled: true, enabledButtons: [...defaultButtons] };\n }\n\n // 处理数组\n if (Array.isArray(editModeProp)) {\n return { editEnabled: true, enabledButtons: editModeProp };\n }\n\n // 处理对象配置\n if (typeof editModeProp === 'object') {\n const { enabled, toolbar, color, size, iconOnly } = editModeProp;\n\n if (enabled === false) {\n return {\n editEnabled: false,\n enabledButtons: [],\n customToolbar: toolbar,\n color,\n size,\n iconOnly,\n };\n }\n\n if (enabled === true || enabled === undefined) {\n return {\n editEnabled: true,\n enabledButtons: [...defaultButtons],\n customToolbar: toolbar,\n color,\n size,\n iconOnly,\n };\n }\n\n if (Array.isArray(enabled)) {\n return {\n editEnabled: true,\n enabledButtons: enabled,\n customToolbar: toolbar,\n color,\n size,\n iconOnly,\n };\n }\n }\n\n return { editEnabled: false, enabledButtons: [] };\n }, [editModeProp, defaultButtons]);\n}\n\nexport default useEditMode;\n","/**\n * @fileoverview 线要素渲染 hook(共享逻辑)\n * @description 提取 Irrigation 和 Road 组件中重复的图层管理逻辑:\n * - 主渲染 useEffect 的图层创建/销毁/编辑模式过滤\n * - 组件卸载时清理编辑图层 (editingLayerRef)\n * @module hooks/usePolylineRenderer\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- 泛型约束需要 */\n\nimport { useEffect, useRef, type MutableRefObject } from 'react';\nimport L from 'leaflet';\n\ninterface UsePolylineRendererOptions<T = unknown> {\n map: L.Map | null;\n normalizedData: T[];\n value: string | number | null;\n currentMode: 'idle' | 'create' | 'redraw' | 'delete' | 'reverse';\n /** 渲染单条数据到 layerGroup 中 */\n renderItem: (item: T, layerGroup: L.LayerGroup, index: number) => void;\n layerGroupRef: MutableRefObject<L.LayerGroup | null>;\n layerByIdRef: MutableRefObject<Record<string | number, any>>;\n editingLayerRef: MutableRefObject<any | null>;\n deps: unknown[];\n}\n\n/**\n * 管理线要素图层的创建与清理\n *\n * 负责:\n * 1. 编辑模式下过滤数据(create/redraw 模式不渲染已有要素)\n * 2. 创建 LayerGroup 并将数据渲染进去\n * 3. 组件卸载时移除 editingLayerRef\n *\n * 注意:editingLayerRef 的日常生命周期(handleRedraw/handleEdit 创建、\n * handleCancel/handleSave 销毁)由组件自行管理,此 hook 仅在组件卸载时兜底清理。\n */\nexport function usePolylineRenderer<T = unknown>(options: UsePolylineRendererOptions<T>): void {\n const {\n map,\n normalizedData,\n value,\n currentMode,\n renderItem,\n layerGroupRef,\n layerByIdRef,\n editingLayerRef,\n deps,\n } = options;\n\n // 追踪是否是组件卸载,以区分依赖变更和卸载\n const isUnmountedRef = useRef(false);\n // 追踪上一次 normalizedData,用于判断数据是否实际变化\n const prevDataRef = useRef<any[] | null>(null);\n\n useEffect(() => {\n isUnmountedRef.current = false;\n\n // 判断 normalizedData 是否发生变化\n const dataChanged = normalizedData !== prevDataRef.current;\n prevDataRef.current = normalizedData;\n\n const currentMap = map;\n if (!currentMap || !normalizedData || normalizedData.length === 0) {\n if (layerGroupRef.current) {\n map!.removeLayer(layerGroupRef.current);\n layerGroupRef.current = null;\n layerByIdRef.current = {};\n }\n return;\n }\n\n // 编辑模式下过滤数据(数据变化时不过滤,允许新建保存后立即渲染新数据)\n let renderItems = normalizedData;\n if ((currentMode === 'create' || currentMode === 'redraw') && !dataChanged) {\n renderItems = [];\n }\n\n if (layerGroupRef.current) {\n currentMap.removeLayer(layerGroupRef.current);\n }\n layerByIdRef.current = {};\n\n if (renderItems.length === 0) {\n return;\n }\n\n const layerGroup = L.layerGroup().addTo(currentMap);\n layerGroupRef.current = layerGroup;\n\n renderItems.forEach((item, index) => renderItem(item, layerGroup, index));\n\n // 数据变化时清理编辑图层(新建保存后数据源更新时,移除临时的编辑图层避免重复)\n // 注意:在 redraw 模式下 editingLayerRef 不应被清理(可能在编辑过程中)\n if (dataChanged && editingLayerRef.current && currentMode !== 'redraw') {\n currentMap.removeLayer(editingLayerRef.current);\n editingLayerRef.current = null;\n }\n\n return () => {\n if (layerGroupRef.current) {\n currentMap.removeLayer(layerGroupRef.current);\n layerGroupRef.current = null;\n layerByIdRef.current = {};\n }\n // 仅在组件卸载时清理编辑图层(依赖变更时由组件自行管理)\n if (isUnmountedRef.current && editingLayerRef.current) {\n currentMap.removeLayer(editingLayerRef.current);\n editingLayerRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [map, normalizedData, value, currentMode, renderItem, ...deps]);\n\n // 组件卸载标记\n useEffect(() => {\n return () => {\n isUnmountedRef.current = true;\n };\n }, []);\n}\n","/**\n * 折线编辑器状态管理 Hook\n *\n * 封装 Irrigation / Road 等折线类组件共享的编辑状态机逻辑:\n * - currentMode / tempPoints 状态管理\n * - pendingCreate 流程(新建 → 保存 → 抽屉 → 完成/取消)\n * - handleCancel(清理编辑状态)\n * - Escape 快捷键取消\n * - normalizedData 变化时自动重置 pendingCreate 状态\n * - pm:create / pm:edit 事件监听\n */\n\n/* eslint-disable react-hooks/exhaustive-deps -- ref 回调稳定 */\n\nimport { useEffect, useRef, useState, useCallback } from 'react';\nimport type L from 'leaflet';\nimport type { Coordinate } from '../types';\nimport { useLatestRef } from './useLatestRef';\n\nexport interface UsePolylineEditorOptions {\n /** Leaflet 地图实例 */\n map: L.Map | null;\n /** 编辑中的图层引用(由组件持有,类型各不相同) */\n editingLayerRef: React.MutableRefObject<L.Polyline | null>;\n /** 标准化后的数据源,用于检测 pendingCreate 保存后的数据变化 */\n normalizedData: unknown[];\n /** Whether PM event listeners (pm:create, pm:edit, etc.) should be active. Default: true */\n pmEventsEnabled?: boolean;\n /** Called when pm:create fires. Use this to convert the drawn layer type (e.g., asIrrigationLayer). */\n onDrawnLayer?: (drawnLayer: L.Polyline) => void;\n /** Optional runtime guard for pm:create event. Return false to skip handling. */\n pmCreateGuard?: () => boolean;\n}\n\nexport interface UsePolylineEditorReturn {\n /** 当前编辑模式 */\n currentMode: 'idle' | 'create' | 'redraw' | 'delete' | 'reverse';\n /** 设置当前编辑模式 */\n setCurrentMode: React.Dispatch<\n React.SetStateAction<'idle' | 'create' | 'redraw' | 'delete' | 'reverse'>\n >;\n /** 临时坐标点(绘制/编辑中的坐标) */\n tempPoints: Coordinate[];\n /** 设置临时坐标点 */\n setTempPoints: React.Dispatch<React.SetStateAction<Coordinate[]>>;\n /** 新建待提交标记 ref(详见各组件中 pendingCreateRef 注释) */\n pendingCreateRef: React.MutableRefObject<boolean>;\n /** 编辑前原始坐标 ref */\n originalPointsRef: React.MutableRefObject<Coordinate[] | null>;\n /** currentMode 的最新引用(用于在回调和事件处理中读取最新值) */\n currentModeRef: React.MutableRefObject<'idle' | 'create' | 'redraw' | 'delete' | 'reverse'>;\n /** 取消操作:清理所有编辑状态 */\n handleCancel: () => void;\n}\n\nexport function usePolylineEditor(options: UsePolylineEditorOptions): UsePolylineEditorReturn {\n const {\n map: mapInput,\n editingLayerRef,\n normalizedData,\n pmEventsEnabled = true,\n onDrawnLayer,\n pmCreateGuard,\n } = options;\n\n // map 在实际使用中不会为 null(组件在 MapProvider 内部)\n const map = mapInput!;\n\n const [currentMode, setCurrentMode] = useState<\n 'idle' | 'create' | 'redraw' | 'delete' | 'reverse'\n >('idle');\n const [tempPoints, setTempPoints] = useState<Coordinate[]>([]);\n const pendingCreateRef = useRef(false);\n const originalPointsRef = useRef<Coordinate[] | null>(null);\n const currentModeRef = useLatestRef(currentMode);\n const onDrawnLayerRef = useLatestRef(onDrawnLayer);\n const pmCreateGuardRef = useLatestRef(pmCreateGuard);\n\n // 取消操作:清理所有编辑状态\n const handleCancel = useCallback(() => {\n if (map.pm) {\n map.pm.disableDraw();\n // 仅在全局编辑模式已启用时才禁用,避免 Geoman 内部报错\n if (map.pm.globalEditModeEnabled?.()) {\n map.pm.disableGlobalEditMode();\n }\n }\n\n if (editingLayerRef.current) {\n map.removeLayer(editingLayerRef.current);\n }\n editingLayerRef.current = null;\n pendingCreateRef.current = false;\n\n setCurrentMode('idle');\n setTempPoints([]);\n originalPointsRef.current = null;\n }, [map, editingLayerRef]);\n\n const handleCancelRef = useLatestRef(handleCancel);\n\n // Escape 快捷键取消\n useEffect(() => {\n if (currentMode === 'idle') return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n handleCancelRef.current();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [currentMode]);\n\n // 新建保存后,等待 dataSource 更新时自动重置到 idle 模式\n // 作用:检测 pendingCreate 状态下 normalizedData 的变化,自动完成流程重置\n const prevNormalizedDataRef = useRef(normalizedData);\n useEffect(() => {\n if (pendingCreateRef.current && normalizedData !== prevNormalizedDataRef.current) {\n pendingCreateRef.current = false;\n setCurrentMode('idle');\n setTempPoints([]);\n originalPointsRef.current = null;\n }\n prevNormalizedDataRef.current = normalizedData;\n }, [normalizedData]);\n\n // pm:create 事件监听\n useEffect(() => {\n if (!map || !pmEventsEnabled) return;\n\n const handleCreate = (e: L.LeafletEvent) => {\n if (currentModeRef.current !== 'create') return;\n if (pmCreateGuardRef.current && !pmCreateGuardRef.current()) return;\n\n const pmEvent = e as L.PM.ChangeEvent;\n const drawnLayer = pmEvent.layer as L.Polyline;\n if (drawnLayer) {\n const latlngs = drawnLayer.getLatLngs() as L.LatLng[];\n const coords: Coordinate[] = latlngs.map(ll => [ll.lat, ll.lng]);\n\n // 移除 Geoman 创建的图层,由 previewLine 显示\n map.removeLayer(drawnLayer);\n\n if (onDrawnLayerRef.current) {\n onDrawnLayerRef.current(drawnLayer);\n } else {\n editingLayerRef.current = null;\n }\n setTempPoints(coords);\n }\n if (map.pm) {\n map.pm.disableDraw();\n }\n };\n\n map.on('pm:create', handleCreate);\n return () => {\n map.off('pm:create', handleCreate);\n };\n }, [map, pmEventsEnabled]);\n\n // pm:edit / pm:vertexadded / pm:vertexremoved / pm:markerdragend 事件监听\n useEffect(() => {\n if (!map || !pmEventsEnabled) return;\n\n const handleChange = (e: L.LeafletEvent) => {\n if (currentModeRef.current !== 'redraw') return;\n\n const pmEvent = e as L.PM.ChangeEvent;\n const layer = (pmEvent.layer || editingLayerRef.current) as L.Polyline | null;\n if (layer) {\n const latlngs = layer.getLatLngs();\n\n let coords: Coordinate[] | undefined;\n if (latlngs && latlngs.length > 0) {\n const first = latlngs[0];\n if (first && 'lat' in first) {\n coords = (latlngs as L.LatLng[]).map(ll => [ll.lat, ll.lng]);\n } else if (Array.isArray(first)) {\n coords = (first as L.LatLng[]).map(ll => [ll.lat, ll.lng]);\n }\n }\n if (coords) {\n setTempPoints(coords);\n }\n }\n };\n\n map.on('pm:edit', handleChange);\n map.on('pm:vertexadded', handleChange);\n map.on('pm:vertexremoved', handleChange);\n map.on('pm:markerdragend', handleChange);\n\n return () => {\n map.off('pm:edit', handleChange);\n map.off('pm:vertexadded', handleChange);\n map.off('pm:vertexremoved', handleChange);\n map.off('pm:markerdragend', handleChange);\n };\n }, [map, pmEventsEnabled]);\n\n return {\n currentMode,\n setCurrentMode,\n tempPoints,\n setTempPoints,\n pendingCreateRef,\n originalPointsRef,\n currentModeRef,\n handleCancel,\n };\n}\n\n// ========== usePolylineSave ==========\n\nexport interface UsePolylineSaveOptions {\n map: L.Map | null;\n currentMode: 'idle' | 'create' | 'redraw' | 'delete' | 'reverse';\n tempPoints: Coordinate[];\n value: string | number | null;\n editingLayerRef: React.MutableRefObject<L.Polyline | null>;\n pendingCreateRef: React.MutableRefObject<boolean>;\n originalPointsRef: React.MutableRefObject<Coordinate[] | null>;\n layerByIdRef: React.MutableRefObject<Record<string | number, L.Polyline>>;\n setCurrentMode: React.Dispatch<\n React.SetStateAction<'idle' | 'create' | 'redraw' | 'delete' | 'reverse'>\n >;\n setTempPoints: React.Dispatch<React.SetStateAction<Coordinate[]>>;\n /** Called when create save is triggered with the new points */\n onCreateSave: (points: Coordinate[]) => void;\n /** Called when edit save is triggered with id, oldPoints, newPoints */\n onEditSave: (id: string | number, oldPoints: Coordinate[], newPoints: Coordinate[]) => void;\n}\n\nexport function usePolylineSave(options: UsePolylineSaveOptions): { handleSave: () => void } {\n const {\n map: mapInput,\n currentMode,\n tempPoints,\n value,\n editingLayerRef,\n pendingCreateRef,\n originalPointsRef,\n layerByIdRef,\n setCurrentMode,\n setTempPoints,\n onCreateSave,\n onEditSave,\n } = options;\n\n // map 在实际使用中不会为 null\n const map = mapInput!;\n\n const onCreateSaveRef = useLatestRef(onCreateSave);\n const onEditSaveRef = useLatestRef(onEditSave);\n\n const handleSave = useCallback(() => {\n if (map.pm) map.pm.disableDraw();\n\n let newPoints = tempPoints;\n\n // 编辑模式下从图层实时获取最新坐标(拖拽编辑后)\n if (currentMode === 'redraw' && editingLayerRef.current) {\n const latlngs = editingLayerRef.current.getLatLngs() as L.LatLng[];\n newPoints = latlngs.map(ll => [ll.lat, ll.lng]);\n }\n\n if (currentMode === 'create' && newPoints.length >= 2) {\n onCreateSaveRef.current(newPoints);\n\n // 禁用图层的 geoman 编辑模式,但保留图层在地图上可见\n // 图层将在 normalizedData 更新后由 usePolylineRenderer 清理并替换为正式图层\n editingLayerRef.current?.pm?.disable?.();\n pendingCreateRef.current = true;\n\n // 注意:不清空 tempPoints,保持 previewLine 显示直到 dataSource 更新\n // tempPoints 将在 normalizedData 变化后由 useEffect 自动清空\n } else if (currentMode === 'redraw' && newPoints.length >= 2) {\n onEditSaveRef.current(value!, originalPointsRef.current!, newPoints);\n\n if (editingLayerRef.current) {\n map.removeLayer(editingLayerRef.current);\n editingLayerRef.current = null;\n }\n delete layerByIdRef.current[value!];\n\n // 编辑模式下禁用全局编辑模式,确保编辑状态被完全清理\n if (map.pm.globalEditModeEnabled?.()) {\n map.pm.disableGlobalEditMode();\n }\n }\n\n // 新建待提交时不立即重置模式和清空 tempPoints\n // 原因:\n // 1. 不重置 currentMode → 工具栏保持显示取消/保存按钮\n // 2. 不清空 tempPoints → 保存按钮不会被禁用(toolbar 中 saveDisabled = pointCount < 2)\n // 即使抽屉被误取消,用户仍可再次点击保存按钮重新触发 onCreate\n // 状态清理由以下两种途径完成:\n // - 抽屉保存成功 → normalizedData 变化 → useEffect 自动重置\n // - 用户点击工具栏取消 → handleCancel() 清理\n if (!(currentMode === 'create' && pendingCreateRef.current)) {\n setCurrentMode('idle');\n setTempPoints([]);\n originalPointsRef.current = null;\n }\n }, [\n currentMode,\n tempPoints,\n value,\n map,\n editingLayerRef,\n pendingCreateRef,\n originalPointsRef,\n layerByIdRef,\n setCurrentMode,\n setTempPoints,\n ]);\n\n return { handleSave };\n}\n","/**\n * @fileoverview Loading 覆盖层 Hook\n * @description 提取各组件中重复的 Loading 覆盖层逻辑\n */\n\nimport { useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport type L from 'leaflet';\nimport Loading from '../components/Loading';\nimport type { LoadingMaskConfig } from '../types';\nimport type { LoadingIconName, LoadingSize } from '../types/loading';\nimport { LOADING_DEFAULT_MASK_BACKGROUND, LOADING_DEFAULT_MASK_ZINDEX } from '../constants/styles';\n\nexport interface UseLoadingOverlayOptions {\n /** 是否显示加载状态 */\n loading: boolean;\n /** Loading 遮罩配置 */\n loadingMask?: LoadingMaskConfig;\n /** Leaflet 地图实例 */\n map: L.Map | null;\n /** Loading 覆盖层的 CSS 类名 */\n className: string;\n /** 自定义 Loading 图标名称,默认为 'loading-spinner' */\n icon?: LoadingIconName;\n /** 自定义 Loading 尺寸,默认为 'large' */\n size?: LoadingSize;\n}\n\n/**\n * Loading 覆盖层 Hook\n *\n * @description\n * 提取各图层组件中重复的 Loading 覆盖层逻辑,包括:\n * - PlotLayer / PlotGroupLayer\n * - Road / Irrigation\n * - Marker\n *\n * @example\n * ```tsx\n * const loadingOverlay = useLoadingOverlay({\n * loading,\n * loadingMask,\n * map,\n * className: 'agri-plot-loading-overlay',\n * });\n *\n * return (\n * <>\n * {/* 其他内容 *}\n * {loadingOverlay}\n * </>\n * );\n * ```\n */\nexport function useLoadingOverlay(options: UseLoadingOverlayOptions): React.ReactNode | null {\n const {\n loading,\n loadingMask,\n map,\n className,\n icon = 'loading-spinner',\n size = 'large',\n } = options;\n\n return useMemo(() => {\n if (!loading || !map) return null;\n\n const container = map.getContainer();\n if (!container) return null;\n\n const maskEnabled = loadingMask?.enabled !== false;\n const maskBackground = loadingMask?.background || LOADING_DEFAULT_MASK_BACKGROUND;\n const maskZIndex = loadingMask?.zIndex ?? LOADING_DEFAULT_MASK_ZINDEX;\n\n return createPortal(\n <div\n className={className}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: maskEnabled ? maskBackground : 'transparent',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: maskZIndex,\n pointerEvents: 'none',\n }}\n >\n <Loading icon={icon} size={size} />\n </div>,\n container\n );\n }, [loading, loadingMask, map, className, icon, size]);\n}\n","/**\n * React 渲染优化工具 Hooks\n * @description 提供性能优化的 React Hooks,减少不必要的重渲染\n */\n\n/* eslint-disable react-hooks/exhaustive-deps -- compute 函数稳定 */\n\nimport { useRef, useMemo } from 'react';\n\n/**\n * 浅比较函数\n */\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\n return false;\n }\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if ((a as Record<string, unknown>)[key] !== (b as Record<string, unknown>)[key]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * 深度比较函数(简化版)\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\n return a === b;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, i) => deepEqual(item, b[i]));\n }\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (!deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * useMemoCompare - 带比较函数的 useMemo\n * @description 只有当比较函数返回 false 时才更新缓存值,避免不必要的重渲染\n *\n * @param compute - 计算函数\n * @param equal - 比较函数,返回 true 表示值相等\n * @param deps - 依赖数组\n * @returns 缓存的计算结果\n *\n * @example\n * ```tsx\n * const visibleTracks = useMemoCompare(\n * () => computeVisibleTracks(parsedTracks, viewport),\n * (a, b) => a.length === b.length && a.every((t, i) => t.key === b[i].key),\n * [parsedTracks, viewport]\n * );\n * ```\n */\nexport function useMemoCompare<T>(\n compute: () => T,\n equal: (a: T, b: T) => boolean,\n deps: React.DependencyList\n): T {\n const ref = useRef<T>(compute());\n const computed = useMemo(() => compute(), deps);\n\n if (!equal(ref.current, computed)) {\n ref.current = computed;\n }\n return ref.current as T;\n}\n\n/**\n * useShallowCompare - 浅比较 useMemo\n * @description 对对象/数组进行浅比较,避免深度比较的开销\n *\n * @param compute - 计算函数\n * @param deps - 依赖数组\n * @returns 缓存的计算结果\n *\n * @example\n * ```tsx\n * const styles = useShallowCompare(\n * () => ({ color: selected ? 'red' : 'blue', weight: 2 }),\n * [selected]\n * );\n * ```\n */\nexport function useShallowCompare<T extends object>(\n compute: () => T,\n deps: React.DependencyList\n): T {\n return useMemoCompare<T>(compute, shallowEqual, deps) as T;\n}\n\n/**\n * useDeepCompare - 深度比较 useMemo\n * @description 对对象/数组进行深度比较,适用于复杂对象\n *\n * @param compute - 计算函数\n * @param deps - 依赖数组\n * @returns 缓存的计算结果\n *\n * @example\n * ```tsx\n * const config = useDeepCompare(\n * () => parseConfig(props.config),\n * [props.config]\n * );\n * ```\n */\nexport function useDeepCompare<T>(compute: () => T, deps: React.DependencyList): T {\n return useMemoCompare<T>(compute, deepEqual, deps) as T;\n}\n\n/**\n * useCallbackRef - 稳定的回调引用\n * @description 返回一个稳定的函数引用,内部始终调用最新的回调\n *\n * @param callback - 回调函数\n * @returns 稳定的函数引用\n *\n * @example\n * ```tsx\n * // 避免将回调作为依赖项\n * const handleClick = useCallbackRef((id) => {\n * onSelect(id); // 始终调用最新的 onSelect\n * });\n * ```\n */\nexport function useCallbackRef<T extends (...args: unknown[]) => unknown>(\n callback: T | undefined\n): T {\n const ref = useRef(callback);\n ref.current = callback;\n\n return useMemo(() => {\n return ((...args: unknown[]) => ref.current?.(...args)) as T;\n }, []);\n}\n\n/**\n * useLazyRef - 延迟初始化 ref\n * @description 只在首次渲染时执行初始化函数\n *\n * @param init - 初始化函数\n * @returns ref 对象\n *\n * @example\n * ```tsx\n * const mapRef = useLazyRef(() => new Map());\n * ```\n */\nexport function useLazyRef<T>(init: () => T): React.MutableRefObject<T> {\n const ref = useRef<T | null>(null);\n\n if (ref.current === null) {\n ref.current = init();\n }\n\n return ref as React.MutableRefObject<T>;\n}\n\nexport default {\n useMemoCompare,\n useShallowCompare,\n useDeepCompare,\n useCallbackRef,\n useLazyRef,\n shallowEqual,\n};\n","/**\n * @fileoverview 统一错误处理工具\n * @description 提供统一的错误处理、日志记录和错误边界包装器\n * @module utils/errorHandling\n * @since 2.1.0 统一优化\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- 错误处理需要 */\n\n/** 组件名称映射 */\nexport const COMPONENT_NAMES = {\n PLOT_LAYER: 'PlotLayer',\n MARKER: 'Marker',\n TRACK: 'Track',\n ROAD: 'Road',\n IRRIGATION: 'Irrigation',\n TIAN_DI_TU: 'TianDiTuLayer',\n MINI_MAP: 'MiniMap',\n CLUSTER_VIEW: 'ClusterView',\n} as const;\n\nexport type ComponentName = (typeof COMPONENT_NAMES)[keyof typeof COMPONENT_NAMES];\n\n/** 日志级别 */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\n/** 日志配置 */\ninterface LogConfig {\n enabled: boolean;\n minLevel: LogLevel;\n prefix: string;\n}\n\n/** 默认日志配置 */\nconst defaultLogConfig: LogConfig = {\n enabled: process.env.NODE_ENV === 'development',\n minLevel: 'warn',\n prefix: '[AgriMap]',\n};\n\n/** 当前日志配置 */\nlet currentLogConfig = { ...defaultLogConfig };\n\n/**\n * 配置日志\n */\nexport function configureLog(config: Partial<LogConfig>) {\n currentLogConfig = { ...currentLogConfig, ...config };\n}\n\n/**\n * 日志输出\n */\nfunction log(level: LogLevel, componentName: string, message: string, ...args: unknown[]) {\n if (!currentLogConfig.enabled) return;\n\n const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n const minLevelIndex = levels.indexOf(currentLogConfig.minLevel);\n const currentLevelIndex = levels.indexOf(level);\n\n if (currentLevelIndex < minLevelIndex) return;\n\n const prefix = `${currentLogConfig.prefix}[${componentName}]`;\n\n switch (level) {\n case 'debug':\n console.debug(prefix, message, ...args);\n break;\n case 'info':\n console.info(prefix, message, ...args);\n break;\n case 'warn':\n console.warn(prefix, message, ...args);\n break;\n case 'error':\n console.error(prefix, message, ...args);\n break;\n }\n}\n\n/** 日志工具 */\nexport const logger = {\n debug: (component: string, message: string, ...args: unknown[]) =>\n log('debug', component, message, ...args),\n info: (component: string, message: string, ...args: unknown[]) =>\n log('info', component, message, ...args),\n warn: (component: string, message: string, ...args: unknown[]) =>\n log('warn', component, message, ...args),\n error: (component: string, message: string, ...args: unknown[]) =>\n log('error', component, message, ...args),\n};\n\n/**\n * 安全执行函数\n * @description 包裹函数执行,添加错误处理和日志记录\n *\n * @example\n * ```tsx\n * // 简单使用\n * const result = safeCall(\n * () => JSON.parse(data),\n * 'Marker',\n * 'parseData'\n * );\n *\n * // 带默认值\n * const result = safeCall(\n * () => riskyOperation(),\n * 'PlotLayer',\n * 'riskyOperation',\n * { defaultValue: [] }\n * );\n * ```\n */\nexport function safeCall<T>(\n fn: () => T,\n componentName: ComponentName | string,\n operationName: string,\n options?: {\n defaultValue?: T;\n onError?: (error: Error) => void;\n rethrow?: boolean;\n }\n): T | undefined {\n const { defaultValue, onError, rethrow = false } = options || {};\n\n try {\n return fn();\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n logger.error(componentName, `${operationName} 失败:`, err.message);\n\n if (onError) {\n try {\n onError(err);\n } catch (handlerError) {\n logger.error(componentName, '错误处理函数执行失败:', handlerError);\n }\n }\n\n if (rethrow) {\n throw err;\n }\n\n return defaultValue as T;\n }\n}\n\n/**\n * 安全执行异步函数\n */\nexport async function safeCallAsync<T>(\n fn: () => Promise<T>,\n componentName: ComponentName | string,\n operationName: string,\n options?: {\n defaultValue?: T;\n onError?: (error: Error) => void;\n rethrow?: boolean;\n }\n): Promise<T | undefined> {\n const { defaultValue, onError, rethrow = false } = options || {};\n\n try {\n return await fn();\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n logger.error(componentName, `${operationName} 失败:`, err.message);\n\n if (onError) {\n try {\n onError(err);\n } catch (handlerError) {\n logger.error(componentName, '错误处理函数执行失败:', handlerError);\n }\n }\n\n if (rethrow) {\n throw err;\n }\n\n return defaultValue as T;\n }\n}\n\n/**\n * 创建带上下文的安全执行器\n * @description 为特定组件创建预配置的安全执行函数\n *\n * @example\n * ```tsx\n * // 在组件中使用\n * const safeExec = createSafeExecutor('Marker');\n *\n * // 使用\n * const result = safeExec(() => riskyOperation(), 'riskyOperation');\n * ```\n */\nexport function createSafeExecutor(componentName: ComponentName | string) {\n return <T>(\n fn: () => T,\n operationName: string,\n options?: {\n defaultValue?: T;\n onError?: (error: Error) => void;\n rethrow?: boolean;\n }\n ) => safeCall(fn, componentName, operationName, options);\n}\n\n/**\n * 创建带上下文的异步安全执行器\n */\nexport function createAsyncSafeExecutor(componentName: ComponentName | string) {\n return <T>(\n fn: () => Promise<T>,\n operationName: string,\n options?: {\n defaultValue?: T;\n onError?: (error: Error) => void;\n rethrow?: boolean;\n }\n ) => safeCallAsync(fn, componentName, operationName, options);\n}\n\n/**\n * 安全回调执行\n * @description 用于安全执行用户提供的回调函数\n */\nexport function safeCallback<T extends (...args: any[]) => any>(\n callback: T | undefined,\n componentName: ComponentName | string,\n callbackName: string,\n ...args: Parameters<T>\n): ReturnType<T> | undefined {\n if (!callback) return undefined;\n\n return safeCall(() => callback(...args), componentName, `callback:${callbackName}`);\n}\n\n/**\n * 批量安全执行\n * @description 安全执行多个操作,收集所有错误\n */\nexport function safeBatch(\n componentName: ComponentName | string,\n operations: { name: string; fn: () => void }[]\n): { success: number; failed: number; errors: Error[] } {\n const result = { success: 0, failed: 0, errors: [] as Error[] };\n\n for (const { name, fn } of operations) {\n try {\n fn();\n result.success++;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n logger.error(componentName, `${name} 失败:`, err.message);\n result.failed++;\n result.errors.push(err);\n }\n }\n\n return result;\n}\n\n/**\n * 条件断言\n * @description 断言条件为真,否则记录错误\n */\nexport function assert(\n condition: boolean,\n componentName: ComponentName | string,\n message: string\n): asserts condition {\n if (!condition) {\n const error = new Error(`Assertion failed: ${message}`);\n logger.error(componentName, message);\n throw error;\n }\n}\n\n/**\n * 软断言\n * @description 断言条件为真,仅记录警告不抛出错误\n */\nexport function softAssert(\n condition: boolean,\n componentName: ComponentName | string,\n message: string\n): boolean {\n if (!condition) {\n logger.warn(componentName, `Assertion warning: ${message}`);\n }\n return condition;\n}\n\nexport default {\n logger,\n safeCall,\n safeCallAsync,\n createSafeExecutor,\n createAsyncSafeExecutor,\n safeCallback,\n safeBatch,\n assert,\n softAssert,\n configureLog,\n COMPONENT_NAMES,\n};\n","/**\n * 性能监控 Hook\n * @description 提供组件渲染性能和地图操作性能的监控功能\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport type { Map } from 'leaflet';\nimport { logger } from '../utils/errorHandling';\n\n/**\n * 性能指标数据\n */\nexport interface PerformanceMetrics {\n /** 组件名称 */\n componentName: string;\n /** 首次渲染时间 (ms) */\n initialRenderTime?: number;\n /** 更新渲染时间 (ms) */\n updateRenderTime?: number;\n /** 渲染次数 */\n renderCount: number;\n /** 地图操作耗时 */\n mapOperationTime?: Record<string, number>;\n}\n\n/**\n * 性能监控配置\n */\nexport interface PerformanceMonitorConfig {\n /** 是否启用监控 */\n enabled?: boolean;\n /** 是否上报到监控服务 */\n reportToService?: boolean;\n /** 监控服务上报 URL */\n serviceUrl?: string;\n /** 额外数据 */\n extraData?: Record<string, unknown>;\n}\n\n/**\n * 性能监控 Hook\n * @description 监控组件渲染性能和地图操作性能\n *\n * @param componentName 组件名称\n * @param config 配置选项\n * @returns 性能指标数据和上报函数\n *\n * @example\n * ```tsx\n * // 基础用法\n * function PlotLayer() {\n * const { metrics, reportPerformance } = usePerformanceMonitor('PlotLayer');\n *\n * useEffect(() => {\n * console.log('渲染性能:', metrics);\n * }, [metrics]);\n *\n * return <div>...</div>;\n * }\n *\n * // 监控地图操作\n * function MapComponent() {\n * const map = useMap();\n * const { observeMapOperation } = usePerformanceMonitor('MapContent');\n *\n * useEffect(() => {\n * observeMapOperation(map, 'fitBounds', () => {\n * map.fitBounds(bounds);\n * });\n * }, [map]);\n *\n * return <div>...</div>;\n * }\n *\n * // 带配置的使用\n * function HeavyComponent() {\n * const { metrics } = usePerformanceMonitor('HeavyComponent', {\n * enabled: process.env.NODE_ENV === 'development',\n * reportToService: true,\n * serviceUrl: '/api/performance',\n * });\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function usePerformanceMonitor(\n componentName: string,\n config: PerformanceMonitorConfig = {}\n) {\n const { enabled = true, reportToService = false, serviceUrl, extraData } = config;\n\n const metricsRef = useRef<PerformanceMetrics>({\n componentName,\n renderCount: 0,\n });\n\n const startTimeRef = useRef<number>(performance.now());\n const renderCountRef = useRef(0);\n\n /**\n * 记录渲染性能\n */\n const recordRenderPerformance = useCallback(\n (renderType: 'initial' | 'update' = 'update') => {\n if (!enabled) return;\n\n const endTime = performance.now();\n const duration = endTime - startTimeRef.current;\n\n renderCountRef.current += 1;\n\n metricsRef.current = {\n componentName,\n renderCount: renderCountRef.current,\n ...(renderType === 'initial'\n ? { initialRenderTime: duration }\n : { updateRenderTime: duration }),\n mapOperationTime: metricsRef.current.mapOperationTime,\n };\n\n // 开发环境下输出日志\n if (process.env.NODE_ENV === 'development') {\n logger.info(\n 'PerformanceMonitor',\n `${componentName} ${renderType} render: ${duration.toFixed(2)}ms`,\n `Total renders: ${renderCountRef.current}`\n );\n }\n\n // 重置开始时间\n startTimeRef.current = performance.now();\n },\n [componentName, enabled]\n );\n\n /**\n * 观察地图操作性能\n */\n const observeMapOperation = useCallback(\n <T extends (...args: unknown[]) => unknown>(\n map: Map | null,\n operationName: string,\n operation: T\n ): ReturnType<T> => {\n if (!enabled || !map) {\n return operation() as ReturnType<T>;\n }\n\n const start = performance.now();\n const result = operation();\n const duration = performance.now() - start;\n\n // 记录地图操作耗时\n metricsRef.current.mapOperationTime = {\n ...metricsRef.current.mapOperationTime,\n [operationName]: duration,\n };\n\n if (process.env.NODE_ENV === 'development') {\n logger.info(\n 'PerformanceMonitor',\n `${componentName} map operation \"${operationName}\": ${duration.toFixed(2)}ms`\n );\n }\n\n return result as ReturnType<T>;\n },\n [componentName, enabled]\n );\n\n /**\n * 上报性能数据到监控服务\n */\n const reportPerformance = useCallback(async () => {\n if (!reportToService || !serviceUrl) return;\n\n const metrics = {\n ...metricsRef.current,\n timestamp: Date.now(),\n url: window.location.href,\n userAgent: navigator.userAgent,\n ...extraData,\n };\n\n try {\n await navigator.sendBeacon(serviceUrl, JSON.stringify(metrics));\n } catch (error) {\n logger.error('PerformanceMonitor', 'Failed to report metrics:', error);\n }\n }, [reportToService, serviceUrl, extraData]);\n\n /**\n * 获取内存使用情况\n */\n const getMemoryUsage = useCallback(() => {\n if ('memory' in performance) {\n const mem = (performance as unknown as { memory: { usedJSHeapSize: number } }).memory;\n return {\n usedJSHeapSize: mem.usedJSHeapSize,\n usedJSHeapSizeMB: (mem.usedJSHeapSize / 1024 / 1024).toFixed(2),\n };\n }\n return null;\n }, []);\n\n /**\n * 获取完整的性能指标\n */\n const getMetrics = useCallback((): PerformanceMetrics & {\n memory?: ReturnType<typeof getMemoryUsage>;\n } => {\n return {\n ...metricsRef.current,\n memory: getMemoryUsage(),\n };\n }, [getMemoryUsage]);\n\n // 初始化时记录首次渲染开始时间\n useEffect(() => {\n if (!enabled) return;\n\n startTimeRef.current = performance.now();\n\n return () => {\n // 组件卸载时上报\n if (reportToService) {\n reportPerformance();\n }\n };\n }, [enabled, reportToService, reportPerformance]);\n\n return {\n /** 性能指标数据 */\n metrics: metricsRef.current,\n /** 获取完整性能指标(包含内存) */\n getMetrics,\n /** 记录渲染性能 */\n recordRenderPerformance,\n /** 观察地图操作性能 */\n observeMapOperation,\n /** 上报性能数据 */\n reportPerformance,\n /** 获取内存使用情况 */\n getMemoryUsage,\n };\n}\n\nexport default usePerformanceMonitor;\n","/**\n * Web Worker Hook 封装\n * @description 提供空间索引和几何计算的 Worker 封装,支持增量更新和 R-Tree 索引\n */\n\nimport { useEffect, useRef, useCallback, useState } from 'react';\nimport type { PlotData, Coordinate } from '../types';\nimport type { BBox, BoundedItem } from '../utils/spatialIndex';\nimport { logger } from '../utils/errorHandling';\nimport type {\n IndexType,\n BuildIndexResponse,\n UpdateIndexResponse,\n QueryIndexResponse,\n} from '../workers/spatialIndex.worker';\n\n/** 空间索引 Worker 选项 */\nexport interface SpatialIndexWorkerOptions {\n /** 网格单元格大小 */\n cellSize?: number;\n /** 索引类型:grid(网格) | rtree(R-Tree) */\n indexType?: IndexType;\n /** 是否自动构建索引 */\n autoBuild?: boolean;\n /** 最大重试次数 */\n maxRetries?: number;\n /** 重试延迟(毫秒) */\n retryDelay?: number;\n}\n\n/** 空间索引 Worker 返回值 */\nexport interface SpatialIndexWorkerResult {\n /** 是否正在构建索引 */\n isBuilding: boolean;\n /** 是否已构建索引 */\n isReady: boolean;\n /** 地块数量 */\n itemCount: number;\n /** 构建耗时 (ms) */\n buildTime: number;\n /** 查询耗时 (ms) */\n queryTime: number;\n /** 更新耗时 (ms) */\n updateTime: number;\n /** 索引类型 */\n indexType: IndexType;\n /** 错误信息 */\n error: string | null;\n /** 重试次数 */\n retryCount: number;\n /** 构建空间索引 */\n buildIndex: (plots: PlotData[]) => Promise<void>;\n /** 查询视口内的地块 */\n query: (bounds: BBox) => Promise<BoundedItem[]>;\n /** 增量更新索引 */\n updateIndex: (\n addedItems?: BoundedItem[],\n removedIds?: (string | number)[],\n updatedItems?: BoundedItem[]\n ) => Promise<void>;\n /** 清空索引 */\n clear: () => void;\n /** 终止 Worker */\n terminate: () => void;\n /** 重置错误状态 */\n resetError: () => void;\n}\n\n/**\n * 空间索引 Worker Hook\n * @description 使用 Web Worker 处理大规模地块的空间索引\n *\n * @param options 配置选项\n * @returns Worker 操作接口\n *\n * @example\n * ```tsx\n * function PlotLayer({ dataSource }) {\n * const {\n * buildIndex,\n * query,\n * isReady,\n * queryTime\n * } = useSpatialIndexWorker({ cellSize: 0.01 });\n *\n * useEffect(() => {\n * buildIndex(dataSource);\n * }, [dataSource]);\n *\n * const handleMapMove = useCallback(async () => {\n * const bounds = map.getBounds();\n * const visibleIds = await query([\n * bounds.getSouth(),\n * bounds.getWest(),\n * bounds.getNorth(),\n * bounds.getEast()\n * ]);\n * setVisiblePlots(visibleIds);\n * }, [map, query]);\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function useSpatialIndexWorker(\n options: SpatialIndexWorkerOptions = {}\n): SpatialIndexWorkerResult {\n const { cellSize = 0.01, indexType = 'grid', maxRetries = 3, retryDelay = 1000 } = options;\n\n const workerRef = useRef<Worker | null>(null);\n const queryIdRef = useRef(0);\n const pendingQueries = useRef<Map<number, (value: BoundedItem[]) => void>>(new Map());\n const pendingBuild = useRef<(() => void) | null>(null);\n const pendingUpdate = useRef<(() => void) | null>(null);\n const retryCountRef = useRef(0);\n const lastErrorRef = useRef<string | null>(null);\n\n const [isBuilding, setIsBuilding] = useState(false);\n const [isReady, setIsReady] = useState(false);\n const [itemCount, setItemCount] = useState(0);\n const [buildTime, setBuildTime] = useState(0);\n const [queryTime, setQueryTime] = useState(0);\n const [updateTime, setUpdateTime] = useState(0);\n const [currentIndexType, setCurrentIndexType] = useState<IndexType>(indexType);\n const [error, setError] = useState<string | null>(null);\n const [retryCount, setRetryCount] = useState(0);\n\n // 初始化 Worker\n useEffect(() => {\n workerRef.current = new Worker(new URL('../workers/spatialIndex.worker.ts', import.meta.url), {\n type: 'module',\n });\n\n workerRef.current.onmessage = (\n event: MessageEvent<BuildIndexResponse | UpdateIndexResponse | QueryIndexResponse>\n ) => {\n const data = event.data;\n\n switch (data.type) {\n case 'built': {\n setItemCount(data.itemCount);\n setBuildTime(data.buildTime);\n setCurrentIndexType(data.indexType);\n setIsBuilding(false);\n setIsReady(true);\n setError(null);\n retryCountRef.current = 0;\n setRetryCount(0);\n pendingBuild.current?.();\n pendingBuild.current = null;\n break;\n }\n\n case 'updated': {\n setItemCount(data.itemCount);\n setUpdateTime(data.updateTime);\n setCurrentIndexType(data.indexType);\n setError(null);\n pendingUpdate.current?.();\n pendingUpdate.current = null;\n break;\n }\n\n case 'query-result': {\n setQueryTime(data.queryTime);\n const queryId = queryIdRef.current;\n const resolve = pendingQueries.current.get(queryId);\n if (resolve) {\n resolve(data.items);\n pendingQueries.current.delete(queryId);\n }\n break;\n }\n }\n };\n\n workerRef.current.onerror = event => {\n const errorMessage = event.message || 'Worker error occurred';\n lastErrorRef.current = errorMessage;\n setError(errorMessage);\n logger.error('SpatialIndexWorker', `Worker error: ${errorMessage}`);\n\n // 如果是构建错误且重试次数未达上限,则重试\n if (isBuilding && retryCountRef.current < maxRetries) {\n retryCountRef.current += 1;\n setRetryCount(retryCountRef.current);\n\n logger.warn(\n 'SpatialIndexWorker',\n `Retrying build (attempt ${retryCountRef.current}/${maxRetries})`\n );\n\n setTimeout(() => {\n setError(null);\n setIsBuilding(false);\n }, retryDelay);\n } else {\n setIsBuilding(false);\n }\n };\n\n return () => {\n workerRef.current?.terminate();\n workerRef.current = null;\n };\n }, [maxRetries, retryDelay, isBuilding]);\n\n // 构建索引\n const buildIndex = useCallback(\n (plots: PlotData[]): Promise<void> => {\n return new Promise((resolve, reject) => {\n if (!workerRef.current) {\n reject(new Error('Worker not initialized'));\n return;\n }\n\n setIsBuilding(true);\n setIsReady(false);\n pendingBuild.current = resolve;\n\n const items: BoundedItem[] = plots.map(plot => ({\n id: plot.id,\n boundaries: (plot.positions || []).flat() as Coordinate[],\n bounds: plot.bounds,\n }));\n\n workerRef.current.postMessage({\n type: 'build',\n items,\n cellSize,\n indexType,\n });\n });\n },\n [cellSize, indexType]\n );\n\n // 查询\n const query = useCallback(\n (bounds: BBox): Promise<BoundedItem[]> => {\n return new Promise((resolve, reject) => {\n if (!workerRef.current) {\n reject(new Error('Worker not initialized'));\n return;\n }\n\n if (!isReady) {\n resolve([]);\n return;\n }\n\n queryIdRef.current += 1;\n pendingQueries.current.set(queryIdRef.current, resolve);\n\n workerRef.current.postMessage({\n type: 'query',\n bbox: bounds,\n });\n });\n },\n [isReady]\n );\n\n // 增量更新\n const updateIndex = useCallback(\n (\n addedItems?: BoundedItem[],\n removedIds?: (string | number)[],\n updatedItems?: BoundedItem[]\n ): Promise<void> => {\n return new Promise((resolve, reject) => {\n if (!workerRef.current) {\n reject(new Error('Worker not initialized'));\n return;\n }\n\n pendingUpdate.current = resolve;\n\n workerRef.current.postMessage({\n type: 'update',\n addedItems,\n removedIds,\n updatedItems,\n });\n });\n },\n []\n );\n\n // 清空\n const clear = useCallback(() => {\n if (workerRef.current) {\n workerRef.current.postMessage({ type: 'clear' });\n setIsReady(false);\n setItemCount(0);\n }\n }, []);\n\n // 终止\n const terminate = useCallback(() => {\n if (workerRef.current) {\n workerRef.current.terminate();\n workerRef.current = null;\n setIsReady(false);\n setIsBuilding(false);\n }\n }, []);\n\n // 重置错误状态\n const resetError = useCallback(() => {\n setError(null);\n retryCountRef.current = 0;\n setRetryCount(0);\n lastErrorRef.current = null;\n }, []);\n\n return {\n isBuilding,\n isReady,\n itemCount,\n buildTime,\n queryTime,\n updateTime,\n indexType: currentIndexType,\n error,\n retryCount,\n buildIndex,\n query,\n updateIndex,\n clear,\n terminate,\n resetError,\n };\n}\n\n/**\n * 几何计算 Worker Hook\n * @description 使用 Web Worker 处理几何计算\n */\nexport interface GeometryWorkerResult {\n /** 是否正在计算 */\n isCalculating: boolean;\n /** 计算面积 */\n calculateAreas: (plots: PlotData[]) => Promise<number[]>;\n /** 计算边界 */\n computeBounds: (plots: PlotData[]) => Promise<[number, number, number, number] | null>;\n /** 简化几何 */\n simplifyGeometry: (plots: PlotData[], tolerance: number) => Promise<PlotData[]>;\n}\n\n/**\n * 几何计算 Worker Hook\n */\nexport function useGeometryWorker(): GeometryWorkerResult {\n const workerRef = useRef<Worker | null>(null);\n const [isCalculating, setIsCalculating] = useState(false);\n\n // 初始化 Worker\n useEffect(() => {\n workerRef.current = new Worker(new URL('../workers/geometry.worker.ts', import.meta.url), {\n type: 'module',\n });\n\n workerRef.current.onmessage = () => {\n setIsCalculating(false);\n };\n\n return () => {\n workerRef.current?.terminate();\n };\n }, []);\n\n const calculateAreas = useCallback((plots: PlotData[]): Promise<number[]> => {\n return new Promise((resolve, reject) => {\n if (!workerRef.current) {\n reject(new Error('Worker not initialized'));\n return;\n }\n\n setIsCalculating(true);\n\n const handler = (event: MessageEvent) => {\n if (event.data.type === 'AREAS_CALCULATED') {\n resolve(event.data.payload.areas);\n workerRef.current?.removeEventListener('message', handler);\n } else if (event.data.type === 'ERROR') {\n reject(new Error(event.data.payload.message));\n workerRef.current?.removeEventListener('message', handler);\n }\n };\n\n workerRef.current.addEventListener('message', handler);\n workerRef.current.postMessage({\n type: 'CALCULATE_AREAS',\n payload: { plots },\n });\n });\n }, []);\n\n const computeBounds = useCallback(\n (plots: PlotData[]): Promise<[number, number, number, number] | null> => {\n return new Promise((resolve, reject) => {\n if (!workerRef.current) {\n reject(new Error('Worker not initialized'));\n return;\n }\n\n setIsCalculating(true);\n\n const handler = (event: MessageEvent) => {\n if (event.data.type === 'BOUNDS_COMPUTED') {\n resolve(event.data.payload.bounds);\n workerRef.current?.removeEventListener('message', handler);\n } else if (event.data.type === 'ERROR') {\n reject(new Error(event.data.payload.message));\n workerRef.current?.removeEventListener('message', handler);\n }\n };\n\n workerRef.current.addEventListener('message', handler);\n workerRef.current.postMessage({\n type: 'COMPUTE_BOUNDS',\n payload: { plots },\n });\n });\n },\n []\n );\n\n const simplifyGeometry = useCallback(\n (plots: PlotData[], tolerance: number): Promise<PlotData[]> => {\n return new Promise((resolve, reject) => {\n if (!workerRef.current) {\n reject(new Error('Worker not initialized'));\n return;\n }\n\n setIsCalculating(true);\n\n const handler = (event: MessageEvent) => {\n if (event.data.type === 'GEOMETRY_SIMPLIFIED') {\n resolve(event.data.payload.simplifiedPlots);\n workerRef.current?.removeEventListener('message', handler);\n } else if (event.data.type === 'ERROR') {\n reject(new Error(event.data.payload.message));\n workerRef.current?.removeEventListener('message', handler);\n }\n };\n\n workerRef.current.addEventListener('message', handler);\n workerRef.current.postMessage({\n type: 'SIMPLIFY_GEOMETRY',\n payload: { plots, tolerance },\n });\n });\n },\n []\n );\n\n return {\n isCalculating,\n calculateAreas,\n computeBounds,\n simplifyGeometry,\n };\n}\n\nexport default useSpatialIndexWorker;\n","/**\n * @fileoverview Plot 状态机类型定义\n * @description 定义 Plot 编辑模式的状态和动作类型\n */\n\nimport type L from 'leaflet';\nimport type {\n Coordinate,\n PlotEditResult,\n PlotClipResult,\n PlotMoveResult,\n PlotCreateResult,\n PlotDeleteResult,\n} from '../../types';\nimport type { PlotLayer as PlotLayerType } from '../../components/PlotLayer/leaflet-types';\n\n/** Plot 模式类型 */\nexport type PlotMode = 'idle' | 'create' | 'redraw' | 'clip' | 'move';\n\n/** Plot 状态接口 */\nexport interface PlotState {\n /** 当前模式 */\n mode: PlotMode;\n /** 选中的地块 ID */\n selectedId: string | number | null;\n /** 编辑中的图层 */\n editingLayer: PlotLayerType | L.GeoJSON | null;\n /** 临时坐标(绘制/编辑中) */\n tempCoordinates: Coordinate[] | Coordinate[][] | null;\n /** 剪切碎片图层 */\n clipFragments: L.Polygon[];\n /** 选中的剪切碎片 ID */\n selectedFragmentId: string | null;\n /** 是否预览模式(新建未保存) */\n isPreview: boolean;\n /** 编辑面积标签 */\n editAreaLabel: string | null;\n}\n\n/** Plot 动作类型 */\nexport type PlotAction =\n // 模式切换\n | { type: 'SET_MODE'; payload: PlotMode }\n // 选中\n | { type: 'SELECT_PLOT'; payload: string | number }\n | { type: 'DESELECT_PLOT' }\n // 编辑操作\n | { type: 'START_EDIT'; payload: { mode: PlotMode; layer: PlotLayerType | L.GeoJSON } }\n | { type: 'UPDATE_COORDINATES'; payload: Coordinate[] | Coordinate[][] }\n | { type: 'CLEAR_TEMP_COORDINATES' }\n // 保存/取消\n | {\n type: 'SAVE_EDIT';\n payload: PlotEditResult | PlotClipResult | PlotMoveResult | PlotCreateResult;\n }\n | { type: 'CANCEL_EDIT' }\n // 剪切相关\n | { type: 'ADD_CLIP_FRAGMENT'; payload: { layer: L.Polygon; id: string } }\n | { type: 'SELECT_FRAGMENT'; payload: string }\n | { type: 'CLEAR_FRAGMENTS' }\n // 标签\n | { type: 'UPDATE_AREA_LABEL'; payload: string }\n | { type: 'CLEAR_LABEL' }\n // 清理\n | { type: 'RESET' }\n | { type: 'DELETE_PLOT'; payload: PlotDeleteResult };\n\n/** 默认状态 */\nexport const DEFAULT_PLOT_STATE: PlotState = {\n mode: 'idle',\n selectedId: null,\n editingLayer: null,\n tempCoordinates: null,\n clipFragments: [],\n selectedFragmentId: null,\n isPreview: false,\n editAreaLabel: null,\n};\n","/**\n * @fileoverview Plot 纯状态机实现\n * @description 无副作用的纯状态机,便于测试和调试\n */\n\nimport type { PlotState, PlotAction } from './types';\nimport { DEFAULT_PLOT_STATE } from './types';\n\n/**\n * Plot 状态机\n */\nexport class PlotStateMachine {\n private state: PlotState;\n\n constructor(initialState: PlotState = DEFAULT_PLOT_STATE) {\n this.state = initialState;\n }\n\n /** 获取当前状态 */\n getState(): PlotState {\n return this.state;\n }\n\n /** 状态转换 */\n reduce(state: PlotState, action: PlotAction): PlotState {\n switch (action.type) {\n case 'SET_MODE':\n return { ...state, mode: action.payload };\n\n case 'SELECT_PLOT':\n return { ...state, selectedId: action.payload };\n\n case 'DESELECT_PLOT':\n return { ...state, selectedId: null };\n\n case 'START_EDIT':\n return {\n ...state,\n mode: action.payload.mode,\n editingLayer: action.payload.layer,\n isPreview: false,\n tempCoordinates: null,\n };\n\n case 'UPDATE_COORDINATES':\n return { ...state, tempCoordinates: action.payload };\n\n case 'CLEAR_TEMP_COORDINATES':\n return { ...state, tempCoordinates: null };\n\n case 'SAVE_EDIT':\n return {\n ...state,\n mode: 'idle',\n editingLayer: null,\n tempCoordinates: null,\n isPreview: false,\n clipFragments: [],\n selectedFragmentId: null,\n };\n\n case 'CANCEL_EDIT':\n return {\n ...state,\n mode: 'idle',\n editingLayer: null,\n tempCoordinates: null,\n isPreview: false,\n clipFragments: [],\n selectedFragmentId: null,\n };\n\n case 'ADD_CLIP_FRAGMENT':\n return {\n ...state,\n clipFragments: [...state.clipFragments, action.payload.layer],\n };\n\n case 'SELECT_FRAGMENT':\n return { ...state, selectedFragmentId: action.payload };\n\n case 'CLEAR_FRAGMENTS':\n return {\n ...state,\n clipFragments: [],\n selectedFragmentId: null,\n };\n\n case 'UPDATE_AREA_LABEL':\n return { ...state, editAreaLabel: action.payload };\n\n case 'CLEAR_LABEL':\n return { ...state, editAreaLabel: null };\n\n case 'RESET':\n return DEFAULT_PLOT_STATE;\n\n case 'DELETE_PLOT':\n return {\n ...state,\n mode: 'idle',\n selectedId: null,\n editingLayer: null,\n };\n\n default:\n return state;\n }\n }\n\n /** 处理动作并更新状态 */\n dispatch(action: PlotAction): PlotState {\n this.state = this.reduce(this.state, action);\n return this.state;\n }\n}\n\n/** 创建状态机 reducer 函数(用于 useReducer) */\nexport function createPlotReducer(initialState: PlotState = DEFAULT_PLOT_STATE) {\n const machine = new PlotStateMachine(initialState);\n return (state: PlotState, action: PlotAction): PlotState => {\n return machine.reduce(state, action);\n };\n}\n\nexport default PlotStateMachine;\n","/**\n * @fileoverview Plot 绘制事件处理 Hook\n * @description 处理 Leaflet-Geoman 绘制事件\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- Geoman API 需要 */\n\nimport { useCallback, useRef } from 'react';\nimport type L from 'leaflet';\nimport type { PlotAction } from '../types';\nimport type { PlotCreateResult, Coordinate } from '../../../types';\n\n/** 绘制回调接口 */\nexport interface DrawCallbacks {\n onCreate?: (result: PlotCreateResult) => void;\n}\n\n/** 绘制事件接口 */\nexport interface DrawVertexEvent {\n layer: L.Polygon;\n shape: string;\n workingLayer: L.Polygon;\n}\n\nexport interface DrawCreateEvent {\n layer: L.Polygon;\n shape: string;\n}\n\n/**\n * Plot 绘制事件处理 Hook\n */\nexport function usePlotDraw(dispatch: React.Dispatch<PlotAction>, callbacks: DrawCallbacks) {\n const callbacksRef = useRef(callbacks);\n callbacksRef.current = callbacks;\n\n /** 处理绘制顶点事件 */\n const handleDrawVertex = useCallback(\n (e: DrawVertexEvent) => {\n const latlngs = e.layer.getLatLngs();\n const coords = (Array.isArray(latlngs) && Array.isArray(latlngs[0])\n ? latlngs[0]\n : latlngs) as unknown as Coordinate[];\n dispatch({ type: 'UPDATE_COORDINATES', payload: coords });\n },\n [dispatch]\n );\n\n /** 处理绘制创建事件 */\n const handleDrawCreate = useCallback(\n (e: DrawCreateEvent) => {\n const latlngs = e.layer.getLatLngs();\n const coords = latlngs as unknown as Coordinate[][];\n dispatch({ type: 'UPDATE_COORDINATES', payload: coords });\n dispatch({ type: 'SET_MODE', payload: 'create' });\n\n // 通知外部回调\n callbacksRef.current.onCreate?.({\n mode: 'create',\n plotId: null as any,\n coordinates: coords,\n });\n },\n [dispatch]\n );\n\n return { handleDrawVertex, handleDrawCreate };\n}\n\nexport default usePlotDraw;\n","/**\n * @fileoverview Plot 剪切事件处理 Hook\n * @description 处理 Leaflet-Geoman 剪切事件\n */\n\nimport { useCallback, useRef } from 'react';\nimport type L from 'leaflet';\nimport type { PlotAction } from '../types';\nimport type { Coordinate } from '../../../types';\n\n/** 剪切回调接口 */\nexport interface ClipCallbacks {\n onClip?: (result: { originalId: string | number; fragments: Coordinate[][][] }) => void;\n selectedPlotId: string | number | null;\n}\n\n/** 剪切事件接口 */\nexport interface CutEvent {\n layer: L.Polygon;\n originalLayer: L.Polygon;\n layerGroup: L.LayerGroup;\n}\n\n/** 生成碎片 ID */\nfunction generateFragmentId(): string {\n return `fragment_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Plot 剪切事件处理 Hook\n */\nexport function usePlotClip(dispatch: React.Dispatch<PlotAction>, callbacks: ClipCallbacks) {\n const callbacksRef = useRef(callbacks);\n callbacksRef.current = callbacks;\n\n /** 处理剪切事件 */\n const handleCut = useCallback(\n (e: CutEvent) => {\n const layers = e.layerGroup.getLayers() as unknown as L.Polygon[];\n\n // 添加碎片\n layers.forEach((layer: L.Polygon) => {\n const fragmentId = generateFragmentId();\n layer.on('click', () => {\n dispatch({ type: 'SELECT_FRAGMENT', payload: fragmentId });\n });\n dispatch({ type: 'ADD_CLIP_FRAGMENT', payload: { layer, id: fragmentId } });\n });\n\n // 更新主图层坐标\n const newCoords = layers[0]?.getLatLngs();\n if (newCoords) {\n dispatch({ type: 'UPDATE_COORDINATES', payload: newCoords as unknown as Coordinate[][] });\n }\n },\n [dispatch]\n );\n\n /** 处理保存剪切 */\n const handleSaveClip = useCallback(() => {\n const state = callbacksRef.current;\n if (!state.selectedPlotId) return;\n\n callbacksRef.current.onClip?.({\n originalId: state.selectedPlotId,\n fragments: [],\n });\n\n dispatch({ type: 'CLEAR_FRAGMENTS' });\n }, [dispatch]);\n\n return { handleCut, handleSaveClip };\n}\n\nexport default usePlotClip;\n","/**\n * 面积计算工具\n * @description 提供多边形面积计算和单位转换功能\n */\n\nimport type { AreaUnit, AreaUnitConfig, Coordinate } from '../types';\n\n/**\n * 面积单位配置表\n */\nexport const AREA_UNIT_CONFIGS: Record<AreaUnit, AreaUnitConfig> = {\n square_meters: {\n unit: 'square_meters',\n label: '平方米',\n factor: 1,\n },\n hectares: {\n unit: 'hectares',\n label: '公顷',\n factor: 10000, // 1公顷 = 10000平方米\n },\n mu: {\n unit: 'mu',\n label: '亩',\n factor: 666.6666666666666, // 1亩 = 666.67平方米(精确值:2000/3)\n },\n acres: {\n unit: 'acres',\n label: '英亩',\n factor: 4046.8564224, // 1英亩 ≈ 4046.86平方米\n },\n};\n\n/**\n * 计算多边形面积(使用 Shoelace 公式)\n * @param coordinates 多边形顶点坐标数组 [lat, lng]\n * @returns 面积(平方米)\n */\nexport function calculatePolygonArea(coordinates: Coordinate[]): number {\n if (!coordinates || coordinates.length < 3) {\n return 0;\n }\n\n const n = coordinates.length;\n let area = 0;\n\n // 使用 Shoelace 公式计算球面面积\n // 需要将经纬度转换为平面坐标(使用简单的投影近似)\n // 对于小范围区域,可以使用简化的平面近似\n\n // 获取中心点纬度,用于计算经度到米的转换系数\n let sumLat = 0;\n for (let i = 0; i < n; i++) {\n sumLat += coordinates[i][0];\n }\n const avgLat = sumLat / n;\n const latRad = (avgLat * Math.PI) / 180;\n\n // 经纬度到米的转换系数\n const latToMeters = 111320; // 纬度1度约等于111.32公里\n const lngToMeters = 111320 * Math.cos(latRad); // 经度1度在当前纬度对应的米数\n\n // Shoelace 公式\n for (let i = 0; i < n; i++) {\n const j = (i + 1) % n;\n const lat1 = coordinates[i][0] * latToMeters;\n const lng1 = coordinates[i][1] * lngToMeters;\n const lat2 = coordinates[j][0] * latToMeters;\n const lng2 = coordinates[j][1] * lngToMeters;\n\n area += lng1 * lat2 - lng2 * lat1;\n }\n\n return Math.round(Math.abs(area / 2) * 100) / 100;\n}\n\n/**\n * 将面积从平方米转换为指定单位\n * @param areaSquareMeters 面积(平方米)\n * @param unit 目标单位\n * @returns 转换后的面积值\n */\nexport function convertArea(areaSquareMeters: number, unit: AreaUnit = 'mu'): number {\n const config = AREA_UNIT_CONFIGS[unit];\n return areaSquareMeters / config.factor;\n}\n\n/**\n * 格式化面积显示\n * @param areaSquareMeters 面积(平方米)\n * @param unit 目标单位\n * @param precision 小数位数\n * @returns 格式化后的面积字符串\n */\nexport function formatArea(areaSquareMeters: number, unit: AreaUnit = 'mu', precision = 2): string {\n const convertedArea = convertArea(areaSquareMeters, unit);\n const config = AREA_UNIT_CONFIGS[unit];\n return `${convertedArea.toFixed(precision)} ${config.label}`;\n}\n\n/**\n * 获取单位配置\n * @param unit 单位标识\n * @returns 单位配置\n */\nexport function getAreaUnitConfig(unit: AreaUnit): AreaUnitConfig {\n return AREA_UNIT_CONFIGS[unit];\n}\n\n/**\n * 数据边界计算结果\n */\nexport interface DataBoundsResult {\n /** 数据中心点 [lat, lng] */\n center: [number, number];\n /** Leaflet bounds 格式 [[south, west], [north, east]] */\n bounds: [[number, number], [number, number]];\n /** 西南角 [lat, lng] */\n southWest: [number, number];\n /** 东北角 [lat, lng] */\n northEast: [number, number];\n}\n\n/**\n * 根据数据源计算边界范围和中心点\n * @description 遍历所有地块坐标,计算全局最小/最大经纬度,返回中心点和边界\n * @param dataSource 地块数据数组(原始数据或标准化后的 PlotData 均可)\n * @param positionsField positions 字段名,默认 'positions'\n * @returns 边界计算结果,无有效数据时返回 null\n */\nexport function computeDataBounds(\n dataSource: Record<string, unknown>[],\n positionsField = 'positions'\n): DataBoundsResult | null {\n if (!dataSource || dataSource.length === 0) return null;\n\n let minLat = Infinity,\n minLng = Infinity;\n let maxLat = -Infinity,\n maxLng = -Infinity;\n let found = false;\n\n for (const item of dataSource) {\n const positions = item[positionsField];\n if (!positions || !Array.isArray(positions)) continue;\n\n // 将 positions 展平为坐标点数组\n // 支持 [[lat,lng],...] 或 [[[lat,lng],...], [孔洞], ...] 格式\n const flatten = (coords: unknown[]): void => {\n for (const c of coords) {\n if (\n Array.isArray(c) &&\n c.length >= 2 &&\n typeof c[0] === 'number' &&\n typeof c[1] === 'number'\n ) {\n // 二维坐标点 [lat, lng]\n if (c[0] < minLat) minLat = c[0];\n if (c[0] > maxLat) maxLat = c[0];\n if (c[1] < minLng) minLng = c[1];\n if (c[1] > maxLng) maxLng = c[1];\n found = true;\n } else if (Array.isArray(c)) {\n // 三维数组,递归展开\n flatten(c);\n }\n }\n };\n\n flatten(positions);\n }\n\n if (!found) return null;\n\n const southWest: [number, number] = [minLat, minLng];\n const northEast: [number, number] = [maxLat, maxLng];\n const bounds: [[number, number], [number, number]] = [southWest, northEast];\n const center: [number, number] = [(minLat + maxLat) / 2, (minLng + maxLng) / 2];\n\n return { center, bounds, southWest, northEast };\n}\n","/**\n * @fileoverview Plot 移动事件处理 Hook\n * @description 处理 Leaflet-Geoman 拖拽移动事件\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- Geoman API 需要 */\n\nimport { useCallback, useRef } from 'react';\nimport L from 'leaflet';\nimport type { PlotAction } from '../types';\nimport type { PlotMoveResult, Coordinate, AreaUnit } from '../../../types';\nimport { calculatePolygonArea, formatArea } from '../../../utils/area';\n\n/** 移动回调接口 */\nexport interface MoveCallbacks {\n onMove?: (result: PlotMoveResult) => void;\n selectedPlotId: string | number | null;\n areaUnit: AreaUnit;\n}\n\n/** 移动事件接口 */\nexport interface DragEvent {\n layer: L.Polygon;\n}\n\nexport interface DragEndEvent {\n layer: L.Polygon;\n}\n\n/**\n * Plot 移动事件处理 Hook\n * @param dispatch - 状态机 dispatch 函数\n * @param callbacks - 回调配置\n * @returns 移动事件处理函数\n */\nexport function usePlotMove(dispatch: React.Dispatch<PlotAction>, callbacks: MoveCallbacks) {\n const callbacksRef = useRef(callbacks);\n callbacksRef.current = callbacks;\n\n // 更新面积标签\n const updateAreaLabel = useCallback(\n (coords: Coordinate[], map: L.Map, existingMarker?: L.Marker | null) => {\n if (coords.length < 3) return null;\n\n const areaSquareMeters = calculatePolygonArea(coords);\n const text = formatArea(areaSquareMeters, callbacksRef.current.areaUnit);\n\n // 计算中心点\n let sumLat = 0,\n sumLng = 0;\n for (const coord of coords) {\n sumLat += coord[0];\n sumLng += coord[1];\n }\n const centroid: L.LatLngExpression = [sumLat / coords.length, sumLng / coords.length];\n\n const span = document.createElement('span');\n span.className = 'plot-area-label-text';\n span.textContent = text;\n\n const areaIcon = L.divIcon({\n className: 'plot-area-label',\n html: span.outerHTML,\n iconSize: [0, 0],\n iconAnchor: [0, 0],\n });\n\n if (existingMarker) {\n existingMarker.setLatLng(centroid);\n existingMarker.setIcon(areaIcon);\n return existingMarker;\n }\n\n return L.marker(centroid, { icon: areaIcon, interactive: false }).addTo(map);\n },\n []\n );\n\n /** 处理拖拽事件(实时更新) */\n const handleDrag = useCallback(\n (e: DragEvent, map: L.Map, areaMarkerRef: React.MutableRefObject<L.Marker | null>) => {\n const layer = e.layer;\n if (!layer.getLatLngs) return;\n\n const latlngs = (layer.getLatLngs() as L.LatLng[][])[0];\n const coords: Coordinate[] = latlngs.map(ll => [ll.lat, ll.lng]);\n\n dispatch({ type: 'UPDATE_COORDINATES', payload: coords });\n\n // 更新面积标签\n areaMarkerRef.current = updateAreaLabel(coords, map, areaMarkerRef.current);\n },\n [dispatch, updateAreaLabel]\n );\n\n /** 处理拖拽结束事件 */\n const handleDragEnd = useCallback(\n (e: DragEndEvent) => {\n const layer = e.layer;\n if (!layer.getLatLngs) return;\n\n const latlngs = (layer.getLatLngs() as L.LatLng[][])[0];\n const coords: Coordinate[] = latlngs.map(ll => [ll.lat, ll.lng]);\n\n dispatch({ type: 'UPDATE_COORDINATES', payload: coords });\n\n // 计算面积并准备保存\n const areaSquareMeters = calculatePolygonArea(coords);\n\n callbacksRef.current.onMove?.({\n mode: 'move',\n plotId: callbacksRef.current.selectedPlotId!,\n coordinates: coords,\n area: areaSquareMeters,\n areaUnit: callbacksRef.current.areaUnit,\n });\n },\n [dispatch]\n );\n\n /** 启用移动模式 */\n const enableMoveMode = useCallback(\n (layer: L.Polygon, map: L.Map, areaMarkerRef: React.MutableRefObject<L.Marker | null>) => {\n const pmLayer = layer as any;\n\n // 启用拖拽\n if (pmLayer.pm && pmLayer.pm.enableLayerDrag) {\n pmLayer.pm.enableLayerDrag();\n } else if (pmLayer.toggleEdit) {\n pmLayer.toggleEdit({ allowSelfIntersection: false, draggable: true });\n }\n\n // 绑定事件\n layer.on('pm:drag', (e: any) => handleDrag(e, map, areaMarkerRef));\n layer.on('pm:dragend', handleDragEnd as any);\n\n // 初始化面积标签\n const initLatlngs = (layer.getLatLngs() as L.LatLng[][])[0];\n const initCoords: Coordinate[] = initLatlngs.map(ll => [ll.lat, ll.lng]);\n areaMarkerRef.current = updateAreaLabel(initCoords, map, areaMarkerRef.current);\n },\n [handleDrag, handleDragEnd, updateAreaLabel]\n );\n\n /** 禁用移动模式 */\n const disableMoveMode = useCallback(\n (layer: L.Polygon, areaMarkerRef: React.MutableRefObject<L.Marker | null>, map: L.Map) => {\n const pmLayer = layer as any;\n\n // 禁用拖拽\n if (pmLayer.pm && pmLayer.pm.disableLayerDrag) {\n pmLayer.pm.disableLayerDrag();\n } else if (pmLayer.toggleEdit) {\n pmLayer.toggleEdit({ allowSelfIntersection: false, draggable: false });\n }\n\n // 解绑事件\n layer.off('pm:drag');\n layer.off('pm:dragend');\n\n // 移除面积标签\n if (areaMarkerRef.current) {\n map.removeLayer(areaMarkerRef.current);\n areaMarkerRef.current = null;\n }\n },\n []\n );\n\n return {\n handleDrag,\n handleDragEnd,\n enableMoveMode,\n disableMoveMode,\n updateAreaLabel,\n };\n}\n\nexport default usePlotMove;\n","/**\n * @fileoverview Plot 重绘事件处理 Hook\n * @description 处理 Leaflet-Geoman 编辑重绘事件\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- Geoman API 需要 */\n\nimport { useCallback, useRef } from 'react';\nimport L from 'leaflet';\nimport type { PlotAction } from '../types';\nimport type { PlotEditResult, Coordinate, AreaUnit } from '../../../types';\nimport { calculatePolygonArea, formatArea } from '../../../utils/area';\n\n/** 重绘回调接口 */\nexport interface RedrawCallbacks {\n onRedraw?: (result: PlotEditResult) => void;\n selectedPlotId: string | number | null;\n areaUnit: AreaUnit;\n}\n\n/** 编辑事件接口 */\nexport interface EditEvent {\n layer: L.Polygon;\n}\n\n/**\n * Plot 重绘事件处理 Hook\n * @param dispatch - 状态机 dispatch 函数\n * @param callbacks - 回调配置\n * @returns 重绘事件处理函数\n */\nexport function usePlotRedraw(dispatch: React.Dispatch<PlotAction>, callbacks: RedrawCallbacks) {\n const callbacksRef = useRef(callbacks);\n callbacksRef.current = callbacks;\n\n // 更新面积标签\n const updateAreaLabel = useCallback(\n (coords: Coordinate[], map: L.Map, existingMarker?: L.Marker | null) => {\n if (coords.length < 3) return null;\n\n const areaSquareMeters = calculatePolygonArea(coords);\n const text = formatArea(areaSquareMeters, callbacksRef.current.areaUnit);\n\n // 计算中心点\n let sumLat = 0,\n sumLng = 0;\n for (const coord of coords) {\n sumLat += coord[0];\n sumLng += coord[1];\n }\n const centroid: L.LatLngExpression = [sumLat / coords.length, sumLng / coords.length];\n\n const span = document.createElement('span');\n span.className = 'plot-area-label-text';\n span.textContent = text;\n\n const areaIcon = L.divIcon({\n className: 'plot-area-label',\n html: span.outerHTML,\n iconSize: [0, 0],\n iconAnchor: [0, 0],\n });\n\n if (existingMarker) {\n existingMarker.setLatLng(centroid);\n existingMarker.setIcon(areaIcon);\n return existingMarker;\n }\n\n return L.marker(centroid, { icon: areaIcon, interactive: false }).addTo(map);\n },\n []\n );\n\n /** 处理编辑事件 */\n const handleEdit = useCallback(\n (e: EditEvent, map: L.Map, areaMarkerRef: React.MutableRefObject<L.Marker | null>) => {\n const layer = e.layer;\n if (!layer.getLatLngs) return;\n\n const latlngs = (layer.getLatLngs() as L.LatLng[][])[0];\n const coords: Coordinate[] = latlngs.map(ll => [ll.lat, ll.lng]);\n\n dispatch({ type: 'UPDATE_COORDINATES', payload: coords });\n\n // 更新面积标签\n areaMarkerRef.current = updateAreaLabel(coords, map, areaMarkerRef.current);\n },\n [dispatch, updateAreaLabel]\n );\n\n /** 处理保存重绘 */\n const handleSaveRedraw = useCallback(\n (layer: L.Polygon) => {\n if (!layer.getLatLngs) return;\n\n const latlngs = (layer.getLatLngs() as L.LatLng[][])[0];\n const coords: Coordinate[] = latlngs.map(ll => [ll.lat, ll.lng]);\n\n const areaSquareMeters = calculatePolygonArea(coords);\n\n callbacksRef.current.onRedraw?.({\n mode: 'redraw',\n plotId: callbacksRef.current.selectedPlotId!,\n coordinates: coords,\n area: areaSquareMeters,\n areaUnit: callbacksRef.current.areaUnit,\n });\n\n dispatch({ type: 'SAVE_EDIT', payload: {} as any });\n },\n [dispatch]\n );\n\n /** 启用重绘模式 */\n const enableRedrawMode = useCallback(\n (layer: L.Polygon, map: L.Map, areaMarkerRef: React.MutableRefObject<L.Marker | null>) => {\n const pmLayer = layer as any;\n\n // 启用编辑\n if (pmLayer.pm && pmLayer.pm.enable) {\n pmLayer.pm.enable({ allowSelfIntersection: false });\n } else if (pmLayer.toggleEdit) {\n pmLayer.toggleEdit({ allowSelfIntersection: false });\n }\n\n // 绑定编辑事件\n layer.on('pm:edit', (e: any) => handleEdit(e, map, areaMarkerRef));\n\n // 初始化面积标签\n const initLatlngs = (layer.getLatLngs() as L.LatLng[][])[0];\n const initCoords: Coordinate[] = initLatlngs.map(ll => [ll.lat, ll.lng]);\n areaMarkerRef.current = updateAreaLabel(initCoords, map, areaMarkerRef.current);\n\n dispatch({\n type: 'START_EDIT',\n payload: { mode: 'redraw', layer: layer as unknown as L.GeoJSON },\n });\n },\n [handleEdit, updateAreaLabel, dispatch]\n );\n\n /** 禁用重绘模式 */\n const disableRedrawMode = useCallback(\n (layer: L.Polygon, areaMarkerRef: React.MutableRefObject<L.Marker | null>, map: L.Map) => {\n const pmLayer = layer as any;\n\n // 禁用编辑\n if (pmLayer.pm && pmLayer.pm.disable) {\n pmLayer.pm.disable();\n } else if (pmLayer.toggleEdit) {\n pmLayer.toggleEdit();\n }\n\n // 解绑事件\n layer.off('pm:edit');\n\n // 移除面积标签\n if (areaMarkerRef.current) {\n map.removeLayer(areaMarkerRef.current);\n areaMarkerRef.current = null;\n }\n },\n []\n );\n\n return {\n handleEdit,\n handleSaveRedraw,\n enableRedrawMode,\n disableRedrawMode,\n updateAreaLabel,\n };\n}\n\nexport default usePlotRedraw;\n","/**\n * @fileoverview Plot 状态机主 Hook\n * @description 整合所有子 Hook,提供完整的编辑模式状态管理\n * @since 1.4.0\n */\n\n/* eslint-disable react-hooks/exhaustive-deps -- ref 回调稳定 */\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- 状态机需要 */\n\nimport { useEffect, useReducer, useRef, useMemo, useCallback } from 'react';\nimport type L from 'leaflet';\nimport { createPlotReducer } from './plotStateMachine';\nimport type { PlotState, PlotAction, PlotMode } from './types';\nimport { DEFAULT_PLOT_STATE } from './types';\nimport { usePlotDraw } from './hooks/usePlotDraw';\nimport { usePlotClip } from './hooks/usePlotClip';\nimport { usePlotMove } from './hooks/usePlotMove';\nimport { usePlotRedraw } from './hooks/usePlotRedraw';\nimport type {\n PlotEditMode,\n PlotEditResult,\n PlotClipResult,\n PlotMoveResult,\n PlotCreateResult,\n PlotDeleteResult,\n Coordinate,\n AreaUnit,\n PlotData,\n} from '../../types';\nimport { calculatePolygonArea } from '../../utils/area';\n\n/** 状态机配置选项 */\nexport interface PlotStateMachineOptions {\n /** Leaflet 地图实例 */\n map: L.Map | null;\n /** 当前选中的地块 ID */\n selectedPlotId: string | number | null;\n /** 启用的编辑按钮 */\n enabledButtons: string[];\n /** 面积单位 */\n areaUnit: AreaUnit;\n /** 重绘回调 */\n onRedraw?: (result: PlotEditResult) => void;\n /** 剪切回调 */\n onClip?: (result: PlotClipResult) => void;\n /** 移动回调 */\n onMove?: (result: PlotMoveResult) => void;\n /** 新建回调 */\n onCreate?: (result: PlotCreateResult) => void;\n /** 保存回调 */\n onSave?: (result: PlotEditResult) => void;\n /** 删除回调 */\n onDelete?: (result: PlotDeleteResult) => void;\n /** 编辑属性回调 */\n onEdit?: (result: { plotId: string | number; plot: PlotData }) => void;\n}\n\n/** 状态机返回值 */\nexport interface PlotStateMachineResult {\n /** 当前状态 */\n state: PlotState;\n /** dispatch 函数 */\n dispatch: React.Dispatch<PlotAction>;\n /** 当前编辑模式 */\n editMode: PlotEditMode;\n /** 是否预览模式 */\n isPreviewMode: boolean;\n /** 剪切提示信息 */\n clipHintMessage: string;\n /** 保存 */\n handleSave: () => void;\n /** 取消 */\n handleCancel: () => void;\n /** 重绘 */\n handleRedraw: () => void;\n /** 剪切 */\n handleClip: () => void;\n /** 移动 */\n handleMove: () => void;\n /** 新建 */\n handleCreate: () => void;\n /** 删除 */\n handleDelete: () => void;\n /** 编辑属性 */\n handleEdit: () => void;\n /** 进入编辑模式 */\n startEdit: (mode: PlotEditMode, layer: L.GeoJSON) => void;\n /** 清除临时图层 */\n clearTempLayer: () => void;\n /** 面积标签 Marker ref */\n areaMarkerRef: React.MutableRefObject<L.Marker | null>;\n}\n\n/**\n * Plot 状态机主 Hook\n * @param options 配置选项\n * @returns 状态和处理函数\n *\n * @example\n * ```tsx\n * const {\n * editMode,\n * handleSave,\n * handleCancel,\n * handleRedraw,\n * handleClip,\n * handleMove,\n * handleCreate,\n * handleDelete,\n * } = usePlotStateMachine({\n * map,\n * selectedPlotId,\n * enabledButtons: ['redraw', 'clip', 'move', 'create', 'delete'],\n * areaUnit: 'mu',\n * onRedraw: (result) => console.log('重绘:', result),\n * onClip: (result) => console.log('剪切:', result),\n * onMove: (result) => console.log('移动:', result),\n * onCreate: (result) => console.log('新建:', result),\n * });\n * ```\n */\nexport function usePlotStateMachine(options: PlotStateMachineOptions): PlotStateMachineResult {\n const { map, selectedPlotId, enabledButtons, areaUnit } = options;\n\n // 创建 reducer\n const reducer = useMemo(() => createPlotReducer(DEFAULT_PLOT_STATE), []);\n\n // 初始化状态\n const [state, dispatch] = useReducer(reducer, DEFAULT_PLOT_STATE);\n\n // Refs\n const areaMarkerRef = useRef<L.Marker | null>(null);\n\n // 回调 refs\n const callbacksRef = useRef({\n onRedraw: options.onRedraw,\n onClip: options.onClip,\n onMove: options.onMove,\n onCreate: options.onCreate,\n onSave: options.onSave,\n onDelete: options.onDelete,\n onEdit: options.onEdit,\n selectedPlotId: options.selectedPlotId,\n areaUnit: options.areaUnit,\n });\n\n // 更新 callbacksRef\n useEffect(() => {\n callbacksRef.current = {\n onRedraw: options.onRedraw,\n onClip: options.onClip,\n onMove: options.onMove,\n onCreate: options.onCreate,\n onSave: options.onSave,\n onDelete: options.onDelete,\n onEdit: options.onEdit,\n selectedPlotId: options.selectedPlotId,\n areaUnit: options.areaUnit,\n };\n }, [\n options.onRedraw,\n options.onClip,\n options.onMove,\n options.onCreate,\n options.onSave,\n options.onDelete,\n options.onEdit,\n options.selectedPlotId,\n options.areaUnit,\n ]);\n\n // 子 hooks\n const { handleDrawVertex, handleDrawCreate } = usePlotDraw(dispatch, {\n onCreate: options.onCreate,\n });\n\n const { handleCut } = usePlotClip(dispatch, {\n onClip: options.onClip as unknown as (result: {\n originalId: string | number;\n fragments: unknown[][];\n }) => void,\n selectedPlotId: options.selectedPlotId,\n });\n\n // usePlotMove 和 usePlotRedraw 提供的方法暂未在主 Hook 中使用\n // 保留解构以备后续扩展\n const {\n handleDrag: _handleDrag,\n handleDragEnd: _handleDragEnd,\n enableMoveMode: _enableMoveMode,\n disableMoveMode: _disableMoveMode,\n } = usePlotMove(dispatch, {\n onMove: options.onMove,\n selectedPlotId: options.selectedPlotId,\n areaUnit: options.areaUnit,\n });\n\n const {\n handleEdit: _handleRedrawEdit,\n handleSaveRedraw: _handleSaveRedraw,\n enableRedrawMode: _enableRedrawMode,\n disableRedrawMode: _disableRedrawMode,\n } = usePlotRedraw(dispatch, {\n onRedraw: options.onRedraw,\n selectedPlotId: options.selectedPlotId,\n areaUnit: options.areaUnit,\n });\n\n // 地图事件监听\n useEffect(() => {\n if (!map) return;\n\n const pm = (map as any)._pm;\n if (!pm) return;\n\n map.on('pm:drawvertex', handleDrawVertex as any);\n map.on('pm:create', handleDrawCreate as any);\n map.on('pm:cut', handleCut as any);\n\n return () => {\n map.off('pm:drawvertex', handleDrawVertex as any);\n map.off('pm:create', handleDrawCreate as any);\n map.off('pm:cut', handleCut as any);\n };\n }, [map, handleDrawVertex, handleDrawCreate, handleCut]);\n\n // ========== 操作处理函数 ==========\n\n const handleSave = useCallback(() => {\n const coords = state.tempCoordinates;\n\n if (!coords) {\n // 尝试从编辑图层获取坐标\n if (state.editingLayer) {\n const layer = state.editingLayer as unknown as L.Polygon;\n if (layer.getLatLngs) {\n const latlngs = (layer.getLatLngs() as L.LatLng[][])[0];\n const newCoords: Coordinate[] = latlngs.map(ll => [ll.lat, ll.lng]);\n if (newCoords.length >= 3) {\n const area = calculatePolygonArea(newCoords);\n const result: PlotEditResult = {\n mode: state.mode as PlotEditMode,\n plotId: state.selectedId!,\n coordinates: newCoords,\n area,\n areaUnit: callbacksRef.current.areaUnit,\n };\n callbacksRef.current.onSave?.(result);\n dispatch({ type: 'SAVE_EDIT', payload: result });\n return;\n }\n }\n }\n return;\n }\n\n const flatCoords = Array.isArray(coords[0])\n ? (coords as Coordinate[][])[0]\n : (coords as Coordinate[]);\n\n if (flatCoords.length < 3) return;\n\n const area = calculatePolygonArea(flatCoords);\n\n const result: PlotEditResult = {\n mode: state.mode as PlotEditMode,\n plotId: state.selectedId!,\n coordinates: flatCoords,\n area,\n areaUnit: callbacksRef.current.areaUnit,\n };\n\n // 根据模式调用对应回调\n switch (state.mode) {\n case 'redraw':\n callbacksRef.current.onRedraw?.(result);\n break;\n case 'clip':\n callbacksRef.current.onClip?.(result as PlotClipResult);\n break;\n case 'move':\n callbacksRef.current.onMove?.(result as PlotMoveResult);\n break;\n case 'create':\n callbacksRef.current.onCreate?.(result as PlotCreateResult);\n break;\n }\n\n callbacksRef.current.onSave?.(result);\n dispatch({ type: 'SAVE_EDIT', payload: result });\n }, [state.mode, state.selectedId, state.tempCoordinates, state.editingLayer, areaUnit]);\n\n const handleCancel = useCallback(() => {\n // 清理面积标签\n if (areaMarkerRef.current && map) {\n map.removeLayer(areaMarkerRef.current);\n areaMarkerRef.current = null;\n }\n\n dispatch({ type: 'CANCEL_EDIT' });\n }, [map]);\n\n const handleRedraw = useCallback(() => {\n if (!enabledButtons.includes('redraw')) return;\n if (!selectedPlotId) return;\n dispatch({ type: 'SET_MODE', payload: 'redraw' });\n }, [selectedPlotId, enabledButtons]);\n\n const handleClip = useCallback(() => {\n if (!enabledButtons.includes('clip')) return;\n if (!selectedPlotId) return;\n dispatch({ type: 'SET_MODE', payload: 'clip' });\n }, [selectedPlotId, enabledButtons]);\n\n const handleMove = useCallback(() => {\n if (!enabledButtons.includes('move')) return;\n if (!selectedPlotId) return;\n dispatch({ type: 'SET_MODE', payload: 'move' });\n }, [selectedPlotId, enabledButtons]);\n\n const handleCreate = useCallback(() => {\n if (!enabledButtons.includes('create')) return;\n dispatch({ type: 'SET_MODE', payload: 'create' });\n }, [enabledButtons]);\n\n const handleEdit = useCallback(() => {\n if (!enabledButtons.includes('edit')) return;\n if (!selectedPlotId) return;\n callbacksRef.current.onEdit?.({\n plotId: selectedPlotId,\n plot: {} as PlotData, // 实际使用时需要传入真实数据\n });\n }, [selectedPlotId, enabledButtons]);\n\n const handleDelete = useCallback(() => {\n if (!enabledButtons.includes('delete')) return;\n if (!selectedPlotId) return;\n callbacksRef.current.onDelete?.({ plotId: selectedPlotId });\n dispatch({ type: 'DELETE_PLOT', payload: { plotId: selectedPlotId } as any });\n }, [selectedPlotId, enabledButtons]);\n\n const startEdit = useCallback((mode: PlotEditMode, layer: L.GeoJSON) => {\n dispatch({ type: 'START_EDIT', payload: { mode: mode as PlotMode, layer } });\n }, []);\n\n const clearTempLayer = useCallback(() => {\n dispatch({ type: 'CLEAR_TEMP_COORDINATES' });\n }, []);\n\n return {\n state,\n dispatch,\n editMode: state.mode as PlotEditMode,\n isPreviewMode: state.isPreview,\n clipHintMessage: state.selectedFragmentId ? '点击保存选中的碎片' : '',\n handleSave,\n handleCancel,\n handleRedraw,\n handleClip,\n handleMove,\n handleCreate,\n handleDelete,\n handleEdit,\n startEdit,\n clearTempLayer,\n areaMarkerRef,\n };\n}\n\n// 导出类型和子模块\nexport { PlotStateMachine, createPlotReducer } from './plotStateMachine';\nexport type { PlotState, PlotAction, PlotMode } from './types';\nexport { DEFAULT_PLOT_STATE } from './types';\nexport * from './hooks';\n\nexport default usePlotStateMachine;\n","/**\n * 顶点样式修复 Hook\n * @description 修复 Leaflet Geoman 编辑模式下顶点标记样式被覆盖的问题\n * @since 1.4.0\n */\n\nimport { useEffect, useRef } from 'react';\nimport type { RefObject } from 'react';\n\n/**\n * 配置选项\n */\nexport interface UseVertexStyleFixOptions {\n /** 顶点颜色,默认 '#fff' */\n vertexColor?: string;\n /** 顶点大小,默认 10 */\n vertexSize?: number;\n /** 修复延迟(ms),默认 50 */\n delay?: number;\n}\n\nconst DEFAULT_OPTIONS: Required<UseVertexStyleFixOptions> = {\n vertexColor: '#fff',\n vertexSize: 10,\n delay: 50,\n};\n\n/**\n * 顶点样式修复 Hook\n * @param container 容器元素 Ref\n * @param options 配置选项\n *\n * @description\n * Leaflet Geoman 在编辑模式下会创建顶点标记,\n * 但其默认样式可能被其他 CSS 覆盖,此 Hook 用于强制应用正确的顶点样式。\n *\n * @example\n * ```tsx\n * function RoadEditor() {\n * const containerRef = useRef<HTMLDivElement>(null);\n *\n * // 修复顶点样式\n * useVertexStyleFix(containerRef, {\n * vertexColor: '#fa8c16',\n * vertexSize: 12,\n * });\n *\n * return <div ref={containerRef}>...</div>;\n * }\n * ```\n */\nexport function useVertexStyleFix(\n container: RefObject<HTMLElement | null>,\n options: UseVertexStyleFixOptions = {}\n): void {\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n if (!container.current) return;\n\n const fixVertexStyle = () => {\n const markers = container.current?.querySelectorAll('.marker-icon,.vertex-marker');\n\n if (!markers || markers.length === 0) return;\n\n markers.forEach(marker => {\n const el = marker as HTMLElement;\n const currentBg = el.style.background;\n const currentBorder = el.style.border;\n\n // 仅在样式被覆盖时修复\n if (!currentBg.includes(mergedOptions.vertexColor)) {\n el.style.setProperty('background', mergedOptions.vertexColor, 'important');\n }\n\n const expectedBorder = `${mergedOptions.vertexSize}px solid ${mergedOptions.vertexColor}`;\n if (currentBorder !== expectedBorder) {\n el.style.setProperty('border', expectedBorder, 'important');\n }\n });\n };\n\n // 延迟执行,等待 Geoman 完成初始化\n timerRef.current = setTimeout(fixVertexStyle, mergedOptions.delay);\n\n // 清理定时器\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, [container, mergedOptions.vertexColor, mergedOptions.vertexSize, mergedOptions.delay]);\n\n // 监听 DOM 变化(可选,用于动态添加的顶点)\n useEffect(() => {\n if (!container.current) return;\n\n const observer = new MutationObserver(() => {\n // 使用 requestAnimationFrame 避免频繁触发\n requestAnimationFrame(() => {\n const markers = container.current?.querySelectorAll('.marker-icon,.vertex-marker');\n if (markers && markers.length > 0) {\n markers.forEach(marker => {\n const el = marker as HTMLElement;\n el.style.setProperty('background', mergedOptions.vertexColor, 'important');\n el.style.setProperty(\n 'border',\n `${mergedOptions.vertexSize}px solid ${mergedOptions.vertexColor}`,\n 'important'\n );\n });\n }\n });\n });\n\n observer.observe(container.current, {\n childList: true,\n subtree: true,\n });\n\n return () => {\n observer.disconnect();\n };\n }, [container, mergedOptions.vertexColor, mergedOptions.vertexSize]);\n}\n","/**\n * 几何计算工具函数\n */\n\nimport L from 'leaflet';\nimport type { Coordinate } from '../types';\n\n/**\n * 计算两点之间的距离(米)\n * @param point1 - 点1 [lat, lng]\n * @param point2 - 点2 [lat, lng]\n * @returns 距离(米)\n */\nexport const getDistance = (point1: Coordinate, point2: Coordinate): number => {\n const latlng1 = L.latLng(point1[0], point1[1]);\n const latlng2 = L.latLng(point2[0], point2[1]);\n return latlng1.distanceTo(latlng2);\n};\n\n/**\n * 计算两点之间的中点\n * @param point1 - 点1 [lat, lng]\n * @param point2 - 点2 [lat, lng]\n * @returns 中点 [lat, lng]\n */\nexport const getMiddlePoint = (point1: Coordinate, point2: Coordinate): Coordinate => {\n return [(point1[0] + point2[0]) / 2, (point1[1] + point2[1]) / 2];\n};\n\n/**\n * 格式化距离显示\n * @param distance - 距离(米)\n * @returns 格式化后的距离字符串\n */\nexport const formatDistance = (distance: number): string => {\n if (distance < 1000) {\n return `${Math.round(distance)}m`;\n }\n return `${(distance / 1000).toFixed(2)}km`;\n};\n\n/** 角度输出模式 */\ntype AngleMode = 'text' | 'compass';\n\n/**\n * 计算两点之间的原始角度(弧度→度数),供 getAngle / getLineAngle 复用\n * @param map - Leaflet地图实例\n * @param point1 - 点1 [lat, lng]\n * @param point2 - 点2 [lat, lng]\n * @param mode - 输出模式:'text' 钳制到 [-90,90](文字可读),'compass' 标准化到 [0,360]\n */\nfunction calcAngle(map: L.Map, point1: Coordinate, point2: Coordinate, mode: AngleMode): number {\n const p1 = map.latLngToContainerPoint(L.latLng(point1[0], point1[1]));\n const p2 = map.latLngToContainerPoint(L.latLng(point2[0], point2[1]));\n const dx = p2.x - p1.x;\n const dy = p2.y - p1.y;\n let angle = (Math.atan2(dy, dx) * 180) / Math.PI;\n\n if (mode === 'text') {\n // 调整角度,使文字始终正向可读\n if (angle > 90) angle -= 180;\n else if (angle < -90) angle += 180;\n } else {\n // 标准化到 0-360\n if (angle < 0) angle += 360;\n }\n\n return angle;\n}\n\n/**\n * 计算两点之间的角度(度),用于文字旋转\n * @param map - Leaflet地图实例\n * @param point1 - 点1 [lat, lng]\n * @param point2 - 点2 [lat, lng]\n * @returns 角度(度)\n */\nexport const getAngle = (map: L.Map, point1: Coordinate, point2: Coordinate): number =>\n calcAngle(map, point1, point2, 'text');\n\n/**\n * 计算线段角度(用于图标旋转)\n * @param map - Leaflet地图实例\n * @param point1 - 起点 [lat, lng]\n * @param point2 - 终点 [lat, lng]\n * @returns 角度(度,0-360)\n */\nexport const getLineAngle = (\n map: L.Map | null | undefined,\n point1: Coordinate,\n point2: Coordinate\n): number => {\n if (!map) return 0;\n return calcAngle(map, point1, point2, 'compass');\n};\n","/**\n * 图标创建工具函数\n */\n\nimport L from 'leaflet';\nimport type { DecoratorConfig, PathOptions } from '../types';\nimport { formatDistance } from './geometry';\n\n/** 距离图标选项 */\ninterface CreateDistanceIconOptions {\n color?: string;\n textShadow?: string;\n}\n\n/**\n * 创建距离标签图标\n * @param distance - 距离(米)\n * @param angle - 旋转角度\n * @param className - CSS类名前缀\n * @param options - 其他选项\n * @returns Leaflet DivIcon\n */\nexport const createDistanceIcon = (\n distance: number,\n angle = 0,\n className = 'distance-label',\n options: CreateDistanceIconOptions = {}\n): L.DivIcon => {\n const { color } = options;\n\n let style = `transform: rotate(${angle}deg);`;\n if (color) {\n style += ` color: ${color};`;\n }\n\n const labelClass = `${className}`;\n\n return L.divIcon({\n html: `<div class=\"${labelClass}\" style=\"${style}\">${formatDistance(distance)}</div>`,\n iconSize: [60, 20],\n iconAnchor: [30, 10],\n className: `${className}-wrapper`,\n });\n};\n\n/**\n * 创建流向箭头装饰器配置\n * @param decoratorConfig - 装饰器配置\n * @param style - 样式配置\n * @param defaultColor - 默认颜色\n * @returns patterns 数组\n */\nexport const createDecoratorPatterns = (\n decoratorConfig: boolean | DecoratorConfig,\n style: PathOptions = {},\n defaultColor = '#1E90FF'\n): L.PatternOptions[] => {\n if (!decoratorConfig) return [];\n\n const color = style.color || defaultColor;\n\n const defaults: DecoratorConfig = {\n offset: 0,\n repeat: 50,\n options: {\n pixelSize: 8,\n color: color,\n weight: 2,\n },\n };\n\n const config: DecoratorConfig =\n decoratorConfig === true ? defaults : { ...defaults, ...decoratorConfig };\n\n // 使用 L.Symbol 创建箭头符号\n const symbol = L.Symbol.arrowHead({\n pixelSize: config.options?.pixelSize || 8,\n polygon: false,\n pathOptions: {\n stroke: true,\n color: config.options?.color || color,\n weight: config.options?.weight || 2,\n },\n });\n\n return [\n {\n offset: config.offset ?? 0,\n repeat: config.repeat ?? 50,\n symbol,\n },\n ];\n};\n\n/**\n * 创建进水口图标\n * @param rotation - 旋转角度(度)\n * @returns Leaflet DivIcon\n */\nexport const createInletIcon = (rotation = 0): L.DivIcon => {\n return L.divIcon({\n html: `\n <div class=\"irrigation-port irrigation-port--inlet\" style=\"transform: rotate(${rotation}deg)\">\n <svg viewBox=\"0 0 24 24\" width=\"36\" height=\"36\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#1E90FF\" stroke=\"#fff\" stroke-width=\"2\"/>\n <g class=\"irrigation-port__arrow\">\n <path d=\"M12 6v9\" stroke=\"#fff\" stroke-width=\"2.5\" stroke-linecap=\"round\"/>\n <path d=\"M8 11l4 5 4-5\" stroke=\"#fff\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>\n </g>\n </svg>\n <span class=\"irrigation-port__label\" style=\"transform: rotate(${-rotation}deg)\">进水口</span>\n </div>\n `,\n iconSize: [36, 36],\n iconAnchor: [18, 18],\n className: 'irrigation-port-wrapper',\n });\n};\n\n/**\n * 创建出水口图标\n * @param rotation - 旋转角度(度)\n * @returns Leaflet DivIcon\n */\nexport const createOutletIcon = (rotation = 0): L.DivIcon => {\n return L.divIcon({\n html: `\n <div class=\"irrigation-port irrigation-port--outlet\" style=\"transform: rotate(${rotation}deg)\">\n <svg viewBox=\"0 0 24 24\" width=\"36\" height=\"36\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#52c41a\" stroke=\"#fff\" stroke-width=\"2\"/>\n <g class=\"irrigation-port__arrow\">\n <path d=\"M12 18v-9\" stroke=\"#fff\" stroke-width=\"2.5\" stroke-linecap=\"round\"/>\n <path d=\"M8 13l4-5 4 5\" stroke=\"#fff\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>\n </g>\n </svg>\n <span class=\"irrigation-port__label\" style=\"transform: rotate(${-rotation}deg)\">出水口</span>\n </div>\n `,\n iconSize: [36, 36],\n iconAnchor: [18, 18],\n className: 'irrigation-port-wrapper',\n });\n};\n","/**\n * 距离标签 Hook\n * @description 为线要素(道路、灌溉渠等)生成距离标签\n * @since 1.4.0\n */\n\nimport { useMemo } from 'react';\nimport L from 'leaflet';\nimport type { Coordinate } from '../types';\nimport { getDistance, getMiddlePoint } from '../utils/geometry';\nimport { createDistanceIcon } from '../utils/leafletIcons';\n\n/**\n * 距离标签数据\n */\nexport interface DistanceLabel {\n /** 标签位置坐标 */\n position: Coordinate;\n /** 距离值(米) */\n distance: number;\n /** 旋转角度(度) */\n angle: number;\n /** Leaflet Marker 实例 */\n marker: L.Marker;\n}\n\n/**\n * 配置选项\n */\nexport interface UseDistanceLabelsOptions {\n /** 是否启用,默认 true */\n enabled?: boolean;\n /** 标签类型,默认 'distance' */\n labelType?: 'distance' | 'area';\n /** 距离格式化函数 */\n formatDistance?: (distance: number) => string;\n /** 标签前缀 */\n prefix?: string;\n}\n\nconst DEFAULT_OPTIONS: Required<UseDistanceLabelsOptions> = {\n enabled: true,\n labelType: 'distance',\n formatDistance: distance => `${distance.toFixed(1)}m`,\n prefix: '',\n};\n\n/**\n * 距离标签 Hook\n * @param points 坐标点数组\n * @param map 地图实例\n * @param options 配置选项\n * @returns 距离标签数组\n *\n * @description\n * 为线要素的每个线段生成距离标签,自动计算:\n * - 线段中点位置\n * - 线段长度(米)\n * - 线段角度(用于标签旋转)\n *\n * @example\n * ```tsx\n * function RoadEditor({ points, map }) {\n * const labels = useDistanceLabels(points, map);\n *\n * return (\n * <>\n * {labels.map((label, i) => (\n * <Marker key={i} position={label.position} icon={label.icon} />\n * ))}\n * </>\n * );\n * }\n * ```\n */\nexport function useDistanceLabels(\n points: Coordinate[],\n map: L.Map | null,\n options: UseDistanceLabelsOptions = {}\n): DistanceLabel[] {\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n\n return useMemo(() => {\n if (!mergedOptions.enabled || !map || points.length < 2) {\n return [];\n }\n\n const labels: DistanceLabel[] = [];\n\n for (let i = 0; i < points.length - 1; i++) {\n const point1 = points[i];\n const point2 = points[i + 1];\n\n if (!point1 || !point2) continue;\n\n // 计算距离\n const distance = getDistance(point1, point2);\n\n // 计算中点\n const middlePoint = getMiddlePoint(point1, point2);\n if (!middlePoint) continue;\n\n // 计算角度\n const deltaLng = point2[0] - point1[0];\n const deltaLat = point2[1] - point1[1];\n const angle = Math.atan2(deltaLng, deltaLat) * (180 / Math.PI);\n\n // 创建距离图标\n const icon = createDistanceIcon(distance, angle, `${mergedOptions.labelType}-label`);\n\n // 创建 Marker\n const marker = L.marker(middlePoint as L.LatLngExpression, {\n icon,\n zIndexOffset: 1000, // 确保标签在最上层\n });\n\n labels.push({\n position: middlePoint,\n distance,\n angle,\n marker,\n });\n }\n\n return labels;\n }, [points, map, mergedOptions.enabled, mergedOptions.labelType]);\n}\n\n/**\n * 简化的距离计算 Hook(仅返回数据,不创建 Marker)\n * @description 适用于只需要距离数据,不需要渲染 Marker 的场景\n *\n * @example\n * ```tsx\n * const distanceData = useDistanceData(points);\n * console.log(`总距离:${distanceData.total.toFixed(2)}m`);\n * distanceData.segments.forEach(seg => {\n * console.log(`段 ${seg.index}: ${seg.distance}m`);\n * });\n * ```\n */\nexport function useDistanceData(points: Coordinate[]): {\n /** 总距离(米) */\n total: number;\n /** 各段距离 */\n segments: {\n index: number;\n distance: number;\n middle: Coordinate;\n }[];\n} {\n return useMemo(() => {\n if (points.length < 2) {\n return { total: 0, segments: [] };\n }\n\n const segments: {\n index: number;\n distance: number;\n middle: Coordinate;\n }[] = [];\n let total = 0;\n\n for (let i = 0; i < points.length - 1; i++) {\n const point1 = points[i];\n const point2 = points[i + 1];\n\n if (!point1 || !point2) continue;\n\n const distance = getDistance(point1, point2);\n const middle = getMiddlePoint(point1, point2) || point1;\n\n total += distance;\n segments.push({\n index: i,\n distance,\n middle,\n });\n }\n\n return { total, segments };\n }, [points]);\n}\n","/**\n * @fileoverview 增量更新 Hook\n * @description 优化大面积数据集的增量更新,避免全量重建\n * @since 1.4.0\n */\n\nimport { useCallback, useRef, useMemo } from 'react';\n\n/** 更新项类型 */\nexport interface UpdateItem<T> {\n id: string | number;\n data: T;\n type: 'add' | 'update' | 'remove';\n}\n\n/** 增量更新配置 */\nexport interface IncrementalUpdateOptions<T, R> {\n /** 获取项 ID */\n getId: (item: T) => string | number;\n /** 判断两项是否相等 */\n isEqual?: (a: T, b: T) => boolean;\n /** 应用更新到结果 */\n applyUpdate: (result: R, item: T, type: 'add' | 'update' | 'remove') => void;\n /** 创建初始结果 */\n createInitial: () => R;\n}\n\n/** 增量更新 Hook 返回值 */\nexport interface IncrementalUpdateResult<T, R> {\n /** 当前结果 */\n result: R;\n /** 应用增量更新 */\n applyIncremental: (prevItems: T[], newItems: T[]) => void;\n /** 强制全量重建 */\n rebuild: (items: T[]) => void;\n /** 获取更新差异 */\n getDiff: (prevItems: T[], newItems: T[]) => UpdateItem<T>[];\n}\n\n/**\n * 增量更新 Hook\n * @description 比较前后数据差异,只更新变化的部分\n *\n * @param options 配置选项\n * @returns 增量更新方法和结果\n *\n * @example\n * ```tsx\n * const { result, applyIncremental, getDiff } = useIncrementalUpdate({\n * getId: (plot) => plot.id,\n * isEqual: (a, b) => a.name === b.name && a.area === b.area,\n * applyUpdate: (map, item, type) => {\n * if (type === 'add') map.set(item.id, item);\n * else if (type === 'remove') map.delete(item.id);\n * else map.set(item.id, item);\n * },\n * createInitial: () => new Map(),\n * });\n *\n * // 应用增量更新\n * applyIncremental(prevData, newData);\n * ```\n */\nexport function useIncrementalUpdate<T, R>(\n options: IncrementalUpdateOptions<T, R>\n): IncrementalUpdateResult<T, R> {\n const { getId, isEqual, applyUpdate, createInitial } = options;\n\n // 结果引用\n const resultRef = useRef<R>(createInitial());\n\n /**\n * 获取更新差异\n */\n const getDiff = useCallback(\n (prevItems: T[], newItems: T[]): UpdateItem<T>[] => {\n const diff: UpdateItem<T>[] = [];\n const prevMap = new Map<string | number, T>();\n const newMap = new Map<string | number, T>();\n\n // 构建映射\n for (const item of prevItems) {\n prevMap.set(getId(item), item);\n }\n for (const item of newItems) {\n newMap.set(getId(item), item);\n }\n\n // 检测新增和更新\n for (const [id, newItem] of newMap) {\n const prevItem = prevMap.get(id);\n if (!prevItem) {\n diff.push({ id, data: newItem, type: 'add' });\n } else if (isEqual && !isEqual(prevItem, newItem)) {\n diff.push({ id, data: newItem, type: 'update' });\n } else if (!isEqual && prevItem !== newItem) {\n diff.push({ id, data: newItem, type: 'update' });\n }\n }\n\n // 检测删除\n for (const [id, prevItem] of prevMap) {\n if (!newMap.has(id)) {\n diff.push({ id, data: prevItem, type: 'remove' });\n }\n }\n\n return diff;\n },\n [getId, isEqual]\n );\n\n /**\n * 应用增量更新\n */\n const applyIncremental = useCallback(\n (prevItems: T[], newItems: T[]) => {\n const diff = getDiff(prevItems, newItems);\n\n if (diff.length === 0) return;\n\n for (const update of diff) {\n applyUpdate(resultRef.current, update.data, update.type);\n }\n },\n [getDiff, applyUpdate]\n );\n\n /**\n * 强制全量重建\n */\n const rebuild = useCallback(\n (items: T[]) => {\n resultRef.current = createInitial();\n for (const item of items) {\n applyUpdate(resultRef.current, item, 'add');\n }\n },\n [createInitial, applyUpdate]\n );\n\n return useMemo(\n () => ({\n result: resultRef.current,\n applyIncremental,\n rebuild,\n getDiff,\n }),\n [applyIncremental, rebuild, getDiff]\n );\n}\n\n/**\n * 图层样式增量更新 Hook\n * @description 专门用于更新 Leaflet 图层样式的增量更新\n */\nexport function useLayerStyleIncremental<T extends { id: string | number }>(\n getStyle: (item: T, isSelected: boolean) => L.PathOptions,\n getLayerById: (id: string | number) => L.Polygon | null\n): {\n updateStyles: (prevItems: T[], newItems: T[], selectedIds: Set<string | number>) => void;\n updateSelection: (\n prevSelectedIds: Set<string | number>,\n newSelectedIds: Set<string | number>,\n items: T[]\n ) => void;\n} {\n const prevItemsRef = useRef<T[]>([]);\n const prevSelectedIdsRef = useRef<Set<string | number>>(new Set());\n\n /**\n * 更新样式(基于数据变化)\n */\n const updateStyles = useCallback(\n (prevItems: T[], newItems: T[], selectedIds: Set<string | number>) => {\n const prevMap = new Map<string | number, T>();\n const newMap = new Map<string | number, T>();\n\n for (const item of prevItems) {\n prevMap.set(item.id, item);\n }\n for (const item of newItems) {\n newMap.set(item.id, item);\n }\n\n // 只更新变化的项目\n for (const [id, newItem] of newMap) {\n const prevItem = prevMap.get(id);\n if (prevItem !== newItem) {\n const layer = getLayerById(id);\n if (layer) {\n const isSelected = selectedIds.has(id);\n layer.setStyle(getStyle(newItem, isSelected));\n }\n }\n }\n\n prevItemsRef.current = newItems;\n },\n [getStyle, getLayerById]\n );\n\n /**\n * 更新选中状态样式\n */\n const updateSelection = useCallback(\n (prevSelectedIds: Set<string | number>, newSelectedIds: Set<string | number>, items: T[]) => {\n const changedIds = new Set<string | number>();\n\n // 找出选中状态变化的 ID\n for (const id of prevSelectedIds) {\n if (!newSelectedIds.has(id)) changedIds.add(id);\n }\n for (const id of newSelectedIds) {\n if (!prevSelectedIds.has(id)) changedIds.add(id);\n }\n\n // 只更新变化的项目\n for (const id of changedIds) {\n const layer = getLayerById(id);\n const item = items.find(i => i.id === id);\n if (layer && item) {\n const isSelected = newSelectedIds.has(id);\n layer.setStyle(getStyle(item, isSelected));\n }\n }\n\n prevSelectedIdsRef.current = newSelectedIds;\n },\n [getStyle, getLayerById]\n );\n\n return { updateStyles, updateSelection };\n}\n\nexport default useIncrementalUpdate;\n","/**\n * RAF 节流工具\n * @description 使用 requestAnimationFrame 实现节流,优化频繁触发的回调\n * @since 1.4.0\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- 泛型约束需要 */\n\nimport { useRef, useEffect, useMemo } from 'react';\n\n/**\n * RAF 节流函数\n * @description 使用 requestAnimationFrame 节流,确保回调在每一帧最多执行一次\n * @param callback 要节流的回调函数\n * @returns 节流后的函数\n *\n * @example\n * ```ts\n * const handleMapMove = useRafThrottle(() => {\n * // 地图移动时的处理逻辑\n * updateViewport();\n * });\n *\n * map.on('move', handleMapMove);\n * ```\n */\nexport function useRafThrottle<T extends (...args: any[]) => any>(callback: T): T {\n const rafRef = useRef<number | null>(null);\n const lastArgsRef = useRef<unknown[]>([]);\n const callbackRef = useRef(callback);\n\n // 更新回调引用\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n // 清理\n useEffect(() => {\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, []);\n\n return useMemo(() => {\n const throttledFn = (...args: unknown[]) => {\n lastArgsRef.current = args;\n\n if (rafRef.current === null) {\n rafRef.current = requestAnimationFrame(() => {\n callbackRef.current(...lastArgsRef.current);\n rafRef.current = null;\n });\n }\n };\n\n return throttledFn as T;\n }, []);\n}\n\n/**\n * 延迟执行函数\n * @description 在指定延迟后执行函数,支持取消\n * @param callback 要执行的函数\n * @param delay 延迟时间(ms)\n * @returns 执行函数(可取消)\n *\n * @example\n * ```ts\n * const debouncedUpdate = useDebouncedCallback(() => {\n * updateData();\n * }, 300);\n *\n * // 调用\n * debouncedUpdate();\n *\n * // 取消\n * debouncedUpdate.cancel();\n * ```\n */\nexport function useDebouncedCallback<T extends (...args: any[]) => any>(\n callback: T,\n delay: number\n): T & { cancel: () => void } {\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n const callbackRef = useRef(callback);\n\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n const debouncedFn = useMemo(() => {\n const fn = (...args: unknown[]) => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n\n timerRef.current = setTimeout(() => {\n callbackRef.current(...args);\n timerRef.current = null;\n }, delay);\n };\n\n fn.cancel = () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n\n return fn as T & { cancel: () => void };\n }, [delay]);\n\n return debouncedFn;\n}\n\n/**\n * 批量更新工具\n * @description 将多次更新合并为一次,适用于频繁状态更新场景\n * @param callback 更新函数\n * @param interval 合并间隔(ms),默认 100ms\n * @returns 批量更新函数\n *\n * @example\n * ```ts\n * const batchUpdate = useBatchedUpdate((updates) => {\n * setData(prev => [...prev, ...updates]);\n * }, 100);\n *\n * // 多次调用会合并为一次\n * batchUpdate(item1);\n * batchUpdate(item2);\n * batchUpdate(item3);\n * // 100ms 后一次性更新 [item1, item2, item3]\n * ```\n */\nexport function useBatchedUpdate<T>(callback: (items: T[]) => void, interval = 100) {\n const itemsRef = useRef<T[]>([]);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n const callbackRef = useRef(callback);\n\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n const batchedUpdate = (item: T) => {\n itemsRef.current.push(item);\n\n if (timerRef.current === null) {\n timerRef.current = setTimeout(() => {\n const items = itemsRef.current;\n itemsRef.current = [];\n callbackRef.current(items);\n timerRef.current = null;\n }, interval);\n }\n };\n\n // 立即执行批量更新\n const flush = () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n\n if (itemsRef.current.length > 0) {\n callbackRef.current(itemsRef.current);\n itemsRef.current = [];\n }\n };\n\n return { batchedUpdate, flush };\n}\n","/**\n * @fileoverview 统一视口防抖 Hook\n * @description 优化地图视口变化时的性能,减少频繁触发更新,适用于所有图层组件\n * @module hooks/useViewportDebounce\n * @since 2.1.0 统一优化\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport type L from 'leaflet';\nimport { useRafThrottle, useDebouncedCallback } from '../utils/rafThrottle';\n\n/** 视口状态 */\nexport interface ViewportState {\n /** 当前缩放级别 */\n zoom: number;\n /** 视口版本号(每次变化递增) */\n viewVersion: number;\n /** 当前视口边界 */\n bounds: L.LatLngBounds | null;\n /** 地图中心点 */\n center: L.LatLng | null;\n}\n\n/** 防抖配置 */\nexport interface ViewportDebounceOptions {\n /** 地图实例 */\n map: L.Map | null;\n /** zoom 变化防抖延迟(ms),默认 100 */\n zoomDebounceDelay?: number;\n /** move 变化防抖延迟(ms),默认 150 */\n moveDebounceDelay?: number;\n /** 是否启用 RAF 节流,默认 true */\n useRaf?: boolean;\n /** 是否监听 resize 事件,默认 false */\n listenResize?: boolean;\n}\n\n/** 防抖结果 */\nexport interface ViewportDebounceResult extends ViewportState {\n /** 防抖后的缩放级别 */\n debouncedZoom: number;\n /** 防抖后的视口版本 */\n debouncedViewVersion: number;\n /** 防抖后的视口边界 */\n debouncedBounds: L.LatLngBounds | null;\n /** 防抖后的地图中心 */\n debouncedCenter: L.LatLng | null;\n /** 强制刷新(跳过防抖) */\n forceUpdate: () => void;\n /** 实时状态(无防抖) */\n realtime: ViewportState;\n}\n\n/**\n * 统一视口防抖 Hook\n * @description 通过防抖和 RAF 节流减少视口变化触发频率,适用于 PlotLayer、Marker、Track 等组件\n *\n * @example\n * ```tsx\n * // 在 PlotLayer 中使用\n * const { debouncedZoom, debouncedBounds, debouncedViewVersion } = useViewportDebounce({\n * map,\n * zoomDebounceDelay: 100,\n * moveDebounceDelay: 150,\n * });\n *\n * // 使用防抖后的值进行视口过滤\n * const visiblePlots = useMemo(() => {\n * if (!spatialIndex || !debouncedBounds) return [];\n * return spatialIndex.query(debouncedBounds);\n * }, [spatialIndex, debouncedViewVersion]);\n *\n * // 在 Marker 中使用(聚合)\n * const clusterResults = useMemo(() => {\n * if (!clusterIndex || !debouncedBounds) return [];\n * return clusterIndex.getClusters([...bounds], Math.floor(debouncedZoom));\n * }, [clusterIndex, debouncedViewVersion, debouncedZoom]);\n * ```\n */\nexport function useViewportDebounce(options: ViewportDebounceOptions): ViewportDebounceResult {\n const {\n map,\n zoomDebounceDelay = 100,\n moveDebounceDelay = 150,\n useRaf = true,\n listenResize = false,\n } = options;\n\n // 实时状态(用于事件监听)\n const [realtimeZoom, setRealtimeZoom] = useState(0);\n const [realtimeViewVersion, setRealtimeViewVersion] = useState(0);\n const realtimeBoundsRef = useRef<L.LatLngBounds | null>(null);\n const realtimeCenterRef = useRef<L.LatLng | null>(null);\n\n // 防抖后状态(用于渲染和计算)\n const [debouncedZoom, setDebouncedZoom] = useState(0);\n const [debouncedViewVersion, setDebouncedViewVersion] = useState(0);\n const [debouncedBounds, setDebouncedBounds] = useState<L.LatLngBounds | null>(null);\n const [debouncedCenter, setDebouncedCenter] = useState<L.LatLng | null>(null);\n\n // 防抖回调\n const debouncedSetZoom = useDebouncedCallback(\n useCallback((zoom: number) => {\n setDebouncedZoom(zoom);\n }, []),\n zoomDebounceDelay\n );\n\n const debouncedSetViewVersion = useDebouncedCallback(\n useCallback((version: number) => {\n setDebouncedViewVersion(version);\n setDebouncedBounds(realtimeBoundsRef.current);\n setDebouncedCenter(realtimeCenterRef.current);\n }, []),\n moveDebounceDelay\n );\n\n // RAF 节流版本\n const throttledSetViewVersion = useRafThrottle(\n useCallback((version: number) => {\n setDebouncedViewVersion(version);\n setDebouncedBounds(realtimeBoundsRef.current);\n setDebouncedCenter(realtimeCenterRef.current);\n }, [])\n );\n\n // 强制刷新(跳过防抖)\n const forceUpdate = useCallback(() => {\n if (!map) return;\n const zoom = map.getZoom();\n const bounds = map.getBounds();\n const center = map.getCenter();\n setDebouncedZoom(zoom);\n setDebouncedBounds(bounds);\n setDebouncedCenter(center);\n setDebouncedViewVersion(v => v + 1);\n setRealtimeZoom(zoom);\n realtimeBoundsRef.current = bounds;\n realtimeCenterRef.current = center;\n setRealtimeViewVersion(v => v + 1);\n }, [map]);\n\n // 监听地图事件\n useEffect(() => {\n if (!map) return;\n\n // 初始化状态\n const initialZoom = map.getZoom();\n const initialBounds = map.getBounds();\n const initialCenter = map.getCenter();\n\n setRealtimeZoom(initialZoom);\n setDebouncedZoom(initialZoom);\n realtimeBoundsRef.current = initialBounds;\n setDebouncedBounds(initialBounds);\n realtimeCenterRef.current = initialCenter;\n setDebouncedCenter(initialCenter);\n\n const handleZoomEnd = () => {\n const zoom = map.getZoom();\n setRealtimeZoom(zoom);\n debouncedSetZoom(zoom);\n };\n\n const handleMoveEnd = () => {\n realtimeBoundsRef.current = map.getBounds();\n realtimeCenterRef.current = map.getCenter();\n setRealtimeViewVersion(v => {\n const newVersion = v + 1;\n if (useRaf) {\n throttledSetViewVersion(newVersion);\n } else {\n debouncedSetViewVersion(newVersion);\n }\n return newVersion;\n });\n };\n\n const handleResize = () => {\n // resize 时强制更新\n forceUpdate();\n };\n\n map.on('zoomend', handleZoomEnd);\n map.on('moveend', handleMoveEnd);\n if (listenResize) {\n map.on('resize', handleResize);\n }\n\n return () => {\n map.off('zoomend', handleZoomEnd);\n map.off('moveend', handleMoveEnd);\n if (listenResize) {\n map.off('resize', handleResize);\n }\n debouncedSetZoom.cancel();\n debouncedSetViewVersion.cancel();\n };\n }, [\n map,\n debouncedSetZoom,\n debouncedSetViewVersion,\n throttledSetViewVersion,\n useRaf,\n listenResize,\n forceUpdate,\n ]);\n\n return {\n // 防抖后状态\n debouncedZoom,\n debouncedViewVersion,\n debouncedBounds,\n debouncedCenter,\n // 实时状态\n realtime: {\n zoom: realtimeZoom,\n viewVersion: realtimeViewVersion,\n bounds: realtimeBoundsRef.current,\n center: realtimeCenterRef.current,\n },\n // 实时状态别名(兼容旧代码)\n zoom: realtimeZoom,\n viewVersion: realtimeViewVersion,\n bounds: realtimeBoundsRef.current,\n center: realtimeCenterRef.current,\n // 方法\n forceUpdate,\n };\n}\n\nexport default useViewportDebounce;\n","/**\n * @fileoverview 统一图层增量更新 Hook\n * @description 通用的 Leaflet 图层增量更新逻辑,适用于 GeoJSON Layer、Marker Layer、Polyline Layer 等\n * @module hooks/useLayerIncrementalUpdate\n * @since 2.1.0 统一优化\n */\n\nimport { useRef, useCallback, useEffect } from 'react';\nimport type L from 'leaflet';\nimport { logger } from '../utils/errorHandling';\n\n/** 图层项基础接口 */\nexport interface LayerItem {\n id: string | number;\n}\n\n/** 图层实例与元数据映射 */\nexport interface LayerEntry<T extends LayerItem> {\n layer: L.Layer;\n data: T;\n}\n\n/** 增量更新配置 */\nexport interface IncrementalUpdateOptions<T extends LayerItem> {\n /** 地图实例 */\n map: L.Map | null;\n /** 数据数组 */\n data: T[];\n /** 创建单个图层的函数 */\n createLayer: (item: T, index: number) => L.Layer | null;\n /** 更新单个图层的函数(可选) */\n updateLayer?: (entry: LayerEntry<T>, newItem: T, index: number) => boolean;\n /** 移除单个图层的函数 */\n removeLayer?: (layer: L.Layer) => void;\n /** 获取图层 ID 的函数 */\n getId?: (item: T) => string | number;\n /** 是否启用增量更新,默认 true */\n enabled?: boolean;\n}\n\n/** 增量更新结果 */\nexport interface IncrementalUpdateResult<T extends LayerItem> {\n /** 图层映射 (id -> LayerEntry) */\n layersMap: Map<string | number, LayerEntry<T>>;\n /** 手动触发更新 */\n update: (newData: T[]) => void;\n /** 清理所有图层 */\n clear: () => void;\n /** 获取当前图层数量 */\n count: () => number;\n /** 获取指定图层 */\n get: (id: string | number) => LayerEntry<T> | undefined;\n}\n\n/**\n * 统一图层增量更新 Hook\n * @description 通过 diff 算法只更新变化的图层,避免全量重建\n *\n * @example\n * ```tsx\n * // 在 Marker 组件中使用\n * const { update, clear, count } = useLayerIncrementalUpdate({\n * map,\n * data: displayMarkers,\n * createLayer: (item, index) => {\n * return L.marker(item.position, { icon: getItemIcon(item) }).addTo(map);\n * },\n * updateLayer: (entry, newItem) => {\n * if (entry.data.position !== newItem.position) {\n * (entry.layer as L.Marker).setLatLng(newItem.position);\n * return true;\n * }\n * return false;\n * },\n * });\n *\n * // 在 PlotLayer 中使用(GeoJSON Layer)\n * const { layersMap } = useLayerIncrementalUpdate({\n * map,\n * data: visiblePlots,\n * createLayer: (plot) => createGeoJSONLayer(plot),\n * });\n * ```\n */\nexport function useLayerIncrementalUpdate<T extends LayerItem>(\n options: IncrementalUpdateOptions<T>\n): IncrementalUpdateResult<T> {\n const {\n map,\n data,\n createLayer,\n updateLayer,\n removeLayer,\n getId = (item: T) => item.id,\n enabled = true,\n } = options;\n\n // 图层实例映射\n const layersMapRef = useRef<Map<string | number, LayerEntry<T>>>(new Map());\n\n // 默认移除函数\n const defaultRemoveLayer = useCallback((layer: L.Layer) => {\n try {\n layer.remove();\n } catch (error) {\n logger.error('useLayerIncrementalUpdate', '移除图层失败:', error);\n }\n }, []);\n\n const actualRemoveLayer = removeLayer || defaultRemoveLayer;\n\n /**\n * 执行增量更新\n */\n const performUpdate = useCallback(\n (newData: T[]) => {\n if (!map) return;\n\n // 边界检查\n if (!Array.isArray(newData)) {\n logger.warn('useLayerIncrementalUpdate', 'data 不是有效数组');\n return;\n }\n\n const currentIds = new Set(newData.map(getId));\n const existingIds = new Set(layersMapRef.current.keys());\n\n // 1. 删除不再存在的图层\n existingIds.forEach(id => {\n if (!currentIds.has(id)) {\n const entry = layersMapRef.current.get(id);\n if (entry) {\n actualRemoveLayer(entry.layer);\n layersMapRef.current.delete(id);\n }\n }\n });\n\n // 2. 创建或更新图层\n newData.forEach((item, index) => {\n const id = getId(item);\n const existing = layersMapRef.current.get(id);\n\n if (existing) {\n // 尝试更新现有图层\n if (updateLayer) {\n const success = updateLayer(existing, item, index);\n if (success) {\n layersMapRef.current.set(id, { ...existing, data: item });\n } else {\n // 更新失败,重建\n actualRemoveLayer(existing.layer);\n layersMapRef.current.delete(id);\n const newLayer = createLayer(item, index);\n if (newLayer) {\n layersMapRef.current.set(id, { layer: newLayer, data: item });\n }\n }\n } else {\n // 无更新函数,直接更新数据引用\n layersMapRef.current.set(id, { ...existing, data: item });\n }\n } else {\n // 创建新图层\n const newLayer = createLayer(item, index);\n if (newLayer) {\n layersMapRef.current.set(id, { layer: newLayer, data: item });\n }\n }\n });\n },\n [map, createLayer, updateLayer, actualRemoveLayer, getId]\n );\n\n /**\n * 手动触发更新\n */\n const update = useCallback(\n (newData: T[]) => {\n performUpdate(newData);\n },\n [performUpdate]\n );\n\n /**\n * 清理所有图层\n */\n const clear = useCallback(() => {\n layersMapRef.current.forEach(entry => {\n actualRemoveLayer(entry.layer);\n });\n layersMapRef.current.clear();\n }, [actualRemoveLayer]);\n\n /**\n * 获取当前图层数量\n */\n const count = useCallback(() => layersMapRef.current.size, []);\n\n /**\n * 获取指定图层\n */\n const get = useCallback((id: string | number) => layersMapRef.current.get(id), []);\n\n // 自动更新(当 data 变化时)\n useEffect(() => {\n if (!enabled || !map) return;\n performUpdate(data);\n }, [enabled, map, data, performUpdate]);\n\n // 组件卸载时清理\n useEffect(() => {\n return () => clear();\n }, [clear]);\n\n return {\n layersMap: layersMapRef.current,\n update,\n clear,\n count,\n get,\n };\n}\n\nexport default useLayerIncrementalUpdate;\n","/**\n * 增强虚拟化 Hook\n * @description 为超大数据集(10 万 + 地块)提供激进的虚拟化渲染策略\n * @since 1.5.0\n */\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport type { BBox } from '../utils/spatialIndex';\n\n/** 虚拟化配置 */\nexport interface EnhancedVirtualizationConfig {\n /** 是否启用虚拟化 */\n enabled?: boolean | 'auto';\n /** 自动启用的数据量阈值 */\n autoEnableThreshold?: number;\n /** 视口缓冲区大小(度数) */\n buffer?: number;\n /** 节流时间(毫秒) */\n throttleMs?: number;\n /** 最小缩放级别(低于此级别不渲染) */\n minZoom?: number;\n /** 最大缩放级别(高于此级别全量渲染) */\n maxZoom?: number;\n /** 缩放级别阈值(低于此级别使用简化几何) */\n simplifyZoomThreshold?: number;\n /** 分块加载:将数据分为多块,每块独立渲染 */\n chunkedLoading?: boolean;\n /** 每块的大小(地块数量) */\n chunkSize?: number;\n /** 最大并发渲染块数 */\n maxConcurrentChunks?: number;\n}\n\n/** 视口状态 */\nexport interface ViewportState {\n /** 视口边界框 */\n viewport: BBox | null;\n /** 当前缩放级别 */\n zoom: number;\n /** 视口版本号(用于触发更新) */\n version: number;\n}\n\n/** Hook 返回值 */\nexport interface UseEnhancedVirtualizationResult {\n /** 是否启用虚拟化 */\n isVirtualized: boolean;\n /** 视口状态 */\n viewport: ViewportState;\n /** 更新视口 */\n updateViewport: (viewport: BBox, zoom: number) => void;\n /** 节流版更新视口 */\n throttledUpdateViewport: (viewport: BBox, zoom: number) => void;\n /** 是否在缩放范围内 */\n isInZoomRange: boolean;\n /** 是否应使用简化几何 */\n shouldSimplify: boolean;\n /** 当前加载的块索引 */\n loadedChunks: Set<number>;\n /** 总块数 */\n totalChunks: number;\n /** 获取应渲染的数据块 */\n getVisibleChunks: () => number[];\n /** 清除已加载的块 */\n clearChunks: () => void;\n}\n\n/**\n * 增强虚拟化 Hook\n * @description 为超大数据集提供激进的虚拟化渲染策略\n *\n * @param config 配置选项\n * @param dataLength 数据总数\n * @returns 虚拟化状态和控制函数\n *\n * @example\n * ```tsx\n * function PlotLayer({ dataSource }) {\n * const {\n * isVirtualized,\n * viewport,\n * throttledUpdateViewport,\n * isInZoomRange,\n * shouldSimplify\n * } = useEnhancedVirtualization({\n * enabled: 'auto',\n * autoEnableThreshold: 10000,\n * buffer: 0.02,\n * throttleMs: 100,\n * minZoom: 6,\n * maxZoom: 18,\n * simplifyZoomThreshold: 14,\n * chunkedLoading: true,\n * chunkSize: 1000,\n * maxConcurrentChunks: 3\n * }, dataSource.length);\n *\n * // 在地图移动事件中更新视口\n * map.on('move', () => {\n * const bounds = map.getBounds();\n * throttledUpdateViewport(\n * [bounds.getSouth(), bounds.getWest(), bounds.getNorth(), bounds.getEast()],\n * map.getZoom()\n * );\n * });\n *\n * // 过滤可见数据\n * const visibleData = useMemo(() => {\n * if (!isVirtualized || !viewport.viewport || !isInZoomRange) {\n * return dataSource;\n * }\n * return filterByViewport(dataSource, viewport.viewport);\n * }, [dataSource, isVirtualized, viewport, isInZoomRange]);\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function useEnhancedVirtualization(\n config: EnhancedVirtualizationConfig = {},\n dataLength: number\n): UseEnhancedVirtualizationResult {\n const {\n enabled = 'auto',\n autoEnableThreshold = 10000,\n buffer = 0.02,\n throttleMs = 100,\n minZoom = 6,\n maxZoom = 18,\n simplifyZoomThreshold = 14,\n chunkedLoading = true,\n chunkSize = 1000,\n maxConcurrentChunks: _maxConcurrentChunks = 3,\n } = config;\n\n // 是否启用虚拟化\n const isVirtualized = useMemo(() => {\n if (enabled === true) return true;\n if (enabled === false) return false;\n return dataLength >= autoEnableThreshold;\n }, [enabled, dataLength, autoEnableThreshold]);\n\n // 视口状态\n const [viewport, setViewport] = useState<ViewportState>({\n viewport: null,\n zoom: 0,\n version: 0,\n });\n\n // 已加载的块\n const loadedChunksRef = useRef<Set<number>>(new Set());\n\n // 节流定时器\n const throttleTimerRef = useRef<number | null>(null);\n\n // 更新视口\n const updateViewport = useCallback(\n (bbox: BBox, zoom: number) => {\n // 应用缓冲区\n const bufferedBBox: BBox = [\n Math.max(bbox[0] - buffer, -90),\n Math.max(bbox[1] - buffer, -180),\n Math.min(bbox[2] + buffer, 90),\n Math.min(bbox[3] + buffer, 180),\n ];\n\n setViewport(prev => ({\n viewport: bufferedBBox,\n zoom,\n version: prev.version + 1,\n }));\n },\n [buffer]\n );\n\n // 节流版更新视口\n const throttledUpdateViewport = useCallback(\n (bbox: BBox, zoom: number) => {\n if (throttleTimerRef.current) {\n window.clearTimeout(throttleTimerRef.current);\n }\n\n throttleTimerRef.current = window.setTimeout(() => {\n updateViewport(bbox, zoom);\n throttleTimerRef.current = null;\n }, throttleMs);\n },\n [updateViewport, throttleMs]\n );\n\n // 是否在缩放范围内\n const isInZoomRange = useMemo(() => {\n return viewport.zoom >= minZoom && viewport.zoom <= maxZoom;\n }, [viewport.zoom, minZoom, maxZoom]);\n\n // 是否应使用简化几何\n const shouldSimplify = useMemo(() => {\n return viewport.zoom < simplifyZoomThreshold;\n }, [viewport.zoom, simplifyZoomThreshold]);\n\n // 总块数\n const totalChunks = useMemo(() => {\n if (!chunkedLoading) return 1;\n return Math.ceil(dataLength / chunkSize);\n }, [chunkedLoading, dataLength, chunkSize]);\n\n // 获取可见的块索引\n const getVisibleChunks = useCallback((): number[] => {\n if (!chunkedLoading || !viewport.viewport) {\n return [0];\n }\n\n // 简单实现:根据视口中心点计算块索引\n // 实际使用时可结合空间索引优化\n const centerLat = (viewport.viewport[0] + viewport.viewport[2]) / 2;\n const centerLng = (viewport.viewport[1] + viewport.viewport[3]) / 2;\n\n // 使用哈希函数将地理位置映射到块索引\n const hash = Math.abs(Math.floor(centerLat * 100) + Math.floor(centerLng * 100));\n const visibleChunk = hash % totalChunks;\n\n // 返回可见块及相邻块\n const chunks: number[] = [];\n for (let i = -1; i <= 1; i++) {\n const chunkIndex = (visibleChunk + i + totalChunks) % totalChunks;\n chunks.push(chunkIndex);\n }\n\n return chunks;\n }, [chunkedLoading, viewport.viewport, totalChunks]);\n\n // 清除已加载的块\n const clearChunks = useCallback(() => {\n loadedChunksRef.current.clear();\n }, []);\n\n // 清理\n useEffect(() => {\n return () => {\n if (throttleTimerRef.current) {\n window.clearTimeout(throttleTimerRef.current);\n }\n };\n }, []);\n\n return {\n isVirtualized,\n viewport,\n updateViewport,\n throttledUpdateViewport,\n isInZoomRange,\n shouldSimplify,\n loadedChunks: loadedChunksRef.current,\n totalChunks,\n getVisibleChunks,\n clearChunks,\n };\n}\n","/**\n * 同构布局效果 Hook\n * @description 在 SSR 环境下使用 useEffect,在客户端使用 useLayoutEffect\n * @since 1.4.0\n */\n\nimport { useEffect, useLayoutEffect } from 'react';\n\n/**\n * 同构布局效果 Hook\n * @description 解决 SSR 环境下 useLayoutEffect 的警告\n *\n * @example\n * ```tsx\n * import { useIsomorphicLayoutEffect } from '@wenle_2523097/agri-map';\n *\n * function Component() {\n * useIsomorphicLayoutEffect(() => {\n * // 在客户端同步执行,在 SSR 环境下异步执行\n * const element = document.querySelector('.my-element');\n * // ...\n * }, []);\n *\n * return <div className=\"my-element\">...</div>;\n * }\n * ```\n */\nexport const useIsomorphicLayoutEffect =\n typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport default useIsomorphicLayoutEffect;\n","/**\n * 基础类型定义\n */\n\n/**\n * 坐标点\n * @description 纬度和经度组成的元组 [lat, lng]\n * @example [30.0, 120.0]\n */\nexport type Coordinate = [number, number];\n\n/**\n * 坐标数组类型\n * @description 二维坐标数组 [[lat,lng],...] 或三维坐标数组 [[[lat,lng],...], [孔洞], ...]\n */\nexport type Positions2D = Coordinate[];\nexport type Positions3D = Coordinate[][];\n\n/**\n * 边界坐标类型\n * @description 地块边界的坐标数组格式\n * - Positions2D: 二维数组 [[lat,lng],...],表示单环多边形(无孔洞)\n * - Positions3D: 三维数组 [[[lat,lng],...], [孔洞1], ...],表示带孔洞的多边形\n */\nexport type Boundaries = Positions2D | Positions3D;\n\n/**\n * 边界框类型\n * @description [minLat, minLng, maxLat, maxLng]\n */\nexport type BBox = [number, number, number, number];\n\n/**\n * 判断坐标数组是否为三维数组(GeoJSON 格式:[[外环], [孔洞1], ...])\n * @param positions 待检测的坐标数组\n * @returns true 表示三维数组,false 表示二维数组或无效\n */\nexport function is3DPositions(positions: unknown): positions is Positions3D {\n if (!Array.isArray(positions) || positions.length === 0) return false;\n const first = positions[0];\n return Array.isArray(first) && first.length > 0 && Array.isArray(first[0]);\n}\n\n/**\n * 边界框\n * @description 地图边界范围 [南纬, 西经, 北纬, 东经]\n * @example [29.9, 119.9, 30.1, 120.1]\n */\nexport type BoundingBox = [number, number, number, number];\n\n/**\n * 路径样式选项\n * @description 用于配置线条、多边形等图形的样式\n */\nexport interface PathOptions {\n /** 边框颜色 */\n color?: string;\n /** 填充颜色 */\n fillColor?: string;\n /** 边框宽度(像素) */\n weight?: number;\n /** 边框透明度 (0-1) */\n opacity?: number;\n /** 填充透明度 (0-1) */\n fillOpacity?: number;\n /** 虚线模式,如 '5, 10' 或 [5, 10] */\n dashArray?: string | number[];\n /** 自定义 CSS 类名 */\n className?: string;\n /** 顶点边框颜色(编辑模式下顶点标记的边框颜色) */\n vertexBorderColor?: string;\n /** 顶点背景填充颜色(编辑模式下顶点标记的填充颜色) */\n vertexFillColor?: string;\n /** 顶点背景透明度(编辑模式下顶点标记的透明度,0-1) */\n vertexFillOpacity?: number;\n}\n\n/**\n * 折线样式选项\n * @description 用于道路、灌溉渠等线状要素的描边和填充样式\n */\nexport interface PolylineOptions {\n /** Stroke(描边)颜色 */\n color?: string;\n /** Stroke(描边)宽度,单位:像素 */\n weight?: number;\n /** Stroke(描边)的不透明度 */\n opacity?: number;\n /** 顶点边框颜色(编辑模式下顶点标记的边框颜色) */\n vertexBorderColor?: string;\n /** 顶点填充颜色(编辑模式下顶点标记的填充颜色) */\n vertexFillColor?: string;\n /** 顶点填充透明度(编辑模式下顶点标记的透明度,0-1) */\n vertexFillOpacity?: number;\n /** 自定义 CSS 类名,仅适用于 SVG 渲染器 */\n className?: string;\n}\n\n/**\n * 地块类型\n * @description 农业地块的分类类型\n */\nexport type PlotType =\n | 'farmland'\n | 'vegetable'\n | 'orchard'\n | 'forest'\n | 'grassland'\n | 'paddy'\n | 'greenhouse';\n\n/**\n * 地块状态\n * @description 地块的当前耕作状态\n */\nexport type PlotStatus = 'cultivating' | 'fallow' | 'harvesting' | 'planting' | 'irrigating';\n","/**\n * BoxZoom 矩形选区 Hook\n * @description 处理 Shift+拖拽绘制矩形选区功能,仅在 PlotLayer 多选模式下启用\n * @module hooks/useBoxZoomSelection\n */\n\nimport { useEffect } from 'react';\nimport L from 'leaflet';\nimport type { PlotData, PlotFieldNames, Coordinate } from '../types';\nimport { is3DPositions } from '../types/basic';\nimport { useLatestRef } from './useLatestRef';\n\ninterface UseBoxZoomSelectionOptions {\n /** Leaflet 地图实例 */\n map: L.Map | null;\n /** 地块数据源 */\n dataSource: PlotData[];\n /** 字段名映射 */\n fieldNames?: Partial<PlotFieldNames>;\n /** 是否启用(仅多选模式启用) */\n enabled: boolean;\n /** 选区变化回调 */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onSelectionChange?: (...args: any[]) => void;\n /** 设置内部选中状态(PlotLayer 内部使用) */\n setInternalSelectedIds: React.Dispatch<React.SetStateAction<(string | number)[]>>;\n}\n\n/**\n * 判断坐标点是否在边界内\n */\nfunction isCoordinateInBounds(coord: Coordinate, bounds: L.LatLngBounds): boolean {\n const [lat, lng] = coord;\n return bounds.contains(L.latLng(lat, lng));\n}\n\n/**\n * 判断地块是否与边界相交(任意顶点在边界内即选中)\n */\nfunction isPlotInBounds(plot: PlotData, bounds: L.LatLngBounds): boolean {\n const positions = plot.positions;\n if (!positions) return false;\n\n // 支持二维 [[lat,lng],...] 和三维 [[[lat,lng],...], [孔洞], ...]\n const rings = is3DPositions(positions) ? positions : [positions];\n\n for (const ring of rings) {\n for (const coord of ring) {\n if (isCoordinateInBounds(coord, bounds)) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * BoxZoom 矩形选区 Hook\n * @description 在 Shift+拖拽绘制矩形时,选中边界内的所有地块\n *\n * @example\n * ```tsx\n * useBoxZoomSelection({\n * map,\n * dataSource: normalizedDataSource,\n * fieldNames: { id: 'id', positions: 'positions' },\n * enabled: mode === 'multiple',\n * setInternalSelectedIds,\n * });\n * ```\n */\nexport function useBoxZoomSelection(options: UseBoxZoomSelectionOptions) {\n const {\n map,\n dataSource,\n fieldNames: _fieldNames = {},\n enabled,\n onSelectionChange,\n setInternalSelectedIds,\n } = options;\n\n const enabledRef = useLatestRef(enabled);\n const dataSourceRef = useLatestRef(dataSource);\n const setInternalSelectedIdsRef = useLatestRef(setInternalSelectedIds);\n const onSelectionChangeRef = useLatestRef(onSelectionChange);\n\n useEffect(() => {\n if (!map || !enabledRef.current) return;\n\n const handleBoxZoomEnd = (e: L.LeafletEvent) => {\n const boxZoomEvent = e as L.LeafletEvent & { boxZoomBounds?: L.LatLngBounds };\n const bounds = boxZoomEvent.boxZoomBounds as L.LatLngBounds | undefined;\n\n if (!bounds) return;\n\n // 筛选边界内的地块\n const selectedIds = dataSourceRef.current\n .filter(plot => isPlotInBounds(plot, bounds))\n .map(plot => plot.id);\n setInternalSelectedIdsRef.current(selectedIds);\n\n // 触发回调\n if (onSelectionChangeRef.current) {\n onSelectionChangeRef.current(selectedIds, bounds);\n }\n };\n\n map.on('boxzoomend', handleBoxZoomEnd);\n\n return () => {\n map.off('boxzoomend', handleBoxZoomEnd);\n };\n }, [map, enabledRef, dataSourceRef, setInternalSelectedIdsRef, onSelectionChangeRef]);\n}\n\nexport default useBoxZoomSelection;\n","/**\n * 通用常量定义\n * @description 提取组件库中的魔法数字为命名常量\n *\n * 本模块集中管理所有硬编码的魔法数字,便于统一维护和调整。\n * 所有常量均使用有意义的命名,并在注释中说明用途和默认值来源。\n *\n * @packageDocumentation\n */\n\n/** 空间索引默认单元格大小(经纬度单位),约 1km */\nexport const SPATIAL_INDEX_DEFAULT_CELL_SIZE = 0.01;\n\n/** 轨迹冗余点过滤默认容差(米),用于移除 GPS 漂移产生的重复点 */\nexport const TRACK_DEFAULT_DUPLICATE_TOLERANCE = 0.5;\n\n/** 轨迹简化默认容差(经纬度单位),Douglas-Peucker 算法参数 */\nexport const TRACK_DEFAULT_SIMPLIFY_TOLERANCE = 0.0001;\n\n/** Marker 模式默认缩放阈值,低于此级别显示 Marker 而非轨迹线 */\nexport const TRACK_DEFAULT_MARKER_ZOOM_THRESHOLD = 14;\n\n/** Marker 模式默认目标缩放级别,点击 Marker 后飞行的目标级别 */\nexport const TRACK_DEFAULT_MARKER_ZOOM_TO_LEVEL = 16;\n\n/** 聚合默认半径(像素),supercluster 聚合气泡半径 */\nexport const CLUSTER_DEFAULT_RADIUS = 40;\n\n/** 聚合默认最大缩放级别,超过此级别不再聚合 */\nexport const CLUSTER_DEFAULT_MAX_ZOOM = 14;\n\n/** 聚合默认最小点数,达到此数量才触发聚合 */\nexport const CLUSTER_DEFAULT_MIN_POINTS = 2;\n\n/** 地图动画默认 padding,fitBounds 操作的内边距 [x, y] */\nexport const MAP_FIT_BOUNDS_DEFAULT_PADDING: [number, number] = [40, 40];\n\n/** 默认编辑距离容差(像素),编辑模式下的吸附距离 */\nexport const EDIT_DEFAULT_SNAP_DISTANCE = 20;\n\n/** 默认图标尺寸 [width, height] */\nexport const ICON_DEFAULT_SIZE: [number, number] = [24, 24];\n\n/** 默认脉冲图标动画启用 */\nexport const PULSE_ICON_DEFAULT_ANIMATED = true;\n\n/** 加载动画默认持续时间(毫秒) */\nexport const LOADING_DEFAULT_DURATION = 300;\n\n/** 性能监控默认采样率 */\nexport const PERFORMANCE_DEFAULT_SAMPLING_RATE = 100;\n\n/** 默认虚拟化最小缩放级别,低于此级别不渲染 */\nexport const VIRTUALIZATION_DEFAULT_MIN_ZOOM = 10;\n\n/** 默认虚拟化最大缩放级别,高于此级别不渲染 */\nexport const VIRTUALIZATION_DEFAULT_MAX_ZOOM = 18;\n\n/** 默认 Tooltip 偏移 [x, y],用于 Marker 提示框定位 */\nexport const TOOLTIP_DEFAULT_OFFSET: [number, number] = [0, -48];\n\n/** 默认起点/终点图标尺寸 [width, height] */\nexport const START_END_ICON_DEFAULT_SIZE: [number, number] = [24, 24];\n\n/** 默认选中放大倍数,选中状态下的图标/标记缩放比例 */\nexport const SELECTED_SCALE_FACTOR = 1.5;\n\n/** 默认光晕线宽,未选中状态下的外圈光晕宽度 */\nexport const HALO_STROKE_WIDTH = 2;\n\n/** 默认选中光晕线宽,选中状态下的外圈光晕宽度 */\nexport const SELECTED_HALO_STROKE_WIDTH = 3;\n\n// ========== 性能优化相关常量 ==========\n\n/** 视口防抖默认延迟(毫秒)- zoom 事件 */\nexport const VIEWPORT_ZOOM_DEBOUNCE_DELAY = 100;\n\n/** 视口防抖默认延迟(毫秒)- move 事件 */\nexport const VIEWPORT_MOVE_DEBOUNCE_DELAY = 150;\n\n/** 增量更新默认批量大小 */\nexport const INCREMENTAL_UPDATE_BATCH_SIZE = 100;\n\n/** RAF 节流默认间隔(毫秒) */\nexport const RAF_THROTTLE_DEFAULT_INTERVAL = 16;\n\n/** 批量更新默认间隔(毫秒) */\nexport const BATCH_UPDATE_DEFAULT_INTERVAL = 100;\n\n/** Web Worker 超时时间(毫秒) */\nexport const WORKER_DEFAULT_TIMEOUT = 30000;\n\n// ========== 数据验证相关常量 ==========\n\n/** 有效纬度范围 */\nexport const LATITUDE_RANGE = { min: -90, max: 90 } as const;\n\n/** 有效经度范围 */\nexport const LONGITUDE_RANGE = { min: -180, max: 180 } as const;\n\n/** 默认最小坐标点数量 - 多边形 */\nexport const MIN_POLYGON_POINTS = 3;\n\n/** 默认最小坐标点数量 - 折线 */\nexport const MIN_POLYLINE_POINTS = 2;\n\n/** 默认最小坐标点数量 - 点 */\nexport const MIN_POINT_COUNT = 1;\n\n// ========== 缓存相关常量 ==========\n\n/** LRU 缓存默认大小 */\nexport const LRU_CACHE_DEFAULT_SIZE = 100;\n\n/** 样式缓存默认大小 */\nexport const STYLE_CACHE_DEFAULT_SIZE = 500;\n\n/** 图标缓存默认大小 */\nexport const ICON_CACHE_DEFAULT_SIZE = 50;\n\n// ========== 聚合相关常量 ==========\n\n/** 聚合点击展开模式 */\nexport const CLUSTER_CLICK_BEHAVIOR = {\n ZOOM: 'zoom',\n EXPAND: 'expand',\n} as const;\n\n/** 聚合默认点击行为 */\nexport const CLUSTER_DEFAULT_CLICK_BEHAVIOR = CLUSTER_CLICK_BEHAVIOR.ZOOM;\n","/**\n * 统一地图边界适配 Hook\n * @description 提供统一的 fitBounds 方法,自动适配所有图层或指定图层数据\n * @since 2.1.0\n *\n * @example\n * ```tsx\n * // 基础用法:适配所有已注册图层\n * const { fitBounds } = useUnifiedFitBounds();\n * <button onClick={() => fitBounds()}>适配全部</button>\n *\n * // 指定图层类型\n * <button onClick={() => fitBounds({ include: ['marker', 'plot'] })}>\n * 只适配标注和地块\n * </button>\n *\n * // 直接传入数据源\n * <button onClick={() => fitBounds({ data: { markers: markerData } })}>\n * 适配指定数据\n * </button>\n * ```\n */\n\nimport { useCallback } from 'react';\nimport L from 'leaflet';\nimport { useMap } from '../context/MapContext';\nimport { computeDataBounds } from '../utils/area';\nimport { MAP_FIT_BOUNDS_DEFAULT_PADDING } from '../constants/common';\n\n// ========== 类型定义 ==========\n\n/** 支持的图层类型 */\nexport type FitBoundsLayerType = 'marker' | 'plot' | 'road' | 'irrigation' | 'track';\n\n/** fitBounds 选项 */\nexport interface UnifiedFitBoundsOptions {\n /** 要包含的图层类型(默认全部) */\n include?: FitBoundsLayerType[];\n /** 要排除的图层类型 */\n exclude?: FitBoundsLayerType[];\n /** 直接传入数据源(优先级高于自动收集) */\n data?: {\n markers?: { position: [number, number] }[];\n plots?: { positions: [number, number][] | [number, number][][] }[];\n roads?: { points: [number, number][] }[];\n irrigations?: { points: [number, number][] }[];\n tracks?: { segments: { coordinates: [number, number][] }[] }[];\n };\n /** 最大缩放级别 */\n maxZoom?: number;\n /** 边距 */\n padding?: number | [number, number];\n /** 是否启用动画 */\n animate?: boolean;\n}\n\n/** 数据获取器类型 */\ntype DataGetter<T = unknown> = () => T[] | null;\n\n/** 图层注册接口 */\nexport interface LayerRegistry {\n /** 注册图层数据获取函数(返回注销函数) */\n register: <T = unknown>(type: FitBoundsLayerType, getData: DataGetter<T>) => () => void;\n /** 注销指定类型的所有数据获取器 */\n unregister: (type: FitBoundsLayerType) => void;\n}\n\n// ========== 全局注册表 ==========\n\nlet nextRegistryId = 0;\nconst layerRegistry = new Map<FitBoundsLayerType, Map<string, DataGetter>>();\n\nexport const registry: LayerRegistry = {\n register: (type, getData) => {\n const id = `${type}_${nextRegistryId++}`;\n if (!layerRegistry.has(type)) {\n layerRegistry.set(type, new Map());\n }\n layerRegistry.get(type)!.set(id, getData);\n // 返回注销函数\n return () => {\n layerRegistry.get(type)?.delete(id);\n };\n },\n unregister: type => {\n layerRegistry.delete(type);\n },\n};\n\n// ========== Hook 实现 ==========\n\n/**\n * 统一地图边界适配 Hook\n * @returns fitBounds 函数和图层注册工具\n */\nexport function useUnifiedFitBounds() {\n const map = useMap();\n\n const fitBounds = useCallback(\n (options?: UnifiedFitBoundsOptions) => {\n if (!map) return;\n\n const allPoints: L.LatLng[] = [];\n\n // 如果传入了自定义数据,直接使用\n if (options?.data) {\n const { data } = options;\n\n // 处理标注点\n if (data.markers?.length) {\n data.markers.forEach(m => {\n if (m.position) {\n allPoints.push(L.latLng(m.position[0], m.position[1]));\n }\n });\n }\n\n // 处理地块\n if (data.plots?.length) {\n const boundsResult = computeDataBounds(\n data.plots as unknown as Record<string, unknown>[],\n 'positions'\n );\n if (boundsResult) {\n allPoints.push(\n L.latLng(boundsResult.southWest[0], boundsResult.southWest[1]),\n L.latLng(boundsResult.northEast[0], boundsResult.northEast[1])\n );\n }\n }\n\n // 处理道路\n if (data.roads?.length) {\n data.roads.forEach(road => {\n road.points.forEach(p => {\n allPoints.push(L.latLng(p[0], p[1]));\n });\n });\n }\n\n // 处理灌溉渠\n if (data.irrigations?.length) {\n data.irrigations.forEach(ch => {\n ch.points.forEach(p => {\n allPoints.push(L.latLng(p[0], p[1]));\n });\n });\n }\n\n // 处理轨迹\n if (data.tracks?.length) {\n data.tracks.forEach(track => {\n track.segments?.forEach(seg => {\n seg.coordinates?.forEach(c => {\n allPoints.push(L.latLng(c[0], c[1]));\n });\n });\n });\n }\n } else {\n // 否则从全局注册表收集数据\n const include = options?.include || ['marker', 'plot', 'road', 'irrigation', 'track'];\n const exclude = options?.exclude || [];\n\n const activeTypes = include.filter(t => !exclude.includes(t)) as FitBoundsLayerType[];\n\n activeTypes.forEach(type => {\n const getters = layerRegistry.get(type);\n if (!getters) return;\n\n getters.forEach(getData => {\n const data = getData();\n if (!data || data.length === 0) return;\n\n switch (type) {\n case 'marker': {\n (data as { position: [number, number] }[]).forEach(m => {\n if (m.position) {\n allPoints.push(L.latLng(m.position[0], m.position[1]));\n }\n });\n break;\n }\n case 'plot': {\n const boundsResult = computeDataBounds(\n data as unknown as Record<string, unknown>[],\n 'positions'\n );\n if (boundsResult) {\n allPoints.push(\n L.latLng(boundsResult.southWest[0], boundsResult.southWest[1]),\n L.latLng(boundsResult.northEast[0], boundsResult.northEast[1])\n );\n }\n break;\n }\n case 'road': {\n (data as { points: [number, number][] }[]).forEach(road => {\n road.points.forEach(p => {\n allPoints.push(L.latLng(p[0], p[1]));\n });\n });\n break;\n }\n case 'irrigation': {\n (data as { points: [number, number][] }[]).forEach(ch => {\n ch.points.forEach(p => {\n allPoints.push(L.latLng(p[0], p[1]));\n });\n });\n break;\n }\n case 'track': {\n // 支持 ParsedTrack[] 格式(Track 组件的实际数据格式)\n (\n data as {\n allPoints?: { position: [number, number] }[];\n segments?: Record<string, [number, number, number, number, number][]>;\n }[]\n ).forEach(track => {\n // 优先使用 allPoints(已解析的坐标数组)\n if (track.allPoints?.length) {\n track.allPoints.forEach(p => {\n allPoints.push(L.latLng(p.position[0], p.position[1]));\n });\n } else if (track.segments) {\n // 否则从 segments 中提取\n Object.values(track.segments).forEach(segment => {\n segment.forEach(point => {\n allPoints.push(L.latLng(point[0], point[1]));\n });\n });\n }\n });\n break;\n }\n }\n });\n });\n }\n\n // 执行 fitBounds\n if (allPoints.length > 0) {\n const bounds = L.latLngBounds(allPoints);\n map.fitBounds(bounds, {\n maxZoom: options?.maxZoom ?? 18,\n padding:\n typeof options?.padding === 'number'\n ? [options.padding, options.padding]\n : (options?.padding ?? MAP_FIT_BOUNDS_DEFAULT_PADDING),\n animate: options?.animate ?? true,\n });\n }\n },\n [map]\n );\n\n return {\n fitBounds,\n registry,\n };\n}\n\nexport default useUnifiedFitBounds;\n","/**\n * @fileoverview 统一数据源标准化 Hook\n * @description 提供 fieldNames 合并、数据验证、fitBoundsRegistry 注册等公共逻辑\n * @module hooks/useNormalizedDataSource\n */\n\nimport { useMemo, useEffect } from 'react';\nimport type {\n DataSourceValidationConfig,\n ValidationStats,\n MapComponentType,\n} from '../types/dataSource';\nimport type { FitBoundsLayerType } from './useUnifiedFitBounds';\nimport { registry as fitBoundsRegistry } from './useUnifiedFitBounds';\n\n/**\n * 动态数据项类型\n * @description 内部使用,通过 fieldNames 动态访问\n */\nexport type DynamicDataItem = Record<string, unknown>;\n\ninterface UseNormalizedDataSourceOptions<TOutput = unknown> {\n /** 数据源 */\n dataSource: DynamicDataItem[] | undefined;\n /** 默认字段名映射 */\n defaultFieldNames: Record<string, string>;\n /** 自定义字段名映射 */\n fieldNames?: Partial<Record<string, string>>;\n /** 验证配置 */\n validation?: DataSourceValidationConfig;\n /** 组件类型(用于日志和注册) */\n componentType: MapComponentType | string;\n /** 可选的数据映射函数,用于直接输出目标类型 */\n mapper?: (item: DynamicDataItem, fieldNames: Record<string, string>) => TOutput;\n}\n\ninterface UseNormalizedDataSourceResult<TOutput = unknown> {\n /** 标准化后的数据数组(如果提供了 mapper,则为映射后的 TOutput[]) */\n data: TOutput[];\n /** 合并后的字段名映射(默认 + 自定义) */\n fieldNames: Record<string, string>;\n /** 验证结果统计 */\n validation: ValidationStats;\n}\n\n/**\n * 统一的 dataSource 标准化 Hook\n *\n * 功能:\n * 1. 合并 fieldNames(默认 + 自定义)\n * 2. 数据验证(必需字段、坐标范围)\n * 3. 注册到 fitBoundsRegistry\n * 4. 可选的 mapper 进行类型转换\n *\n * 注意:\n * - autoFit 逻辑由各组件自行处理(使用 useAutoFit hook)\n * - dataSource 需要是 DynamicDataItem[](即 Record<string, unknown>[]),由调用方保证\n *\n * @example\n * ```tsx\n * const { data, fieldNames, validation } = useNormalizedDataSource({\n * dataSource: dataSource as DynamicDataItem[],\n * defaultFieldNames: { id: 'id', position: 'position' },\n * fieldNames: { id: 'markerId' },\n * validation: { requiredFields: ['id', 'position'] },\n * componentType: 'Marker',\n * mapper: (item, fn) => ({\n * id: item[fn.id] as string,\n * position: item[fn.position] as [number, number],\n * }),\n * });\n * ```\n */\nexport function useNormalizedDataSource<TOutput = unknown>({\n dataSource,\n defaultFieldNames,\n fieldNames,\n validation,\n componentType,\n mapper,\n}: UseNormalizedDataSourceOptions<TOutput>): UseNormalizedDataSourceResult<TOutput> {\n // 1. 合并 fieldNames\n const mergedFieldNames = useMemo((): Record<string, string> => {\n const result: Record<string, string> = { ...defaultFieldNames };\n // 过滤掉 undefined 值\n if (fieldNames) {\n for (const [key, value] of Object.entries(fieldNames)) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n }\n return result;\n }, [defaultFieldNames, fieldNames]);\n\n // 2. 数据验证\n const { validatedData, validationResult } = useMemo(() => {\n if (!Array.isArray(dataSource)) {\n return {\n validatedData: [] as DynamicDataItem[],\n validationResult: {\n total: 0,\n valid: 0,\n invalid: 0,\n errors: ['dataSource 不是数组'],\n } as ValidationStats,\n };\n }\n\n const errors: string[] = [];\n const validItems: DynamicDataItem[] = [];\n\n dataSource.forEach((item, index) => {\n // 假设数据项有效\n let isValid = true;\n\n // 空值检查\n if (!item) {\n errors.push(`[${index}] 数据项为空`);\n isValid = false;\n }\n\n // 必需字段验证\n if (isValid && validation?.requiredFields) {\n for (const field of validation.requiredFields) {\n // 直接从 item 获取字段值(简单字段名)\n const fieldValue = (item as Record<string, unknown>)[field as string];\n if (fieldValue === undefined || fieldValue === null) {\n errors.push(`[${index}] 缺少必需字段: ${field}`);\n isValid = false;\n break;\n }\n }\n }\n\n // 坐标验证\n if (isValid && validation?.coordinateFields && validation?.coordinateBounds) {\n for (const field of validation.coordinateFields) {\n const coord = (item as Record<string, unknown>)[field as string] as\n | [number, number]\n | undefined;\n if (coord && Array.isArray(coord) && coord.length >= 2) {\n const [lat, lng] = coord;\n const bounds = validation.coordinateBounds;\n\n if (bounds.lat && (lat < bounds.lat.min || lat > bounds.lat.max)) {\n errors.push(`[${index}] ${field}[0] 超出范围 [${bounds.lat.min}, ${bounds.lat.max}]`);\n isValid = false;\n }\n if (bounds.lng && (lng < bounds.lng.min || lng > bounds.lng.max)) {\n errors.push(`[${index}] ${field}[1] 超出范围 [${bounds.lng.min}, ${bounds.lng.max}]`);\n isValid = false;\n }\n }\n }\n }\n\n // 自定义验证函数\n if (isValid && validation?.customValidator) {\n const customResult = validation.customValidator(item as Record<string, unknown>, index);\n if (!customResult.valid && customResult.errors) {\n errors.push(...customResult.errors);\n isValid = false;\n }\n }\n\n // 只有通过所有验证才添加到有效列表\n if (isValid) {\n validItems.push(item as DynamicDataItem);\n }\n });\n\n return {\n validatedData: validItems,\n validationResult: {\n total: dataSource.length,\n valid: validItems.length,\n invalid: dataSource.length - validItems.length,\n errors,\n },\n };\n }, [dataSource, validation]);\n\n // 3. 如果提供了 mapper,对数据进行映射\n const mappedData = useMemo((): TOutput[] => {\n if (!mapper) {\n return validatedData as unknown as TOutput[];\n }\n return validatedData.map(item => mapper(item, mergedFieldNames));\n }, [validatedData, mergedFieldNames, mapper]);\n\n // 4. 注册到 fitBoundsRegistry\n useEffect(() => {\n if (!componentType) return;\n // 安全的类型转换:确保 componentType 是有效的 FitBoundsLayerType\n const layerType = componentType as FitBoundsLayerType;\n const unregister = fitBoundsRegistry.register(layerType, () => mappedData);\n return unregister;\n }, [componentType, mappedData]);\n\n return {\n data: mappedData,\n fieldNames: mergedFieldNames,\n validation: validationResult,\n };\n}\n\n/**\n * 快速创建 Marker 数据源标准化配置的辅助函数\n */\nexport function createMarkerValidationConfig() {\n return {\n requiredFields: ['id', 'position'],\n coordinateFields: ['position'],\n coordinateBounds: {\n lat: { min: -90, max: 90 },\n lng: { min: -180, max: 180 },\n },\n };\n}\n\n/**\n * 快速创建 Road 数据源标准化配置的辅助函数\n */\nexport function createRoadValidationConfig() {\n return {\n requiredFields: ['id', 'points'],\n coordinateFields: ['points'],\n coordinateBounds: {\n lat: { min: -90, max: 90 },\n lng: { min: -180, max: 180 },\n },\n };\n}\n\n/**\n * 快速创建 Irrigation 数据源标准化配置的辅助函数\n */\nexport function createIrrigationValidationConfig() {\n return {\n requiredFields: ['id', 'points'],\n coordinateFields: ['points'],\n coordinateBounds: {\n lat: { min: -90, max: 90 },\n lng: { min: -180, max: 180 },\n },\n };\n}\n\n/**\n * 快速创建 Plot 数据源标准化配置的辅助函数\n */\nexport function createPlotValidationConfig() {\n return {\n requiredFields: ['id'],\n // Plot 的 positions 验证较复杂,由各组件自行处理\n };\n}\n","/**\n * @fileoverview 数据标准化 Hook\n * @description 专门处理数据映射逻辑,与 useNormalizedDataSource 配合使用\n * @module hooks/useDataNormalizer\n */\n\nimport { useMemo } from 'react';\n\nexport interface UseDataNormalizerOptions<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = TInput,\n> {\n /** 原始数据源 */\n dataSource: TInput[] | undefined;\n /** 合并后的字段名映射 */\n fieldNames: Record<string, string>;\n /** 数据提取映射函数 */\n extract: (item: TInput, fieldNames: Record<string, string>) => TOutput;\n /** 验证函数,返回 true 表示有效 */\n validate?: (item: TOutput, index: number) => boolean;\n}\n\nexport interface UseDataNormalizerResult<TOutput> {\n /** 标准化后的数据数组 */\n data: TOutput[];\n /** 数据总数 */\n total: number;\n /** 有效数据数量 */\n validCount: number;\n /** 无效数据数量 */\n invalidCount: number;\n}\n\n/**\n * 数据标准化 Hook\n *\n * 专门处理数据映射逻辑,将原始数据转换为目标类型。\n * 通常与 useNormalizedDataSource 配合使用。\n *\n * @example\n * ```tsx\n * const { fieldNames } = useNormalizedDataSource({\n * dataSource,\n * defaultFieldNames: DEFAULT_FIELD_NAMES,\n * fieldNames,\n * componentType: 'marker',\n * });\n *\n * const { data: normalizedData } = useDataNormalizer({\n * dataSource: dataSource as unknown as Record<string, unknown>[],\n * fieldNames,\n * extract: (item, fn) => ({\n * id: item[fn.id] as string,\n * position: item[fn.position] as [number, number],\n * title: item[fn.title] as string | undefined,\n * }),\n * validate: (item) => item.id != null && item.position != null,\n * });\n * ```\n */\nexport function useDataNormalizer<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = TInput,\n>({\n dataSource,\n fieldNames,\n extract,\n validate,\n}: UseDataNormalizerOptions<TInput, TOutput>): UseDataNormalizerResult<TOutput> {\n return useMemo(() => {\n if (!Array.isArray(dataSource)) {\n return {\n data: [],\n total: 0,\n validCount: 0,\n invalidCount: 0,\n };\n }\n\n const result: TOutput[] = [];\n let validCount = 0;\n let invalidCount = 0;\n\n for (let i = 0; i < dataSource.length; i++) {\n const item = dataSource[i];\n if (!item) {\n invalidCount++;\n continue;\n }\n\n try {\n const mapped = extract(item as TInput, fieldNames);\n\n if (validate && !validate(mapped, i)) {\n invalidCount++;\n continue;\n }\n\n result.push(mapped);\n validCount++;\n } catch {\n invalidCount++;\n }\n }\n\n return {\n data: result,\n total: dataSource.length,\n validCount,\n invalidCount,\n };\n }, [dataSource, fieldNames, extract, validate]);\n}\n\n/**\n * 快速创建坐标验证函数\n */\nexport function createCoordinateValidator(\n coordField: string,\n bounds?: { lat?: { min: number; max: number }; lng?: { min: number; max: number } }\n) {\n return function validateCoordinate(\n item: Record<string, unknown>,\n fieldNames: Record<string, string>\n ): boolean {\n const coord = item[fieldNames[coordField]] as [number, number] | undefined;\n if (!coord || !Array.isArray(coord) || coord.length < 2) {\n return false;\n }\n const [lat, lng] = coord;\n if (typeof lat !== 'number' || typeof lng !== 'number') {\n return false;\n }\n if (bounds?.lat && (lat < bounds.lat.min || lat > bounds.lat.max)) {\n return false;\n }\n if (bounds?.lng && (lng < bounds.lng.min || lng > bounds.lng.max)) {\n return false;\n }\n return true;\n };\n}\n","/**\n * @fileoverview 自动适配地图视野 Hook\n * @description 统一处理 autoFit 逻辑,消除组件内重复代码\n * @module hooks/useAutoFit\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport L from 'leaflet';\nimport type { Coordinate } from '../types';\n\nexport interface AutoFitOptions {\n maxZoom?: number;\n padding?: number | [number, number];\n}\n\nexport type AutoFitConfig = boolean | AutoFitOptions;\n\nexport interface UseAutoFitOptions<T> {\n /** 数据数组 */\n data: T[];\n /** Leaflet 地图实例 */\n map: L.Map | null;\n /** autoFit 配置:false=禁用,true=启用,object=带选项 */\n autoFit?: AutoFitConfig;\n /** 从数据项提取坐标的函数 */\n getCoordinates: (item: T) => Coordinate[];\n}\n\ninterface UseAutoFitResult {\n /** 手动触发 fitBounds(重置后执行) */\n triggerFit: () => void;\n /** 是否已执行过 fitBounds */\n hasFitted: boolean;\n}\n\n/**\n * 自动适配地图视野 Hook\n *\n * 统一处理 autoFit 逻辑,支持不同的数据结构和坐标提取方式。\n *\n * @example\n * ```tsx\n * // Marker 场景\n * const { triggerFit } = useAutoFit({\n * data: normalizedData,\n * map,\n * autoFit,\n * getCoordinates: (item) => [item.position],\n * });\n *\n * // Road/Irrigation 场景\n * const { triggerFit } = useAutoFit({\n * data: normalizedData,\n * map,\n * autoFit,\n * getCoordinates: (item) => item.points,\n * });\n * ```\n */\nexport function useAutoFit<T>({\n data,\n map,\n autoFit,\n getCoordinates,\n}: UseAutoFitOptions<T>): UseAutoFitResult {\n const hasFittedRef = useRef(false);\n\n useEffect(() => {\n if (autoFit === false || hasFittedRef.current || !map || data.length === 0) {\n return;\n }\n\n hasFittedRef.current = true;\n\n // 提取所有坐标\n const allCoords: L.LatLngExpression[] = [];\n for (const item of data) {\n const coords = getCoordinates(item);\n for (const coord of coords) {\n allCoords.push([coord[0], coord[1]]);\n }\n }\n\n if (allCoords.length === 0) return;\n\n const bounds = L.latLngBounds(allCoords);\n if (!bounds.isValid()) return;\n\n const options = typeof autoFit === 'object' ? autoFit : {};\n const padding: [number, number] = Array.isArray(options.padding)\n ? options.padding\n : ((options.padding ?? [50, 50]) as [number, number]);\n const maxZoom = options.maxZoom ?? 18;\n\n map.fitBounds(bounds, { padding, maxZoom });\n }, [map, data, autoFit, getCoordinates]);\n\n const triggerFit = useCallback(() => {\n hasFittedRef.current = false;\n }, []);\n\n return {\n triggerFit,\n hasFitted: hasFittedRef.current,\n };\n}\n\n/**\n * 快捷创建 Marker 坐标提取函数\n */\nexport function createMarkerCoordinateGetter<T extends { position: Coordinate }>() {\n return function getMarkerCoords(item: T): Coordinate[] {\n return [item.position];\n };\n}\n\n/**\n * 快捷创建 Polyline(Road/Irrigation)坐标提取函数\n */\nexport function createPolylineCoordinateGetter<T extends { points: Coordinate[] }>() {\n return function getPolylineCoords(item: T): Coordinate[] {\n return item.points;\n };\n}\n"],"names":["useLatestRef","value","ref","useRef","useEffect","current","useSyncRef","useAutoSyncRef","initialValue","_useState","useState","_useState2","_slicedToArray","_setValue","useMapLifecycle","options","map","lifecycle","isReady","hasReadyFired","prevViewportRef","rafIdRef","_lifecycle$onMapReady","onMapReady","call","onViewportChange","handleViewportChange","_triggerEvent","requestAnimationFrame","center","getCenter","zoom","getZoom","bounds","getBounds","prev","hasChanged","Math","abs","lat","lng","_lifecycle$onViewport","on","cancelAnimationFrame","off","MapContext","createContext","mapRef","displayName","useMap","_useContext","useContext","MapProvider","_ref","children","_ref$options","onReady","style","className","_ref$destroyOnUnmount","destroyOnUnmount","containerRef","setIsReady","onReadyRef","lifecycleRef","effectiveZoom","_options$zoomControl","_options$attributionC","mapOptions","zoomControl","attributionControl","crs","undefined","maxZoom","minZoom","scrollWheelZoom","maxBounds","layers","preferCanvas","L","_onReadyRef$current","remove","contextValue","useMemo","_jsx","Provider","_objectSpread","position","JSON","stringify","ThemeContext","theme","setTheme","isDark","useTheme","ConfigContext","useConfig","FILTER_CONTAINER_ID","DARK_FILTER_ID","svgFilterInjected","ensureDarkFilterInjected","document","getElementById","svgFilters","createElementNS","setAttribute","defs","darkFilter","colorMatrix","componentTransfer","feFuncR","feFuncG","feFuncB","feFuncA","appendChild","body","LAYER_TYPES","VECTOR","SATELLITE","TERRAIN","LAYER_LABELS","_defineProperty","LAYER_URLS","base","annotation","TianDiTuLayer","memo","apiKey","_ref$showAnnotation","showAnnotation","_ref$layerType","layerType","layerTypeProp","tileUrl","annotationUrl","overlayUrl","subdomains","_maxZoom","_minZoom","_ref$attribution","attribution","themeProp","_ref$showLayerSelecto","showLayerSelector","onLayerTypeChange","config","currentLayerType","setCurrentLayerType","_useState3","_useState4","selectorVisible","setSelectorVisible","baseLayerRef","annotationLayerRef","overlayLayerRef","handleLayerChange","useCallback","type","isDarkTheme","mapContainer","getContainer","removeAttribute","baseLayer","tileLayer","addTo","annotationLayer","useCustomUrl","layerConfig","url","replace","setUrl","overlayLayer","concat","LayerSelector","_jsxs","onClick","_Fragment","createPortal","hexToRgba","hex","length","r","parseInt","slice","g","b","a","toFixed","DualScaleControl","configProp","scaleColorProp","scaleColor","controlBgProp","controlBg","controlTextProp","controlText","configContext","getConfig","_config$metric","_config$imperial","metric","imperial","shouldShow","contextConfig","dualScaleControl","finalConfig","_getConfig","scaleRef","textRef","mapInstance","animationFrameId","isCleanup","existingContainers","querySelectorAll","forEach","el","container","DomUtil","create","scale","textEl","getControlColors","bg","text","isSatelliteLight","isTerrainDark","needDarkControl","_getControlColors","backgroundColor","color","setProperty","getRoundNum","distance","isFinite","exponent","floor","log","LN10","fraction","pow","roundedFraction","getCandidateMeters","targetMeters","filter","m","update","isDestroyed","mapAny","_loaded","_mapPane","contains","_unused","mapSize","getSize","west","getWest","east","getEast","centerLat","point1","latLng","point2","maxMeters","metersPerPixel","x","targetPixels","candidates","bestMeters","bestDiff","Infinity","meters","pixels","diff","tickInterval","max","min","round","displayDistance","displayText","getMetricText","getImperialText","textContent","feet","safeUpdate","removeChild","MapSizeHandler","arguments","_ref$enabled","enabled","_ref$delay","delay","_ref$retries","retries","initialized","timers","Array","from","_","i","setTimeout","invalidateSize","clearTimeout","ZoomControl","_ref$position","zoomControlRef","zoomLevelRef","controlColors","existingControls","layerSelector","querySelector","hasLayerSelector","checkVisibility","positionStyles","topleft","top","left","bottom","right","topright","bottomleft","bottomright","Object","assign","zoomIn","innerHTML","title","zoomLevel","zoomOut","DomEvent","e","stopPropagation","preventDefault","updateZoomLevel","String","layerSelectorObserver","MutationObserver","isVisible","observe","attributes","attributeFilter","subtree","disconnect","noop","FullscreenControl","fullscreenControlRef","fullscreenControl","zIndex","display","alignItems","justifyContent","width","height","borderRadius","cursor","boxShadow","transition","addEventListener","iconContainer","renderIcon","isFullscreen","isCurrentlyFullscreen","fullscreenElement","handleFullscreenChange","handleClick","_mapContainer$request","requestFullscreen","catch","err","console","error","_document$exitFullscr","_document","exitFullscreen","removeEventListener","generateLoadingSpinnerSvg","animated","rotateAnim","generateLoadingDotsSvg","dotRadius","spacing","centerX","centerY","colors","dots","bounceAnim","push","join","DEFAULT_ICON_GROUPS","label","icons","name","_i","_DEFAULT_ICON_GROUPS","group","_iterator","_createForOfIteratorHelper","_step","s","n","done","icon","f","LOADING_DEFAULT_MASK_BACKGROUND","LOADING_DEFAULT_MASK_ZINDEX","Loading","_ref$icon","description","_ref$size","size","mask","iconSize","sizeMap","small","default","large","maskConfig","_mask$enabled","background","svgContent","content","flexDirection","gap","dangerouslySetInnerHTML","__html","fontSize","_maskConfig$zIndex","pointerEvents","getDualScaleControlConfig","getMapSizeHandlerConfig","getZoomControlConfig","getFullscreenControlConfig","MapContainer","_ref$zoom","_ref$radius","radius","_ref$maxZoom","_ref$scrollWheelZoom","_ref$zoomControl","_ref$attributionContr","whenReady","tianDiTuLayer","mapSizeHandler","loading","fullscreen","_useTheme","globalTheme","mergedStyle","defaultStyle","dualScaleConfig","mapSizeConfig","zoomControlConfig","fullscreenConfig","configValue","tianDiTuLayerValue","_typeof","THEME_CONFIG","light","primaryColor","borderColor","shadowColor","dark","getThemeColors","useLifecycle","componentType","dataSource","currentState","prevState","isRendered","renderStats","isMounted","hasRendered","prevStatusRef","dataLengthRef","dataSourceRef","renderStatsRef","_lifecycleRef$current","_lifecycleRef$current2","shouldContinue","onBeforeMount","warn","_lifecycleRef$current5","_lifecycleRef$current6","_lifecycleRef$current3","_lifecycleRef$current4","onFirstRender","totalCount","renderedCount","virtualized","prevStatus","stateChanged","mode","plotId","action","roadId","irrigationId","markerId","_lifecycleRef$current7","_lifecycleRef$current8","onStateChange","_lifecycleRef$current9","_lifecycleRef$current0","onBeforeUnmount","useEditMode","editModeProp","defaultButtons","editEnabled","enabledButtons","_toConsumableArray","isArray","toolbar","iconOnly","customToolbar","usePolylineRenderer","normalizedData","currentMode","renderItem","layerGroupRef","layerByIdRef","editingLayerRef","deps","isUnmountedRef","prevDataRef","dataChanged","currentMap","removeLayer","renderItems","layerGroup","item","index","usePolylineEditor","mapInput","_options$pmEventsEnab","pmEventsEnabled","onDrawnLayer","pmCreateGuard","setCurrentMode","tempPoints","setTempPoints","pendingCreateRef","originalPointsRef","currentModeRef","onDrawnLayerRef","pmCreateGuardRef","handleCancel","pm","_map$pm$globalEditMod","_map$pm","disableDraw","globalEditModeEnabled","disableGlobalEditMode","handleCancelRef","handleKeyDown","key","window","prevNormalizedDataRef","handleCreate","pmEvent","drawnLayer","layer","latlngs","getLatLngs","coords","ll","handleChange","first","usePolylineSave","onCreateSave","onEditSave","onCreateSaveRef","onEditSaveRef","handleSave","newPoints","_editingLayerRef$curr","_editingLayerRef$curr2","disable","_map$pm$globalEditMod2","_map$pm2","useLoadingOverlay","loadingMask","_options$icon","_options$size","_loadingMask$zIndex","maskEnabled","maskBackground","maskZIndex","shallowEqual","keysA","keys","keysB","_keysA","deepEqual","every","_i2","_keysA2","includes","useMemoCompare","compute","equal","computed","useShallowCompare","useDeepCompare","useCallbackRef","callback","_ref$current","_len","args","_key","apply","useLazyRef","init","defaultLogConfig","process","minLevel","prefix","currentLogConfig","level","componentName","message","_console","_console2","_console3","_console4","levels","minLevelIndex","indexOf","currentLevelIndex","debug","info","logger","component","_len2","_key2","_len3","_key3","_len4","_key4","_len5","_key5","usePerformanceMonitor","_config$enabled","_config$reportToServi","reportToService","serviceUrl","extraData","metricsRef","renderCount","startTimeRef","performance","now","renderCountRef","recordRenderPerformance","renderType","endTime","duration","initialRenderTime","updateRenderTime","mapOperationTime","observeMapOperation","operationName","operation","start","result","reportPerformance","_asyncToGenerator","_regenerator","_callee","metrics","_t","w","_context","p","timestamp","Date","location","href","userAgent","navigator","sendBeacon","v","getMemoryUsage","mem","memory","usedJSHeapSize","usedJSHeapSizeMB","getMetrics","useSpatialIndexWorker","_options$cellSize","cellSize","_options$indexType","indexType","_options$maxRetries","maxRetries","_options$retryDelay","retryDelay","workerRef","queryIdRef","pendingQueries","Map","pendingBuild","pendingUpdate","retryCountRef","lastErrorRef","isBuilding","setIsBuilding","_useState5","_useState6","itemCount","setItemCount","_useState7","_useState8","buildTime","setBuildTime","_useState9","_useState0","queryTime","setQueryTime","_useState1","_useState10","updateTime","setUpdateTime","_useState11","_useState12","currentIndexType","setCurrentIndexType","_useState13","_useState14","setError","_useState15","_useState16","retryCount","setRetryCount","Worker","URL","import","meta","onmessage","event","data","_pendingBuild$current","_pendingUpdate$curren","queryId","resolve","get","items","delete","onerror","errorMessage","_workerRef$current","terminate","buildIndex","plots","Promise","reject","Error","plot","id","boundaries","positions","flat","postMessage","query","set","bbox","updateIndex","addedItems","removedIds","updatedItems","clear","resetError","useGeometryWorker","_useState17","_useState18","isCalculating","setIsCalculating","_workerRef$current2","calculateAreas","handler","_workerRef$current3","payload","areas","_workerRef$current4","computeBounds","_workerRef$current5","_workerRef$current6","simplifyGeometry","tolerance","_workerRef$current7","simplifiedPlots","_workerRef$current8","DEFAULT_PLOT_STATE","selectedId","editingLayer","tempCoordinates","clipFragments","selectedFragmentId","isPreview","editAreaLabel","PlotStateMachine","initialState","_classCallCheck","defineProperty","state","_createClass","getState","reduce","dispatch","createPlotReducer","machine","usePlotDraw","callbacks","callbacksRef","handleDrawVertex","handleDrawCreate","_callbacksRef$current","_callbacksRef$current2","onCreate","coordinates","generateFragmentId","random","toString","substr","usePlotClip","handleCut","_layers$","getLayers","fragmentId","newCoords","handleSaveClip","selectedPlotId","onClip","originalId","fragments","AREA_UNIT_CONFIGS","square_meters","unit","factor","hectares","mu","acres","calculatePolygonArea","area","sumLat","avgLat","latRad","PI","latToMeters","lngToMeters","cos","j","lat1","lng1","lat2","lng2","convertArea","areaSquareMeters","formatArea","precision","convertedArea","computeDataBounds","positionsField","minLat","minLng","maxLat","maxLng","found","_loop","flatten","_iterator2","_step2","c","southWest","northEast","usePlotMove","updateAreaLabel","existingMarker","areaUnit","sumLng","coord","centroid","span","createElement","areaIcon","divIcon","html","outerHTML","iconAnchor","setLatLng","setIcon","marker","interactive","handleDrag","areaMarkerRef","handleDragEnd","onMove","enableMoveMode","pmLayer","enableLayerDrag","toggleEdit","allowSelfIntersection","draggable","initLatlngs","initCoords","disableMoveMode","disableLayerDrag","usePlotRedraw","handleEdit","handleSaveRedraw","onRedraw","enableRedrawMode","enable","disableRedrawMode","usePlotStateMachine","reducer","_useReducer","useReducer","_useReducer2","onSave","onDelete","onEdit","_usePlotDraw","_usePlotClip","_pm","_callbacksRef$current3","_callbacksRef$current4","_callbacksRef$current5","_callbacksRef$current6","_callbacksRef$current7","_callbacksRef$current8","_callbacksRef$current9","_callbacksRef$current0","_callbacksRef$current1","_callbacksRef$current10","flatCoords","handleRedraw","handleClip","handleMove","_callbacksRef$current11","_callbacksRef$current12","handleDelete","_callbacksRef$current13","_callbacksRef$current14","startEdit","clearTempLayer","editMode","isPreviewMode","clipHintMessage","DEFAULT_OPTIONS","vertexColor","vertexSize","useVertexStyleFix","mergedOptions","timerRef","fixVertexStyle","_container$current","markers","currentBg","currentBorder","border","expectedBorder","observer","_container$current2","childList","getDistance","latlng1","latlng2","distanceTo","getMiddlePoint","formatDistance","createDistanceIcon","angle","labelClass","labelType","useDistanceLabels","points","labels","middlePoint","deltaLng","deltaLat","atan2","zIndexOffset","useDistanceData","total","segments","middle","useIncrementalUpdate","getId","isEqual","applyUpdate","createInitial","resultRef","getDiff","prevItems","newItems","prevMap","newMap","_iterator3","_step3","_step3$value","newItem","prevItem","_iterator4","_step4","_step4$value","has","applyIncremental","_iterator5","_step5","rebuild","_iterator6","_step6","useLayerStyleIncremental","getStyle","getLayerById","prevItemsRef","prevSelectedIdsRef","Set","updateStyles","selectedIds","_iterator7","_step7","_iterator8","_step8","_iterator9","_step9","_step9$value","isSelected","setStyle","updateSelection","prevSelectedIds","newSelectedIds","changedIds","_iterator0","_step0","add","_iterator1","_step1","_iterator10","_step10","find","useRafThrottle","rafRef","lastArgsRef","callbackRef","throttledFn","useDebouncedCallback","debouncedFn","fn","cancel","useViewportDebounce","_options$zoomDebounce","zoomDebounceDelay","_options$moveDebounce","moveDebounceDelay","_options$useRaf","useRaf","_options$listenResize","listenResize","realtimeZoom","setRealtimeZoom","realtimeViewVersion","setRealtimeViewVersion","realtimeBoundsRef","realtimeCenterRef","debouncedZoom","setDebouncedZoom","debouncedViewVersion","setDebouncedViewVersion","debouncedBounds","setDebouncedBounds","debouncedCenter","setDebouncedCenter","debouncedSetZoom","debouncedSetViewVersion","version","throttledSetViewVersion","forceUpdate","initialZoom","initialBounds","initialCenter","handleZoomEnd","handleMoveEnd","newVersion","handleResize","realtime","viewVersion","useLayerIncrementalUpdate","createLayer","updateLayer","_options$getId","_options$enabled","layersMapRef","defaultRemoveLayer","actualRemoveLayer","performUpdate","newData","currentIds","existingIds","entry","existing","success","newLayer","count","layersMap","useEnhancedVirtualization","dataLength","_config$autoEnableThr","autoEnableThreshold","_config$buffer","buffer","_config$throttleMs","throttleMs","_config$minZoom","_config$maxZoom","_config$simplifyZoomT","simplifyZoomThreshold","_config$chunkedLoadin","chunkedLoading","_config$chunkSize","chunkSize","maxConcurrentChunks","isVirtualized","viewport","setViewport","loadedChunksRef","throttleTimerRef","updateViewport","bufferedBBox","throttledUpdateViewport","isInZoomRange","shouldSimplify","totalChunks","ceil","getVisibleChunks","centerLng","hash","visibleChunk","chunks","chunkIndex","clearChunks","loadedChunks","useIsomorphicLayoutEffect","useLayoutEffect","is3DPositions","isCoordinateInBounds","_coord","isPlotInBounds","rings","ring","useBoxZoomSelection","fieldNames","_fieldNames","onSelectionChange","setInternalSelectedIds","enabledRef","setInternalSelectedIdsRef","onSelectionChangeRef","handleBoxZoomEnd","boxZoomEvent","boxZoomBounds","MAP_FIT_BOUNDS_DEFAULT_PADDING","nextRegistryId","layerRegistry","registry","register","getData","_layerRegistry$get","unregister","useUnifiedFitBounds","fitBounds","allPoints","_data$markers","_data$plots","_data$roads","_data$irrigations","_data$tracks","boundsResult","roads","road","irrigations","ch","tracks","track","_track$segments","seg","_seg$coordinates","include","exclude","activeTypes","t","getters","_track$allPoints","values","segment","point","_options$maxZoom","_options$padding","_options$animate","latLngBounds","padding","animate","useNormalizedDataSource","defaultFieldNames","validation","mapper","mergedFieldNames","_Object$entries","entries","_Object$entries$_i","_useMemo","validatedData","validationResult","valid","invalid","errors","validItems","isValid","requiredFields","field","fieldValue","coordinateFields","coordinateBounds","customValidator","customResult","mappedData","fitBoundsRegistry","createMarkerValidationConfig","createRoadValidationConfig","createIrrigationValidationConfig","createPlotValidationConfig","useDataNormalizer","extract","validate","validCount","invalidCount","mapped","createCoordinateValidator","coordField","validateCoordinate","useAutoFit","autoFit","getCoordinates","hasFittedRef","allCoords","triggerFit","hasFitted","createMarkerCoordinateGetter","getMarkerCoords","createPolylineCoordinateGetter","getPolylineCoords"],"mappings":"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"}