expo-gaode-map 2.2.35-next.0 → 2.2.35

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 (54) hide show
  1. package/README.md +16 -10
  2. package/android/src/main/java/expo/modules/gaodemap/ExpoGaodeMapModule.kt +54 -52
  3. package/build/components/FoldableMapView.d.ts.map +1 -1
  4. package/build/components/FoldableMapView.js +46 -52
  5. package/build/components/FoldableMapView.js.map +1 -1
  6. package/build/components/overlays/Marker.d.ts.map +1 -1
  7. package/build/components/overlays/Marker.js +26 -30
  8. package/build/components/overlays/Marker.js.map +1 -1
  9. package/build/hooks/useRoutePlayback.d.ts +6 -0
  10. package/build/hooks/useRoutePlayback.d.ts.map +1 -1
  11. package/build/hooks/useRoutePlayback.js +23 -2
  12. package/build/hooks/useRoutePlayback.js.map +1 -1
  13. package/build/module/geometry.d.ts +3 -0
  14. package/build/module/geometry.d.ts.map +1 -1
  15. package/build/module/geometry.js +3 -0
  16. package/build/module/geometry.js.map +1 -1
  17. package/build/module/location.d.ts +39 -0
  18. package/build/module/location.d.ts.map +1 -1
  19. package/build/module/location.js +39 -0
  20. package/build/module/location.js.map +1 -1
  21. package/build/module/nativeModule.d.ts +11 -0
  22. package/build/module/nativeModule.d.ts.map +1 -1
  23. package/build/module/nativeModule.js +14 -0
  24. package/build/module/nativeModule.js.map +1 -1
  25. package/build/module/normalizers.d.ts +28 -0
  26. package/build/module/normalizers.d.ts.map +1 -1
  27. package/build/module/normalizers.js +25 -0
  28. package/build/module/normalizers.js.map +1 -1
  29. package/build/module/privacy.d.ts +7 -1
  30. package/build/module/privacy.d.ts.map +1 -1
  31. package/build/module/privacy.js +4 -1
  32. package/build/module/privacy.js.map +1 -1
  33. package/build/module/sdk.d.ts +3 -0
  34. package/build/module/sdk.d.ts.map +1 -1
  35. package/build/module/sdk.js.map +1 -1
  36. package/build/types/common.types.d.ts +2 -2
  37. package/build/types/common.types.d.ts.map +1 -1
  38. package/build/types/common.types.js.map +1 -1
  39. package/build/utils/GeoUtils.d.ts +3 -0
  40. package/build/utils/GeoUtils.d.ts.map +1 -1
  41. package/build/utils/GeoUtils.js.map +1 -1
  42. package/build/utils/PermissionUtils.d.ts.map +1 -1
  43. package/build/utils/PermissionUtils.js +3 -0
  44. package/build/utils/PermissionUtils.js.map +1 -1
  45. package/build/utils/RouteUtils.d.ts +45 -0
  46. package/build/utils/RouteUtils.d.ts.map +1 -1
  47. package/build/utils/RouteUtils.js +91 -7
  48. package/build/utils/RouteUtils.js.map +1 -1
  49. package/build/utils/lazyNativeViewManager.d.ts +3 -0
  50. package/build/utils/lazyNativeViewManager.d.ts.map +1 -1
  51. package/build/utils/lazyNativeViewManager.js.map +1 -1
  52. package/ios/modules/LocationManager.swift +2 -4
  53. package/ios/overlays/MarkerView.swift +40 -26
  54. package/package.json +7 -2
@@ -1 +1 @@
1
- {"version":3,"file":"FoldableMapView.js","sourceRoot":"","sources":["../../src/components/FoldableMapView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,gBAAgB,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAc,SAAS,EAAE,MAAM,2BAA2B,CAAC;AA6BpF,MAAM,uBAAuB,GAA6B;IACxD,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,CAAC;IACpB,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,GAAG,EAAE,GAAE,CAAC;IAC3B,KAAK,EAAE,KAAK;CACb,CAAC;AAEF,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAuB;IACnD,OAAO;QACL,GAAG,uBAAuB;QAC1B,GAAG,MAAM;KACV,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,MAA0C,EAC1C,QAAmB,EACnB,QAAmB,EACnB,MAAgC,EAChC,WAAiD;IAEjD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAC/D,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,IAAI,WAAW,YAAY,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,KAAK,SAAS,CAAC,QAAQ,IAAI,QAAQ,KAAK,SAAS,CAAC,MAAM,CAAC;IACrF,MAAM,SAAS,GAAG,QAAQ,KAAK,SAAS,CAAC,MAAM,IAAI,QAAQ,KAAK,SAAS,CAAC,QAAQ,CAAC;IAEnF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,WAAW,WAAW,EAAE;YACtC,QAAQ;YACR,QAAQ;YACR,WAAW;YACX,SAAS;YACT,WAAW,EAAE,aAAa,CAAC,IAAI;SAChC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;IACrF,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAEzD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,WAAW,SAAS,EAAE;YACpC,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;QAC9B,MAAM,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAClE,IAAI,EAAE,QAAQ;KACf,EAAE,GAAG,CAAC,CAAC;AACV,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAmC,CAAC,EAC9D,cAAc,EACd,GAAG,QAAQ,EACZ,EAAE,EAAE;IACH,MAAM,MAAM,GAAG,MAAM,CAAa,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAY,SAAS,CAAC,OAAO,CAAC,CAAC;IACvF,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAa,gBAAgB,CAAC,aAAa,EAAE,CAAC,CAAC;IAC3F,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,cAAc,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IACrF,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE9C,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAC7B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,OAAO,GAAG,gBAAgB,CAAC;IAC1C,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,aAAa,EAAE,CAAC;QAC1D,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAClC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,sBAAsB;QACtB,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YACxD,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,gBAAgB,CAAC,YAAY,EAAE,CAAC;QACrD,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC;QACpC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAElC,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACvC,CAAC;QAED,WAAW;QACX,MAAM,cAAc,GAAG,gBAAgB,CAAC,0BAA0B,CAChE,KAAK,EAAE,OAAmB,EAAE,EAAE;YAC5B,MAAM,YAAY,GAAG,gBAAgB,CAAC,YAAY,EAAE,CAAC;YACrD,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,CAAC;YAC/C,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC;YAEvC,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACtC,CAAC;YAED,aAAa;YACb,IAAI,YAAY,KAAK,iBAAiB,IAAI,iBAAiB,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;gBAClF,IAAI,CAAC;oBACH,MAAM,8BAA8B,CAClC,MAAM,EACN,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,iBAAiB,CAClB,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;wBACvB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;oBACxD,CAAC;gBACH,CAAC;YACH,CAAC;YAED,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC;YACpC,mBAAmB,CAAC,YAAY,CAAC,CAAC;YAClC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEvB,OAAO;YACP,YAAY,CAAC,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC,CACF,CAAC;QAEF,OAAO,GAAG,EAAE;YACV,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAE5B,OAAO,CACL,CAAC,gBAAgB,CACf,GAAG,CAAC,CAAC,MAAM,CAAC,CACZ,IAAI,QAAQ,CAAC,EACb,CACH,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAmC,EACnC,MAAuB;IAEvB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAY,SAAS,CAAC,OAAO,CAAC,CAAC;IACzE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAa,gBAAgB,CAAC,aAAa,EAAE,CAAC,CAAC;IAC3F,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAEvC,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,OAAO,GAAG,SAAS,CAAC;IACnC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,CAAC,OAAO,GAAG,YAAY,CAAC;IACnC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,gBAAgB,CAAC,YAAY,EAAE,CAAC;QACrD,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC;QACpC,YAAY,CAAC,YAAY,CAAC,CAAC;QAE3B,MAAM,cAAc,GAAG,gBAAgB,CAAC,0BAA0B,CAChE,KAAK,EAAE,OAAmB,EAAE,EAAE;YAC5B,MAAM,YAAY,GAAG,gBAAgB,CAAC,YAAY,EAAE,CAAC;YACrD,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,CAAC;YAC/C,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC;YAEvC,IAAI,YAAY,KAAK,iBAAiB,IAAI,iBAAiB,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;gBAClF,IAAI,CAAC;oBACH,MAAM,8BAA8B,CAClC,MAAM,EACN,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,gBAAgB,CACjB,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;wBACvB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;oBACjD,CAAC;gBACH,CAAC;YACH,CAAC;YAED,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC;YACpC,YAAY,CAAC,YAAY,CAAC,CAAC;YAC3B,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,YAAY,CAAC,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC,CACF,CAAC;QAEF,OAAO,GAAG,EAAE;YACV,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAEpC,OAAO;QACL,SAAS;QACT,UAAU;QACV,UAAU,EAAE,UAAU,CAAC,UAAU;KAClC,CAAC;AACJ,CAAC","sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Platform } from 'react-native';\nimport ExpoGaodeMapView from '../ExpoGaodeMapView';\n\nimport { PlatformDetector, DeviceInfo, FoldState } from '../utils/PlatformDetector';\nimport { MapViewProps, MapViewRef } from '../types';\n\n/**\n * 折叠屏适配配置\n */\nexport interface FoldableConfig {\n /** 折叠时是否自动调整缩放级别 */\n autoAdjustZoom?: boolean;\n /** 展开时的缩放级别增量 */\n unfoldedZoomDelta?: number;\n /** 是否在折叠/展开时保持中心点 */\n keepCenterOnFold?: boolean;\n /** 折叠状态变化回调 */\n onFoldStateChange?: (state: FoldState, deviceInfo: DeviceInfo) => void;\n /** 是否启用调试日志 */\n debug?: boolean;\n}\n\n/**\n * 折叠屏地图视图组件\n * \n * 自动适配折叠屏设备的展开/折叠状态变化\n */\nexport interface FoldableMapViewProps extends MapViewProps {\n /** 折叠屏适配配置 */\n foldableConfig?: FoldableConfig;\n}\n\nconst DEFAULT_FOLDABLE_CONFIG: Required<FoldableConfig> = {\n autoAdjustZoom: true,\n unfoldedZoomDelta: 1,\n keepCenterOnFold: true,\n onFoldStateChange: () => {},\n debug: false,\n};\n\nfunction clampZoomLevel(zoom: number): number {\n return Math.max(3, Math.min(20, zoom));\n}\n\nfunction createFoldableConfig(config?: FoldableConfig): Required<FoldableConfig> {\n return {\n ...DEFAULT_FOLDABLE_CONFIG,\n ...config,\n };\n}\n\nasync function applyFoldStateCameraAdjustment(\n mapRef: React.RefObject<MapViewRef | null>,\n oldState: FoldState,\n newState: FoldState,\n config: Required<FoldableConfig>,\n debugPrefix: 'FoldableMapView' | 'useFoldableMap'\n): Promise<void> {\n if (!mapRef.current || !config.autoAdjustZoom) {\n return;\n }\n\n const currentCamera = await mapRef.current.getCameraPosition();\n if (!currentCamera) {\n if (config.debug) {\n console.warn(`[${debugPrefix}] 无法获取相机位置`);\n }\n return;\n }\n\n const isUnfolding = newState === FoldState.UNFOLDED && oldState === FoldState.FOLDED;\n const isFolding = newState === FoldState.FOLDED && oldState === FoldState.UNFOLDED;\n\n if (config.debug) {\n console.log(`[${debugPrefix}] 折叠状态变化:`, {\n oldState,\n newState,\n isUnfolding,\n isFolding,\n currentZoom: currentCamera.zoom,\n });\n }\n\n if (!isUnfolding && !isFolding) {\n return;\n }\n\n const currentZoom = currentCamera.zoom ?? 15;\n const zoomDelta = isUnfolding ? config.unfoldedZoomDelta : -config.unfoldedZoomDelta;\n const nextZoom = clampZoomLevel(currentZoom + zoomDelta);\n\n if (config.debug) {\n console.log(`[${debugPrefix}] 调整缩放:`, {\n oldZoom: currentZoom,\n newZoom: nextZoom,\n delta: zoomDelta,\n });\n }\n\n await mapRef.current.moveCamera({\n target: config.keepCenterOnFold ? currentCamera.target : undefined,\n zoom: nextZoom,\n }, 300);\n}\n\nexport const FoldableMapView: React.FC<FoldableMapViewProps> = ({\n foldableConfig,\n ...mapProps\n}) => {\n const mapRef = useRef<MapViewRef>(null);\n const [currentFoldState, setCurrentFoldState] = useState<FoldState>(FoldState.UNKNOWN);\n const [deviceInfo, setDeviceInfo] = useState<DeviceInfo>(PlatformDetector.getDeviceInfo());\n const config = useMemo(() => createFoldableConfig(foldableConfig), [foldableConfig]);\n const configRef = useRef(config);\n const foldStateRef = useRef(currentFoldState);\n\n useEffect(() => {\n configRef.current = config;\n }, [config]);\n\n useEffect(() => {\n foldStateRef.current = currentFoldState;\n }, [currentFoldState]);\n\n useEffect(() => {\n const latestDeviceInfo = PlatformDetector.getDeviceInfo();\n setDeviceInfo(latestDeviceInfo);\n }, []);\n\n useEffect(() => {\n // 仅在 Android 折叠屏设备上启用\n if (Platform.OS !== 'android' || !deviceInfo.isFoldable) {\n if (configRef.current.debug) {\n console.log('[FoldableMapView] 非折叠屏设备,跳过适配');\n }\n return;\n }\n\n const initialState = PlatformDetector.getFoldState();\n foldStateRef.current = initialState;\n setCurrentFoldState(initialState);\n\n if (configRef.current.debug) {\n console.log('[FoldableMapView] 初始化折叠屏适配');\n console.log('设备信息:', deviceInfo);\n console.log('初始折叠状态:', initialState);\n }\n\n // 监听屏幕尺寸变化\n const removeListener = PlatformDetector.addDimensionChangeListener(\n async (newInfo: DeviceInfo) => {\n const newFoldState = PlatformDetector.getFoldState();\n const previousFoldState = foldStateRef.current;\n const latestConfig = configRef.current;\n \n if (latestConfig.debug) {\n console.log('[FoldableMapView] 屏幕尺寸变化');\n console.log('新设备信息:', newInfo);\n console.log('新折叠状态:', newFoldState);\n }\n\n // 折叠状态变化时的处理\n if (newFoldState !== previousFoldState && previousFoldState !== FoldState.UNKNOWN) {\n try {\n await applyFoldStateCameraAdjustment(\n mapRef,\n previousFoldState,\n newFoldState,\n latestConfig,\n 'FoldableMapView'\n );\n } catch (error) {\n if (latestConfig.debug) {\n console.error('[FoldableMapView] 处理折叠状态变化失败:', error);\n }\n }\n }\n\n foldStateRef.current = newFoldState;\n setCurrentFoldState(newFoldState);\n setDeviceInfo(newInfo);\n \n // 触发回调\n latestConfig.onFoldStateChange(newFoldState, newInfo);\n }\n );\n\n return () => {\n removeListener();\n };\n }, [deviceInfo.isFoldable]);\n\n return (\n <ExpoGaodeMapView\n ref={mapRef}\n {...mapProps}\n />\n );\n};\n\n/**\n * 折叠屏适配 Hook\n * \n * 用于在现有地图组件中添加折叠屏适配功能\n */\nexport function useFoldableMap(\n mapRef: React.RefObject<MapViewRef>,\n config?: FoldableConfig\n) {\n const [foldState, setFoldState] = useState<FoldState>(FoldState.UNKNOWN);\n const [deviceInfo, setDeviceInfo] = useState<DeviceInfo>(PlatformDetector.getDeviceInfo());\n const mergedConfig = useMemo(() => createFoldableConfig(config), [config]);\n const foldStateRef = useRef(foldState);\n const configRef = useRef(mergedConfig);\n\n useEffect(() => {\n foldStateRef.current = foldState;\n }, [foldState]);\n\n useEffect(() => {\n configRef.current = mergedConfig;\n }, [mergedConfig]);\n\n useEffect(() => {\n if (Platform.OS !== 'android' || !deviceInfo.isFoldable) {\n return;\n }\n\n const initialState = PlatformDetector.getFoldState();\n foldStateRef.current = initialState;\n setFoldState(initialState);\n\n const removeListener = PlatformDetector.addDimensionChangeListener(\n async (newInfo: DeviceInfo) => {\n const newFoldState = PlatformDetector.getFoldState();\n const previousFoldState = foldStateRef.current;\n const latestConfig = configRef.current;\n \n if (newFoldState !== previousFoldState && previousFoldState !== FoldState.UNKNOWN) {\n try {\n await applyFoldStateCameraAdjustment(\n mapRef,\n previousFoldState,\n newFoldState,\n latestConfig,\n 'useFoldableMap'\n );\n } catch (error) {\n if (latestConfig.debug) {\n console.error('[useFoldableMap] 调整失败:', error);\n }\n }\n }\n\n foldStateRef.current = newFoldState;\n setFoldState(newFoldState);\n setDeviceInfo(newInfo);\n latestConfig.onFoldStateChange(newFoldState, newInfo);\n }\n );\n\n return () => {\n removeListener();\n };\n }, [deviceInfo.isFoldable, mapRef]);\n\n return {\n foldState,\n deviceInfo,\n isFoldable: deviceInfo.isFoldable,\n };\n}\n"]}
1
+ {"version":3,"file":"FoldableMapView.js","sourceRoot":"","sources":["../../src/components/FoldableMapView.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Platform } from 'react-native';\nimport ExpoGaodeMapView from '../ExpoGaodeMapView';\n\nimport { PlatformDetector, DeviceInfo, FoldState } from '../utils/PlatformDetector';\nimport { MapViewProps, MapViewRef } from '../types';\n\n/**\n * 折叠屏适配配置\n */\nexport interface FoldableConfig {\n /** 折叠时是否自动调整缩放级别 */\n autoAdjustZoom?: boolean;\n /** 展开时的缩放级别增量 */\n unfoldedZoomDelta?: number;\n /** 是否在折叠/展开时保持中心点 */\n keepCenterOnFold?: boolean;\n /** 折叠状态变化回调 */\n onFoldStateChange?: (state: FoldState, deviceInfo: DeviceInfo) => void;\n /** 是否启用调试日志 */\n debug?: boolean;\n}\n\n/**\n * 折叠屏地图视图组件\n * \n * 自动适配折叠屏设备的展开/折叠状态变化\n */\nexport interface FoldableMapViewProps extends MapViewProps {\n /** 折叠屏适配配置 */\n foldableConfig?: FoldableConfig;\n}\n\nconst DEFAULT_FOLDABLE_CONFIG: Required<FoldableConfig> = {\n autoAdjustZoom: true,\n unfoldedZoomDelta: 1,\n keepCenterOnFold: true,\n onFoldStateChange: () => {},\n debug: false,\n};\n\nfunction clampZoomLevel(zoom: number): number {\n return Math.max(3, Math.min(20, zoom));\n}\n\nfunction createFoldableConfig(config?: FoldableConfig): Required<FoldableConfig> {\n return {\n ...DEFAULT_FOLDABLE_CONFIG,\n ...config,\n };\n}\n\nasync function applyFoldStateCameraAdjustment(\n mapRef: React.RefObject<MapViewRef | null>,\n oldState: FoldState,\n newState: FoldState,\n config: Required<FoldableConfig>,\n debugPrefix: 'FoldableMapView' | 'useFoldableMap'\n): Promise<void> {\n if (!mapRef.current || !config.autoAdjustZoom) {\n return;\n }\n\n const currentCamera = await mapRef.current.getCameraPosition();\n if (!currentCamera) {\n if (config.debug) {\n console.warn(`[${debugPrefix}] 无法获取相机位置`);\n }\n return;\n }\n\n const isUnfolding = newState === FoldState.UNFOLDED && oldState === FoldState.FOLDED;\n const isFolding = newState === FoldState.FOLDED && oldState === FoldState.UNFOLDED;\n\n if (config.debug) {\n console.log(`[${debugPrefix}] 折叠状态变化:`, {\n oldState,\n newState,\n isUnfolding,\n isFolding,\n currentZoom: currentCamera.zoom,\n });\n }\n\n if (!isUnfolding && !isFolding) {\n return;\n }\n\n const currentZoom = currentCamera.zoom ?? 15;\n const zoomDelta = isUnfolding ? config.unfoldedZoomDelta : -config.unfoldedZoomDelta;\n const nextZoom = clampZoomLevel(currentZoom + zoomDelta);\n\n if (config.debug) {\n console.log(`[${debugPrefix}] 调整缩放:`, {\n oldZoom: currentZoom,\n newZoom: nextZoom,\n delta: zoomDelta,\n });\n }\n\n await mapRef.current.moveCamera({\n target: config.keepCenterOnFold ? currentCamera.target : undefined,\n zoom: nextZoom,\n }, 300);\n}\n\nexport const FoldableMapView: React.FC<FoldableMapViewProps> = ({\n foldableConfig,\n ...mapProps\n}) => {\n const mapRef = useRef<MapViewRef>(null);\n const [currentFoldState, setCurrentFoldState] = useState<FoldState>(FoldState.UNKNOWN);\n const [deviceInfo, setDeviceInfo] = useState<DeviceInfo>(PlatformDetector.getDeviceInfo());\n const config = useMemo(() => createFoldableConfig(foldableConfig), [foldableConfig]);\n const foldStateRef = useRef(currentFoldState);\n\n const handleFoldStateChange = React.useEffectEvent(\n async (newInfo: DeviceInfo, debugPrefix: 'FoldableMapView' | 'useFoldableMap') => {\n const newFoldState = PlatformDetector.getFoldState();\n const previousFoldState = foldStateRef.current;\n\n if (config.debug) {\n console.log(`[${debugPrefix}] 屏幕尺寸变化`);\n console.log('新设备信息:', newInfo);\n console.log('新折叠状态:', newFoldState);\n }\n\n if (newFoldState !== previousFoldState && previousFoldState !== FoldState.UNKNOWN) {\n try {\n await applyFoldStateCameraAdjustment(\n mapRef,\n previousFoldState,\n newFoldState,\n config,\n debugPrefix\n );\n } catch (error) {\n if (config.debug) {\n console.error(`[${debugPrefix}] 处理折叠状态变化失败:`, error);\n }\n }\n }\n\n foldStateRef.current = newFoldState;\n setCurrentFoldState(newFoldState);\n setDeviceInfo(newInfo);\n config.onFoldStateChange(newFoldState, newInfo);\n }\n );\n\n useEffect(() => {\n foldStateRef.current = currentFoldState;\n }, [currentFoldState]);\n\n useEffect(() => {\n const latestDeviceInfo = PlatformDetector.getDeviceInfo();\n setDeviceInfo(latestDeviceInfo);\n }, []);\n\n useEffect(() => {\n // 仅在 Android 折叠屏设备上启用\n if (Platform.OS !== 'android' || !deviceInfo.isFoldable) {\n if (config.debug) {\n console.log('[FoldableMapView] 非折叠屏设备,跳过适配');\n }\n return;\n }\n\n const initialState = PlatformDetector.getFoldState();\n foldStateRef.current = initialState;\n setCurrentFoldState(initialState);\n\n if (config.debug) {\n console.log('[FoldableMapView] 初始化折叠屏适配');\n console.log('设备信息:', deviceInfo);\n console.log('初始折叠状态:', initialState);\n }\n\n // 监听屏幕尺寸变化\n const removeListener = PlatformDetector.addDimensionChangeListener(\n async (newInfo: DeviceInfo) => {\n await handleFoldStateChange(newInfo, 'FoldableMapView');\n }\n );\n\n return () => {\n removeListener();\n };\n }, [config.debug, deviceInfo.isFoldable]);\n\n return (\n <ExpoGaodeMapView\n ref={mapRef}\n {...mapProps}\n />\n );\n};\n\n/**\n * 折叠屏适配 Hook\n * \n * 用于在现有地图组件中添加折叠屏适配功能\n */\nexport function useFoldableMap(\n mapRef: React.RefObject<MapViewRef>,\n config?: FoldableConfig\n) {\n const [foldState, setFoldState] = useState<FoldState>(FoldState.UNKNOWN);\n const [deviceInfo, setDeviceInfo] = useState<DeviceInfo>(PlatformDetector.getDeviceInfo());\n const mergedConfig = useMemo(() => createFoldableConfig(config), [config]);\n const foldStateRef = useRef(foldState);\n\n useEffect(() => {\n foldStateRef.current = foldState;\n }, [foldState]);\n\n const handleFoldStateChange = React.useEffectEvent(async (newInfo: DeviceInfo) => {\n const newFoldState = PlatformDetector.getFoldState();\n const previousFoldState = foldStateRef.current;\n\n if (newFoldState !== previousFoldState && previousFoldState !== FoldState.UNKNOWN) {\n try {\n await applyFoldStateCameraAdjustment(\n mapRef,\n previousFoldState,\n newFoldState,\n mergedConfig,\n 'useFoldableMap'\n );\n } catch (error) {\n if (mergedConfig.debug) {\n console.error('[useFoldableMap] 调整失败:', error);\n }\n }\n }\n\n foldStateRef.current = newFoldState;\n setFoldState(newFoldState);\n setDeviceInfo(newInfo);\n mergedConfig.onFoldStateChange(newFoldState, newInfo);\n });\n\n useEffect(() => {\n if (Platform.OS !== 'android' || !deviceInfo.isFoldable) {\n return;\n }\n\n const initialState = PlatformDetector.getFoldState();\n foldStateRef.current = initialState;\n setFoldState(initialState);\n\n const removeListener = PlatformDetector.addDimensionChangeListener(\n async (newInfo: DeviceInfo) => {\n await handleFoldStateChange(newInfo);\n }\n );\n\n return () => {\n removeListener();\n };\n }, [deviceInfo.isFoldable, mapRef]);\n\n return {\n foldState,\n deviceInfo,\n isFoldable: deviceInfo.isFoldable,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Marker.d.ts","sourceRoot":"","sources":["../../../src/components/overlays/Marker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgB/C;;;;;;;;;GASG;AACH,iBAAS,MAAM,CAAC,KAAK,EAAE,WAAW,qBAiJjC;;AAED,wBAAkC"}
1
+ {"version":3,"file":"Marker.d.ts","sourceRoot":"","sources":["../../../src/components/overlays/Marker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgB/C;;;;;;;;;GASG;AACH,iBAAS,MAAM,CAAC,KAAK,EAAE,WAAW,qBA6JjC;;AAED,wBAAkC"}
@@ -20,9 +20,16 @@ function Marker(props) {
20
20
  const [measuredSize, setMeasuredSize] = React.useState(AUTO_SIZE_FALLBACK);
21
21
  // 从 props 中排除 position 属性,避免传递到原生层
22
22
  const { position, iconWidth, iconHeight, children, smoothMovePath, cacheKey, ...restProps } = props;
23
+ const smoothMoveDuration = props.smoothMoveDuration;
23
24
  // 归一化坐标处理
24
- const normalizedPosition = normalizeLatLng(position);
25
- const normalizedSmoothMovePath = smoothMovePath ? normalizeLatLngList(smoothMovePath) : undefined;
25
+ const normalizedPosition = React.useMemo(() => normalizeLatLng(position), [position]);
26
+ const normalizedSmoothMovePath = React.useMemo(() => (smoothMovePath ? normalizeLatLngList(smoothMovePath) : undefined), [smoothMovePath]);
27
+ const emitSmoothMoveProgress = React.useEffectEvent((nativeEvent) => {
28
+ props.onSmoothMoveProgress?.({ nativeEvent });
29
+ });
30
+ const emitSmoothMoveEnd = React.useEffectEvent((nativeEvent) => {
31
+ props.onSmoothMoveEnd?.({ nativeEvent });
32
+ });
26
33
  // 根据是否有 children 来决定使用哪个尺寸属性
27
34
  const hasChildren = !!children;
28
35
  const shouldWrapChildrenForMeasurement = hasChildren;
@@ -34,22 +41,20 @@ function Marker(props) {
34
41
  React.useEffect(() => {
35
42
  if (!normalizedSmoothMovePath ||
36
43
  normalizedSmoothMovePath.length < 2 ||
37
- !props.smoothMoveDuration ||
38
- props.smoothMoveDuration <= 0) {
44
+ !smoothMoveDuration ||
45
+ smoothMoveDuration <= 0) {
39
46
  return undefined;
40
47
  }
41
48
  const totalDistance = ExpoGaodeMapModule.calculatePathLength(normalizedSmoothMovePath);
42
49
  if (totalDistance <= 0) {
43
- props.onSmoothMoveEnd?.({
44
- nativeEvent: {
45
- position: normalizedSmoothMovePath[normalizedSmoothMovePath.length - 1],
46
- angle: 0,
47
- totalDistance,
48
- },
50
+ emitSmoothMoveEnd({
51
+ position: normalizedSmoothMovePath[normalizedSmoothMovePath.length - 1],
52
+ angle: 0,
53
+ totalDistance,
49
54
  });
50
55
  return undefined;
51
56
  }
52
- const durationMs = props.smoothMoveDuration * 1000;
57
+ const durationMs = smoothMoveDuration * 1000;
53
58
  const startedAt = Date.now();
54
59
  const tick = () => {
55
60
  const progress = Math.min(1, (Date.now() - startedAt) / durationMs);
@@ -59,22 +64,18 @@ function Marker(props) {
59
64
  ? { latitude: pointInfo.latitude, longitude: pointInfo.longitude }
60
65
  : normalizedSmoothMovePath[normalizedSmoothMovePath.length - 1];
61
66
  const angle = pointInfo?.angle ?? 0;
62
- props.onSmoothMoveProgress?.({
63
- nativeEvent: {
67
+ emitSmoothMoveProgress({
68
+ position: point,
69
+ angle,
70
+ progress,
71
+ distance,
72
+ totalDistance,
73
+ });
74
+ if (progress >= 1) {
75
+ emitSmoothMoveEnd({
64
76
  position: point,
65
77
  angle,
66
- progress,
67
- distance,
68
78
  totalDistance,
69
- },
70
- });
71
- if (progress >= 1) {
72
- props.onSmoothMoveEnd?.({
73
- nativeEvent: {
74
- position: point,
75
- angle,
76
- totalDistance,
77
- },
78
79
  });
79
80
  }
80
81
  };
@@ -86,12 +87,7 @@ function Marker(props) {
86
87
  }
87
88
  }, 100);
88
89
  return () => clearInterval(intervalId);
89
- }, [
90
- normalizedSmoothMovePath,
91
- props.onSmoothMoveEnd,
92
- props.onSmoothMoveProgress,
93
- props.smoothMoveDuration,
94
- ]);
90
+ }, [normalizedSmoothMovePath, smoothMoveDuration]);
95
91
  const handleAutoMeasure = (event) => {
96
92
  const nextWidth = Math.ceil(event.nativeEvent.layout.width);
97
93
  const nextHeight = Math.ceil(event.nativeEvent.layout.height);
@@ -1 +1 @@
1
- {"version":3,"file":"Marker.js","sourceRoot":"","sources":["../../../src/components/overlays/Marker.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\nimport type { LayoutChangeEvent } from 'react-native';\nimport { StyleSheet, View } from 'react-native';\nimport type { MarkerProps } from '../../types';\nimport ExpoGaodeMapModule from '../../ExpoGaodeMapModule';\nimport { normalizeLatLng, normalizeLatLngList } from '../../utils/GeoUtils';\nimport { createLazyNativeViewManager } from '../../utils/lazyNativeViewManager';\n\ntype NativeMarkerViewProps = Omit<MarkerProps, 'position'> & {\n latitude: number;\n longitude: number;\n contentWidth?: number;\n contentHeight?: number;\n};\n\nconst getNativeMarkerView = createLazyNativeViewManager<NativeMarkerViewProps>('MarkerView');\n\nconst AUTO_SIZE_FALLBACK = { width: 0, height: 0 };\n\n/**\n * Marker 组件 - 完全声明式 API\n *\n * 支持:\n * - 自定义图标(icon)\n * - 自定义内容(children)- 自动测量尺寸\n * - 大头针样式(pinColor)\n * - 拖拽功能\n * - 所有事件回调\n */\nfunction Marker(props: MarkerProps) {\n const NativeMarkerView = React.useMemo(() => getNativeMarkerView(), []);\n const [measuredSize, setMeasuredSize] = React.useState(AUTO_SIZE_FALLBACK);\n // 从 props 中排除 position 属性,避免传递到原生层\n const {\n position,\n iconWidth,\n iconHeight,\n children,\n smoothMovePath,\n cacheKey,\n ...restProps\n } = props;\n \n // 归一化坐标处理\n const normalizedPosition = normalizeLatLng(position);\n const normalizedSmoothMovePath = smoothMovePath ? normalizeLatLngList(smoothMovePath) : undefined;\n\n // 根据是否有 children 来决定使用哪个尺寸属性\n const hasChildren = !!children;\n const shouldWrapChildrenForMeasurement = hasChildren;\n // Android 的 children marker 之前始终透传 0 尺寸,点击后重新快照时容易直接消失。\n // 统一走自动测量后,两个平台都会拿到稳定尺寸。\n const shouldUseAutoMeasuredSize = hasChildren;\n const resolvedContentWidth = shouldUseAutoMeasuredSize ? measuredSize.width : 0;\n const resolvedContentHeight = shouldUseAutoMeasuredSize ? measuredSize.height : 0;\n\n React.useEffect(() => {\n if (\n !normalizedSmoothMovePath ||\n normalizedSmoothMovePath.length < 2 ||\n !props.smoothMoveDuration ||\n props.smoothMoveDuration <= 0\n ) {\n return undefined;\n }\n\n const totalDistance = ExpoGaodeMapModule.calculatePathLength(normalizedSmoothMovePath);\n if (totalDistance <= 0) {\n props.onSmoothMoveEnd?.({\n nativeEvent: {\n position: normalizedSmoothMovePath[normalizedSmoothMovePath.length - 1],\n angle: 0,\n totalDistance,\n },\n } as never);\n return undefined;\n }\n\n const durationMs = props.smoothMoveDuration * 1000;\n const startedAt = Date.now();\n const tick = () => {\n const progress = Math.min(1, (Date.now() - startedAt) / durationMs);\n const distance = totalDistance * progress;\n const pointInfo = ExpoGaodeMapModule.getPointAtDistance(normalizedSmoothMovePath, distance);\n const point = pointInfo\n ? { latitude: pointInfo.latitude, longitude: pointInfo.longitude }\n : normalizedSmoothMovePath[normalizedSmoothMovePath.length - 1];\n const angle = pointInfo?.angle ?? 0;\n\n props.onSmoothMoveProgress?.({\n nativeEvent: {\n position: point,\n angle,\n progress,\n distance,\n totalDistance,\n },\n } as never);\n\n if (progress >= 1) {\n props.onSmoothMoveEnd?.({\n nativeEvent: {\n position: point,\n angle,\n totalDistance,\n },\n } as never);\n }\n };\n\n tick();\n const intervalId = setInterval(() => {\n tick();\n if (Date.now() - startedAt >= durationMs) {\n clearInterval(intervalId);\n }\n }, 100);\n\n return () => clearInterval(intervalId);\n }, [\n normalizedSmoothMovePath,\n props.onSmoothMoveEnd,\n props.onSmoothMoveProgress,\n props.smoothMoveDuration,\n ]);\n\n const handleAutoMeasure = (event: LayoutChangeEvent) => {\n const nextWidth = Math.ceil(event.nativeEvent.layout.width);\n const nextHeight = Math.ceil(event.nativeEvent.layout.height);\n\n if (nextWidth === measuredSize.width && nextHeight === measuredSize.height) {\n return;\n }\n\n setMeasuredSize({\n width: nextWidth,\n height: nextHeight,\n });\n };\n \n // 智能尺寸计算\n const finalIconWidth = hasChildren\n ? resolvedContentWidth\n : (iconWidth && iconWidth > 0 ? iconWidth : 40);\n \n const finalIconHeight = hasChildren\n ? resolvedContentHeight\n : (iconHeight && iconHeight > 0 ? iconHeight : 40);\n\n const optionalNativeProps = cacheKey != null ? { cacheKey } : undefined;\n \n return (\n <NativeMarkerView\n {...restProps}\n {...optionalNativeProps}\n latitude={normalizedPosition.latitude}\n longitude={normalizedPosition.longitude}\n iconWidth={finalIconWidth}\n iconHeight={finalIconHeight}\n contentWidth={hasChildren ? finalIconWidth : 0}\n contentHeight={hasChildren ? finalIconHeight : 0}\n smoothMovePath={normalizedSmoothMovePath}\n >\n {hasChildren && shouldWrapChildrenForMeasurement ? (\n <View\n collapsable={false}\n onLayout={handleAutoMeasure}\n style={styles.measureContainer}\n >\n {children}\n </View>\n ) : children}\n </NativeMarkerView>\n );\n}\n\nexport default React.memo(Marker);\n\nconst styles = StyleSheet.create({\n measureContainer: {\n alignSelf: 'flex-start',\n alignItems: 'flex-start',\n flexShrink: 0,\n },\n});\n"]}
1
+ {"version":3,"file":"Marker.js","sourceRoot":"","sources":["../../../src/components/overlays/Marker.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\nimport type { LayoutChangeEvent } from 'react-native';\nimport { StyleSheet, View } from 'react-native';\nimport type { MarkerProps } from '../../types';\nimport ExpoGaodeMapModule from '../../ExpoGaodeMapModule';\nimport { normalizeLatLng, normalizeLatLngList } from '../../utils/GeoUtils';\nimport { createLazyNativeViewManager } from '../../utils/lazyNativeViewManager';\n\ntype NativeMarkerViewProps = Omit<MarkerProps, 'position'> & {\n latitude: number;\n longitude: number;\n contentWidth?: number;\n contentHeight?: number;\n};\n\nconst getNativeMarkerView = createLazyNativeViewManager<NativeMarkerViewProps>('MarkerView');\n\nconst AUTO_SIZE_FALLBACK = { width: 0, height: 0 };\n\n/**\n * Marker 组件 - 完全声明式 API\n *\n * 支持:\n * - 自定义图标(icon)\n * - 自定义内容(children)- 自动测量尺寸\n * - 大头针样式(pinColor)\n * - 拖拽功能\n * - 所有事件回调\n */\nfunction Marker(props: MarkerProps) {\n const NativeMarkerView = React.useMemo(() => getNativeMarkerView(), []);\n const [measuredSize, setMeasuredSize] = React.useState(AUTO_SIZE_FALLBACK);\n // 从 props 中排除 position 属性,避免传递到原生层\n const {\n position,\n iconWidth,\n iconHeight,\n children,\n smoothMovePath,\n cacheKey,\n ...restProps\n } = props;\n\n const smoothMoveDuration = props.smoothMoveDuration;\n \n // 归一化坐标处理\n const normalizedPosition = React.useMemo(() => normalizeLatLng(position), [position]);\n const normalizedSmoothMovePath = React.useMemo(\n () => (smoothMovePath ? normalizeLatLngList(smoothMovePath) : undefined),\n [smoothMovePath]\n );\n\n const emitSmoothMoveProgress = React.useEffectEvent((nativeEvent: {\n position: { latitude: number; longitude: number };\n angle: number;\n progress: number;\n distance: number;\n totalDistance: number;\n }) => {\n props.onSmoothMoveProgress?.({ nativeEvent } as never);\n });\n\n const emitSmoothMoveEnd = React.useEffectEvent((nativeEvent: {\n position: { latitude: number; longitude: number };\n angle: number;\n totalDistance: number;\n }) => {\n props.onSmoothMoveEnd?.({ nativeEvent } as never);\n });\n\n // 根据是否有 children 来决定使用哪个尺寸属性\n const hasChildren = !!children;\n const shouldWrapChildrenForMeasurement = hasChildren;\n // Android 的 children marker 之前始终透传 0 尺寸,点击后重新快照时容易直接消失。\n // 统一走自动测量后,两个平台都会拿到稳定尺寸。\n const shouldUseAutoMeasuredSize = hasChildren;\n const resolvedContentWidth = shouldUseAutoMeasuredSize ? measuredSize.width : 0;\n const resolvedContentHeight = shouldUseAutoMeasuredSize ? measuredSize.height : 0;\n\n React.useEffect(() => {\n if (\n !normalizedSmoothMovePath ||\n normalizedSmoothMovePath.length < 2 ||\n !smoothMoveDuration ||\n smoothMoveDuration <= 0\n ) {\n return undefined;\n }\n\n const totalDistance = ExpoGaodeMapModule.calculatePathLength(normalizedSmoothMovePath);\n if (totalDistance <= 0) {\n emitSmoothMoveEnd({\n position: normalizedSmoothMovePath[normalizedSmoothMovePath.length - 1],\n angle: 0,\n totalDistance,\n });\n return undefined;\n }\n\n const durationMs = smoothMoveDuration * 1000;\n const startedAt = Date.now();\n const tick = () => {\n const progress = Math.min(1, (Date.now() - startedAt) / durationMs);\n const distance = totalDistance * progress;\n const pointInfo = ExpoGaodeMapModule.getPointAtDistance(normalizedSmoothMovePath, distance);\n const point = pointInfo\n ? { latitude: pointInfo.latitude, longitude: pointInfo.longitude }\n : normalizedSmoothMovePath[normalizedSmoothMovePath.length - 1];\n const angle = pointInfo?.angle ?? 0;\n\n emitSmoothMoveProgress({\n position: point,\n angle,\n progress,\n distance,\n totalDistance,\n });\n\n if (progress >= 1) {\n emitSmoothMoveEnd({\n position: point,\n angle,\n totalDistance,\n });\n }\n };\n\n tick();\n const intervalId = setInterval(() => {\n tick();\n if (Date.now() - startedAt >= durationMs) {\n clearInterval(intervalId);\n }\n }, 100);\n\n return () => clearInterval(intervalId);\n }, [normalizedSmoothMovePath, smoothMoveDuration]);\n\n const handleAutoMeasure = (event: LayoutChangeEvent) => {\n const nextWidth = Math.ceil(event.nativeEvent.layout.width);\n const nextHeight = Math.ceil(event.nativeEvent.layout.height);\n\n if (nextWidth === measuredSize.width && nextHeight === measuredSize.height) {\n return;\n }\n\n setMeasuredSize({\n width: nextWidth,\n height: nextHeight,\n });\n };\n \n // 智能尺寸计算\n const finalIconWidth = hasChildren\n ? resolvedContentWidth\n : (iconWidth && iconWidth > 0 ? iconWidth : 40);\n \n const finalIconHeight = hasChildren\n ? resolvedContentHeight\n : (iconHeight && iconHeight > 0 ? iconHeight : 40);\n\n const optionalNativeProps = cacheKey != null ? { cacheKey } : undefined;\n \n return (\n <NativeMarkerView\n {...restProps}\n {...optionalNativeProps}\n latitude={normalizedPosition.latitude}\n longitude={normalizedPosition.longitude}\n iconWidth={finalIconWidth}\n iconHeight={finalIconHeight}\n contentWidth={hasChildren ? finalIconWidth : 0}\n contentHeight={hasChildren ? finalIconHeight : 0}\n smoothMovePath={normalizedSmoothMovePath}\n >\n {hasChildren && shouldWrapChildrenForMeasurement ? (\n <View\n collapsable={false}\n onLayout={handleAutoMeasure}\n style={styles.measureContainer}\n >\n {children}\n </View>\n ) : children}\n </NativeMarkerView>\n );\n}\n\nexport default React.memo(Marker);\n\nconst styles = StyleSheet.create({\n measureContainer: {\n alignSelf: 'flex-start',\n alignItems: 'flex-start',\n flexShrink: 0,\n },\n});\n"]}
@@ -1,4 +1,10 @@
1
1
  import type { LatLng } from '../types/common.types';
2
2
  import type { RoutePlaybackController, RoutePlaybackOptions } from '../types/route-playback.types';
3
+ /**
4
+ * 路由回放
5
+ * @param points 路径点
6
+ * @param options 回放选项
7
+ * @returns 回放控制器
8
+ */
3
9
  export declare function useRoutePlayback(points: Array<LatLng | [number, number] | number[]>, options?: RoutePlaybackOptions): RoutePlaybackController;
4
10
  //# sourceMappingURL=useRoutePlayback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useRoutePlayback.d.ts","sourceRoot":"","sources":["../../src/hooks/useRoutePlayback.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EACV,uBAAuB,EACvB,oBAAoB,EAErB,MAAM,+BAA+B,CAAC;AAyDvC,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,EACnD,OAAO,GAAE,oBAAyB,GACjC,uBAAuB,CAkUzB"}
1
+ {"version":3,"file":"useRoutePlayback.d.ts","sourceRoot":"","sources":["../../src/hooks/useRoutePlayback.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EACV,uBAAuB,EACvB,oBAAoB,EAErB,MAAM,+BAA+B,CAAC;AAmEvC;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,EACnD,OAAO,GAAE,oBAAyB,GACjC,uBAAuB,CA0UzB"}
@@ -13,6 +13,15 @@ const DEFAULT_STATE = {
13
13
  traveledDistance: 0,
14
14
  durationSeconds: 0,
15
15
  };
16
+ /**
17
+ * 获取标记角度
18
+ * @param path 路径点
19
+ * @param totalDistance 总距离
20
+ * @param targetDistance 目标距离
21
+ * @param lastAngle 上一个角度
22
+ * @param options 回放选项
23
+ * @returns 角度和点
24
+ */
16
25
  function getMarkerAngle(path, totalDistance, targetDistance, lastAngle, options) {
17
26
  // 先取当前距离上的点,再额外预读一个前瞻点,
18
27
  // 让车辆朝向在转弯时更自然,不会出现生硬折角。
@@ -45,6 +54,12 @@ function getMarkerAngle(path, totalDistance, targetDistance, lastAngle, options)
45
54
  },
46
55
  };
47
56
  }
57
+ /**
58
+ * 路由回放
59
+ * @param points 路径点
60
+ * @param options 回放选项
61
+ * @returns 回放控制器
62
+ */
48
63
  export function useRoutePlayback(points, options = {}) {
49
64
  const map = React.useContext(MapContext);
50
65
  const optionsRef = React.useRef(options);
@@ -60,6 +75,12 @@ export function useRoutePlayback(points, options = {}) {
60
75
  React.useEffect(() => {
61
76
  optionsRef.current = options;
62
77
  }, [options]);
78
+ const emitProgress = React.useEffectEvent((nextState) => {
79
+ options.onProgress?.(nextState);
80
+ });
81
+ const emitComplete = React.useEffectEvent((nextState) => {
82
+ options.onComplete?.(nextState);
83
+ });
63
84
  const normalizedPath = React.useMemo(() => {
64
85
  // 长路径可选走一次抽稀,减少轨迹回放期间的计算量。
65
86
  const normalized = normalizeLatLngList(points);
@@ -96,7 +117,7 @@ export function useRoutePlayback(points, options = {}) {
96
117
  // 统一从这里下发状态,避免不同控制分支各自维护回调时机。
97
118
  stateRef.current = nextState;
98
119
  setState(nextState);
99
- optionsRef.current.onProgress?.(nextState);
120
+ emitProgress(nextState);
100
121
  }, []);
101
122
  const syncProgress = React.useCallback(async (progress, keepPlaying) => {
102
123
  // 根据“当前进度 -> 已行驶距离 -> 路径上的点”推导出车辆位置,
@@ -151,7 +172,7 @@ export function useRoutePlayback(points, options = {}) {
151
172
  elapsedBeforePauseRef.current = 0;
152
173
  startAtRef.current = 0;
153
174
  const completedState = await syncProgress(1, false);
154
- optionsRef.current.onComplete?.(completedState);
175
+ emitComplete(completedState);
155
176
  return;
156
177
  }
157
178
  await syncProgress(progress, true);
@@ -1 +1 @@
1
- {"version":3,"file":"useRoutePlayback.js","sourceRoot":"","sources":["../../src/hooks/useRoutePlayback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,kBAAkB,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAOtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,aAAa,GAAuB;IACxC,SAAS,EAAE,KAAK;IAChB,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,CAAC;IACX,eAAe,EAAE,IAAI;IACrB,YAAY,EAAE,CAAC;IACf,aAAa,EAAE,CAAC;IAChB,gBAAgB,EAAE,CAAC;IACnB,eAAe,EAAE,CAAC;CACnB,CAAC;AAEF,SAAS,cAAc,CACrB,IAAc,EACd,aAAqB,EACrB,cAAsB,EACtB,SAAiB,EACjB,OAA6B;IAE7B,wBAAwB;IACxB,yBAAyB;IACzB,MAAM,SAAS,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC9E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,iBAAiB,GAAG,OAAO,CAAC,uBAAuB,IAAI,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,kBAAkB,CAAC,kBAAkB,CACvD,IAAI,EACJ,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,cAAc,GAAG,iBAAiB,CAAC,CAC5D,CAAC;IAEF,IAAI,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC;IAClC,IAAI,WAAW,IAAI,cAAc,GAAG,iBAAiB,GAAG,aAAa,EAAE,CAAC;QACtE,IAAI,QAAQ,GAAG,WAAW,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QACnD,IAAI,QAAQ,GAAG,GAAG;YAAE,QAAQ,IAAI,GAAG,CAAC;QACpC,IAAI,QAAQ,GAAG,CAAC,GAAG;YAAE,QAAQ,IAAI,GAAG,CAAC;QACrC,WAAW,GAAG,SAAS,CAAC,KAAK,GAAG,QAAQ,GAAG,GAAG,CAAC;IACjD,CAAC;IAED,IAAI,IAAI,GAAG,WAAW,GAAG,SAAS,CAAC;IACnC,IAAI,IAAI,GAAG,GAAG;QAAE,IAAI,IAAI,GAAG,CAAC;IAC5B,IAAI,IAAI,GAAG,CAAC,GAAG;QAAE,IAAI,IAAI,GAAG,CAAC;IAE7B,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,GAAG,CAAC;IACzD,OAAO;QACL,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,gBAAgB;QAC1C,KAAK,EAAE;YACL,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,SAAS,EAAE,SAAS,CAAC,SAAS;SAC/B;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAmD,EACnD,UAAgC,EAAE;IAElC,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAqB,aAAa,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAqB,aAAa,CAAC,CAAC;IACjE,MAAM,CAAC,eAAe,EAAE,uBAAuB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;IAChG,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAwC,IAAI,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,qBAAqB,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAkB,IAAI,CAAC,CAAC;IAC5D,MAAM,mBAAmB,GAAG,KAAK,CAAC,MAAM,CAAgB,IAAI,CAAC,CAAC;IAE9D,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAC/B,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACxC,2BAA2B;QAC3B,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAa,CAAC;QAC3D,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;YAC/D,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC1F,CAAC,EAAE,CAAC,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC,CAAC;IAE9C,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CACjC,GAAG,EAAE,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAC5D,CAAC,cAAc,CAAC,CACjB,CAAC;IAEF,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACzC,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5B,OAAO,OAAO,CAAC,eAAe,CAAC;QACjC,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,IAAI,CAAC,CAAC;QACpD,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7F,CAAC,EAAE;QACD,OAAO,CAAC,YAAY;QACpB,OAAO,CAAC,eAAe;QACvB,OAAO,CAAC,kBAAkB;QAC1B,eAAe;QACf,aAAa;KACd,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACvC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAChC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CACpC,CAAC,SAA6B,EAAE,EAAE;QAChC,8BAA8B;QAC9B,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC;QAC7B,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpB,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CACpC,KAAK,EAAE,QAAgB,EAAE,WAAoB,EAAE,EAAE;QAC/C,qCAAqC;QACrC,sCAAsC;QACtC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,EAAE,CAAC;YAC9E,MAAM,SAAS,GAAG;gBAChB,GAAG,aAAa;gBAChB,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,IAAI;gBAC1C,aAAa;gBACb,eAAe;aAChB,CAAC;YACF,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC3D,MAAM,gBAAgB,GAAG,aAAa,GAAG,eAAe,CAAC;QACzD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,cAAc,CACrC,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,YAAY,CAAC,OAAO,EACpB,UAAU,CAAC,OAAO,CACnB,CAAC;QACF,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC;QAE7B,MAAM,SAAS,GAAuB;YACpC,SAAS,EAAE,WAAW;YACtB,QAAQ,EAAE,CAAC,WAAW,IAAI,eAAe,GAAG,CAAC,IAAI,eAAe,GAAG,CAAC;YACpE,QAAQ,EAAE,eAAe;YACzB,eAAe,EAAE,KAAK,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,IAAI;YACnD,YAAY,EAAE,KAAK;YACnB,aAAa;YACb,gBAAgB;YAChB,eAAe;YACf,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;YACxD,kBAAkB,EAAE,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;SAC9D,CAAC;QAEF,YAAY,CAAC,SAAS,CAAC,CAAC;QAExB,IAAI,UAAU,CAAC,OAAO,CAAC,YAAY,KAAK,IAAI,IAAI,SAAS,CAAC,eAAe,IAAI,GAAG,EAAE,CAAC;YACjF,MAAM,GAAG,CAAC,UAAU,CAClB;gBACE,MAAM,EAAE,SAAS,CAAC,eAAe;gBACjC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE;gBACzC,OAAO,EAAE,KAAK;aACf,EACD,UAAU,CAAC,OAAO,CAAC,gBAAgB,IAAI,GAAG,CAC3C,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,EACD;QACE,eAAe;QACf,GAAG;QACH,cAAc;QACd,YAAY;QACZ,aAAa;KACd,CACF,CAAC;IAEF,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC;QAClF,MAAM,QAAQ,GAAG,eAAe,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;QAEjF,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,SAAS,EAAE,CAAC;YACZ,qBAAqB,CAAC,OAAO,GAAG,CAAC,CAAC;YAClC,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;YACvB,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACpD,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,cAAc,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,MAAM,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,eAAe,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IAE/C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACxC,SAAS,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,gBAAgB,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1E,QAAQ,CAAC,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;YAClC,KAAK,eAAe,EAAE,CAAC;QACzB,CAAC,EAAE,QAAQ,CAAC,CAAC;IACf,CAAC,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC;IAEjC,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAClC,SAAS,EAAE,CAAC;QACZ,qBAAqB,CAAC,OAAO,GAAG,CAAC,CAAC;QAClC,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;QACvB,YAAY,CAAC,OAAO,GAAG,CAAC,CAAC;QACzB,YAAY,CAAC;YACX,GAAG,aAAa;YAChB,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,IAAI;YAC1C,aAAa;YACb,eAAe;SAChB,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAE9E,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,SAAS,EAAE,CAAC;QACZ,qBAAqB,CAAC,OAAO,GAAG,CAAC,CAAC;QAClC,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,YAAY,CAAC,OAAO,GAAG,CAAC,CAAC;QAEzB,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5E,MAAM,sBAAsB,CAAC,GAAG,EAAE,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5B,UAAU,EAAE,CAAC;IACf,CAAC,EAAE;QACD,GAAG;QACH,cAAc;QACd,UAAU;QACV,YAAY;KACb,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACnC,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,eAAe,IAAI,CAAC,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,SAAS,EAAE,CAAC;QACZ,qBAAqB,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;QACjE,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;QACvB,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC;QACtC,YAAY,CAAC;YACX,GAAG,YAAY;YACf,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,IAAI;YACd,cAAc,EAAE,SAAS;YACzB,kBAAkB,EAAE,SAAS;SAC9B,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,eAAe,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;IAE/C,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QAC1C,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC;QACtC,IAAI,YAAY,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,KAAK,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,YAAY,CAAC;YACX,GAAG,YAAY;YACf,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,KAAK;YACf,cAAc,EAAE,cAAc;YAC9B,kBAAkB,EAAE,eAAe;SACpC,CAAC,CAAC;QACH,UAAU,EAAE,CAAC;IACf,CAAC,EAAE;QACD,eAAe;QACf,cAAc;QACd,YAAY;QACZ,KAAK;QACL,UAAU;KACX,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAC5B,CAAC,QAAgB,EAAE,EAAE;QACnB,8CAA8C;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnD,qBAAqB,CAAC,OAAO,GAAG,OAAO,GAAG,eAAe,GAAG,IAAI,CAAC;QACjE,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC,EACD,CAAC,eAAe,EAAE,YAAY,CAAC,CAChC,CAAC;IAEF,MAAM,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,UAAkB,EAAE,EAAE;QAClE,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEtD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,KAAK,cAAc,CAAC;QAC/D,MAAM,eAAe,GACnB,mBAAmB,CAAC,OAAO,KAAK,IAAI,IAAI,mBAAmB,CAAC,OAAO,KAAK,eAAe,CAAC;QAE1F,eAAe,CAAC,OAAO,GAAG,cAAc,CAAC;QACzC,mBAAmB,CAAC,OAAO,GAAG,eAAe,CAAC;QAE9C,IAAI,WAAW,EAAE,CAAC;YAChB,SAAS,EAAE,CAAC;YACZ,qBAAqB,CAAC,OAAO,GAAG,CAAC,CAAC;YAClC,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;YACvB,YAAY,CAAC,OAAO,GAAG,CAAC,CAAC;YACzB,YAAY,CAAC;gBACX,GAAG,aAAa;gBAChB,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,IAAI;gBAC1C,aAAa;gBACb,eAAe;aAChB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC;QAEtC,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;YAC3B,qBAAqB,CAAC,OAAO,GAAG,YAAY,CAAC,QAAQ,GAAG,eAAe,GAAG,IAAI,CAAC;YAC/E,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAChC,YAAY,CAAC;gBACX,GAAG,YAAY;gBACf,aAAa;gBACb,eAAe;gBACf,kBAAkB,EAAE,eAAe;aACpC,CAAC,CAAC;YACH,UAAU,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC1B,qBAAqB,CAAC,OAAO,GAAG,YAAY,CAAC,QAAQ,GAAG,eAAe,GAAG,IAAI,CAAC;YAC/E,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;YACvB,YAAY,CAAC;gBACX,GAAG,YAAY;gBACf,aAAa;gBACb,eAAe;aAChB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,YAAY,CAAC;YACX,GAAG,YAAY;YACf,eAAe,EACb,YAAY,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,IAAI;YACtF,aAAa;YACb,eAAe;SAChB,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAE1F,OAAO;QACL,GAAG,KAAK;QACR,aAAa;QACb,eAAe;QACf,KAAK,EAAE,GAAG,EAAE;YACV,KAAK,KAAK,EAAE,CAAC;QACf,CAAC;QACD,KAAK;QACL,MAAM,EAAE,GAAG,EAAE;YACX,KAAK,MAAM,EAAE,CAAC;QAChB,CAAC;QACD,IAAI;QACJ,IAAI;QACJ,kBAAkB;KACnB,CAAC;AACJ,CAAC","sourcesContent":["import * as React from 'react';\n\nimport ExpoGaodeMapModule from '../ExpoGaodeMapModule';\nimport { MapContext } from '../components/MapContext';\nimport type { LatLng } from '../types/common.types';\nimport type {\n RoutePlaybackController,\n RoutePlaybackOptions,\n RoutePlaybackState,\n} from '../types/route-playback.types';\nimport { normalizeLatLngList } from '../utils/GeoUtils';\nimport { fitCameraToCoordinates } from '../utils/RouteUtils';\n\nconst DEFAULT_STATE: RoutePlaybackState = {\n isPlaying: false,\n isPaused: false,\n progress: 0,\n currentPosition: null,\n currentAngle: 0,\n totalDistance: 0,\n traveledDistance: 0,\n durationSeconds: 0,\n};\n\nfunction getMarkerAngle(\n path: LatLng[],\n totalDistance: number,\n targetDistance: number,\n lastAngle: number,\n options: RoutePlaybackOptions\n): { angle: number; point: LatLng | null } {\n // 先取当前距离上的点,再额外预读一个前瞻点,\n // 让车辆朝向在转弯时更自然,不会出现生硬折角。\n const pointInfo = ExpoGaodeMapModule.getPointAtDistance(path, targetDistance);\n if (!pointInfo) {\n return { angle: lastAngle, point: null };\n }\n\n const lookAheadDistance = options.lookAheadDistanceMeters ?? 5;\n const futurePoint = ExpoGaodeMapModule.getPointAtDistance(\n path,\n Math.min(totalDistance, targetDistance + lookAheadDistance)\n );\n\n let targetAngle = pointInfo.angle;\n if (futurePoint && targetDistance + lookAheadDistance < totalDistance) {\n let diffNext = futurePoint.angle - pointInfo.angle;\n if (diffNext > 180) diffNext -= 360;\n if (diffNext < -180) diffNext += 360;\n targetAngle = pointInfo.angle + diffNext * 0.4;\n }\n\n let diff = targetAngle - lastAngle;\n if (diff > 180) diff -= 360;\n if (diff < -180) diff += 360;\n\n const bearingSmoothing = options.bearingSmoothing ?? 0.2;\n return {\n angle: lastAngle + diff * bearingSmoothing,\n point: {\n latitude: pointInfo.latitude,\n longitude: pointInfo.longitude,\n },\n };\n}\n\nexport function useRoutePlayback(\n points: Array<LatLng | [number, number] | number[]>,\n options: RoutePlaybackOptions = {}\n): RoutePlaybackController {\n const map = React.useContext(MapContext);\n const optionsRef = React.useRef(options);\n const [state, setState] = React.useState<RoutePlaybackState>(DEFAULT_STATE);\n const stateRef = React.useRef<RoutePlaybackState>(DEFAULT_STATE);\n const [speedMultiplier, setSpeedMultiplierState] = React.useState(options.speedMultiplier ?? 1);\n const timerRef = React.useRef<ReturnType<typeof setInterval> | null>(null);\n const startAtRef = React.useRef(0);\n const elapsedBeforePauseRef = React.useRef(0);\n const lastAngleRef = React.useRef(0);\n const previousPathRef = React.useRef<LatLng[] | null>(null);\n const previousDurationRef = React.useRef<number | null>(null);\n\n React.useEffect(() => {\n optionsRef.current = options;\n }, [options]);\n\n const normalizedPath = React.useMemo(() => {\n // 长路径可选走一次抽稀,减少轨迹回放期间的计算量。\n const normalized = normalizeLatLngList(points) as LatLng[];\n if (normalized.length <= 2 || !options.simplificationTolerance) {\n return normalized;\n }\n return ExpoGaodeMapModule.simplifyPolyline(normalized, options.simplificationTolerance);\n }, [options.simplificationTolerance, points]);\n\n const totalDistance = React.useMemo(\n () => ExpoGaodeMapModule.calculatePathLength(normalizedPath),\n [normalizedPath]\n );\n\n const durationSeconds = React.useMemo(() => {\n if (options.durationSeconds) {\n return options.durationSeconds;\n }\n\n const baseSpeed = options.baseSpeedMps ?? 15;\n const minDuration = options.minDurationSeconds ?? 5;\n if (totalDistance <= 0) {\n return 0;\n }\n\n return Math.max(minDuration, totalDistance / (baseSpeed * Math.max(speedMultiplier, 0.1)));\n }, [\n options.baseSpeedMps,\n options.durationSeconds,\n options.minDurationSeconds,\n speedMultiplier,\n totalDistance,\n ]);\n\n const stopTimer = React.useCallback(() => {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const publishState = React.useCallback(\n (nextState: RoutePlaybackState) => {\n // 统一从这里下发状态,避免不同控制分支各自维护回调时机。\n stateRef.current = nextState;\n setState(nextState);\n optionsRef.current.onProgress?.(nextState);\n },\n []\n );\n\n const syncProgress = React.useCallback(\n async (progress: number, keepPlaying: boolean) => {\n // 根据“当前进度 -> 已行驶距离 -> 路径上的点”推导出车辆位置,\n // 再同步决定 smoothMovePath / 相机跟随 / 对外状态。\n if (normalizedPath.length === 0 || totalDistance <= 0 || durationSeconds <= 0) {\n const nextState = {\n ...DEFAULT_STATE,\n currentPosition: normalizedPath[0] ?? null,\n totalDistance,\n durationSeconds,\n };\n publishState(nextState);\n return nextState;\n }\n\n const clampedProgress = Math.max(0, Math.min(1, progress));\n const traveledDistance = totalDistance * clampedProgress;\n const { angle, point } = getMarkerAngle(\n normalizedPath,\n totalDistance,\n traveledDistance,\n lastAngleRef.current,\n optionsRef.current\n );\n lastAngleRef.current = angle;\n\n const nextState: RoutePlaybackState = {\n isPlaying: keepPlaying,\n isPaused: !keepPlaying && clampedProgress > 0 && clampedProgress < 1,\n progress: clampedProgress,\n currentPosition: point ?? normalizedPath[0] ?? null,\n currentAngle: angle,\n totalDistance,\n traveledDistance,\n durationSeconds,\n smoothMovePath: keepPlaying ? normalizedPath : undefined,\n smoothMoveDuration: keepPlaying ? durationSeconds : undefined,\n };\n\n publishState(nextState);\n\n if (optionsRef.current.followCamera === true && nextState.currentPosition && map) {\n await map.moveCamera(\n {\n target: nextState.currentPosition,\n zoom: optionsRef.current.followZoom ?? 17,\n bearing: angle,\n },\n optionsRef.current.updateIntervalMs ?? 100\n );\n }\n\n return nextState;\n },\n [\n durationSeconds,\n map,\n normalizedPath,\n publishState,\n totalDistance,\n ]\n );\n\n const runPlaybackTick = React.useCallback(async () => {\n const elapsedMs = Date.now() - startAtRef.current + elapsedBeforePauseRef.current;\n const progress = durationSeconds <= 0 ? 1 : elapsedMs / (durationSeconds * 1000);\n\n if (progress >= 1) {\n stopTimer();\n elapsedBeforePauseRef.current = 0;\n startAtRef.current = 0;\n const completedState = await syncProgress(1, false);\n optionsRef.current.onComplete?.(completedState);\n return;\n }\n\n await syncProgress(progress, true);\n }, [durationSeconds, stopTimer, syncProgress]);\n\n const startTimer = React.useCallback(() => {\n stopTimer();\n const interval = Math.max(optionsRef.current.updateIntervalMs ?? 100, 16);\n timerRef.current = setInterval(() => {\n void runPlaybackTick();\n }, interval);\n }, [runPlaybackTick, stopTimer]);\n\n const stop = React.useCallback(() => {\n stopTimer();\n elapsedBeforePauseRef.current = 0;\n startAtRef.current = 0;\n lastAngleRef.current = 0;\n publishState({\n ...DEFAULT_STATE,\n currentPosition: normalizedPath[0] ?? null,\n totalDistance,\n durationSeconds,\n });\n }, [durationSeconds, normalizedPath, publishState, stopTimer, totalDistance]);\n\n const start = React.useCallback(async () => {\n stopTimer();\n elapsedBeforePauseRef.current = 0;\n startAtRef.current = Date.now();\n lastAngleRef.current = 0;\n\n if (optionsRef.current.autoFit === true && map && normalizedPath.length > 0) {\n await fitCameraToCoordinates(map, normalizedPath, optionsRef.current.fitOptions);\n }\n\n await syncProgress(0, true);\n startTimer();\n }, [\n map,\n normalizedPath,\n startTimer,\n syncProgress,\n ]);\n\n const pause = React.useCallback(() => {\n if (!timerRef.current || durationSeconds <= 0) {\n return;\n }\n\n stopTimer();\n elapsedBeforePauseRef.current += Date.now() - startAtRef.current;\n startAtRef.current = 0;\n const currentState = stateRef.current;\n publishState({\n ...currentState,\n isPlaying: false,\n isPaused: true,\n smoothMovePath: undefined,\n smoothMoveDuration: undefined,\n });\n }, [durationSeconds, publishState, stopTimer]);\n\n const resume = React.useCallback(async () => {\n const currentState = stateRef.current;\n if (currentState.progress >= 1) {\n await start();\n return;\n }\n\n startAtRef.current = Date.now();\n publishState({\n ...currentState,\n isPlaying: true,\n isPaused: false,\n smoothMovePath: normalizedPath,\n smoothMoveDuration: durationSeconds,\n });\n startTimer();\n }, [\n durationSeconds,\n normalizedPath,\n publishState,\n start,\n startTimer,\n ]);\n\n const seek = React.useCallback(\n (progress: number) => {\n // seek 只重算“已经播放过的时间”,其余状态由 syncProgress 统一刷新。\n const clamped = Math.max(0, Math.min(1, progress));\n elapsedBeforePauseRef.current = clamped * durationSeconds * 1000;\n startAtRef.current = Date.now();\n void syncProgress(clamped, !!timerRef.current);\n },\n [durationSeconds, syncProgress]\n );\n\n const setSpeedMultiplier = React.useCallback((multiplier: number) => {\n setSpeedMultiplierState(Math.max(multiplier, 0.1));\n }, []);\n\n React.useEffect(() => () => stopTimer(), [stopTimer]);\n\n React.useEffect(() => {\n const pathChanged = previousPathRef.current !== normalizedPath;\n const durationChanged =\n previousDurationRef.current !== null && previousDurationRef.current !== durationSeconds;\n\n previousPathRef.current = normalizedPath;\n previousDurationRef.current = durationSeconds;\n\n if (pathChanged) {\n stopTimer();\n elapsedBeforePauseRef.current = 0;\n startAtRef.current = 0;\n lastAngleRef.current = 0;\n publishState({\n ...DEFAULT_STATE,\n currentPosition: normalizedPath[0] ?? null,\n totalDistance,\n durationSeconds,\n });\n return;\n }\n\n if (!durationChanged) {\n return;\n }\n\n const currentState = stateRef.current;\n\n if (currentState.isPlaying) {\n elapsedBeforePauseRef.current = currentState.progress * durationSeconds * 1000;\n startAtRef.current = Date.now();\n publishState({\n ...currentState,\n totalDistance,\n durationSeconds,\n smoothMoveDuration: durationSeconds,\n });\n startTimer();\n return;\n }\n\n if (currentState.isPaused) {\n elapsedBeforePauseRef.current = currentState.progress * durationSeconds * 1000;\n startAtRef.current = 0;\n publishState({\n ...currentState,\n totalDistance,\n durationSeconds,\n });\n return;\n }\n\n publishState({\n ...currentState,\n currentPosition:\n currentState.progress > 0 ? currentState.currentPosition : normalizedPath[0] ?? null,\n totalDistance,\n durationSeconds,\n });\n }, [durationSeconds, normalizedPath, publishState, startTimer, stopTimer, totalDistance]);\n\n return {\n ...state,\n totalDistance,\n durationSeconds,\n start: () => {\n void start();\n },\n pause,\n resume: () => {\n void resume();\n },\n stop,\n seek,\n setSpeedMultiplier,\n };\n}\n"]}
1
+ {"version":3,"file":"useRoutePlayback.js","sourceRoot":"","sources":["../../src/hooks/useRoutePlayback.ts"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport ExpoGaodeMapModule from '../ExpoGaodeMapModule';\nimport { MapContext } from '../components/MapContext';\nimport type { LatLng } from '../types/common.types';\nimport type {\n RoutePlaybackController,\n RoutePlaybackOptions,\n RoutePlaybackState,\n} from '../types/route-playback.types';\nimport { normalizeLatLngList } from '../utils/GeoUtils';\nimport { fitCameraToCoordinates } from '../utils/RouteUtils';\n\nconst DEFAULT_STATE: RoutePlaybackState = {\n isPlaying: false,\n isPaused: false,\n progress: 0,\n currentPosition: null,\n currentAngle: 0,\n totalDistance: 0,\n traveledDistance: 0,\n durationSeconds: 0,\n};\n\n\n/**\n * 获取标记角度\n * @param path 路径点\n * @param totalDistance 总距离\n * @param targetDistance 目标距离\n * @param lastAngle 上一个角度\n * @param options 回放选项\n * @returns 角度和点\n */\nfunction getMarkerAngle(\n path: LatLng[],\n totalDistance: number,\n targetDistance: number,\n lastAngle: number,\n options: RoutePlaybackOptions\n): { angle: number; point: LatLng | null } {\n // 先取当前距离上的点,再额外预读一个前瞻点,\n // 让车辆朝向在转弯时更自然,不会出现生硬折角。\n const pointInfo = ExpoGaodeMapModule.getPointAtDistance(path, targetDistance);\n if (!pointInfo) {\n return { angle: lastAngle, point: null };\n }\n\n const lookAheadDistance = options.lookAheadDistanceMeters ?? 5;\n const futurePoint = ExpoGaodeMapModule.getPointAtDistance(\n path,\n Math.min(totalDistance, targetDistance + lookAheadDistance)\n );\n\n let targetAngle = pointInfo.angle;\n if (futurePoint && targetDistance + lookAheadDistance < totalDistance) {\n let diffNext = futurePoint.angle - pointInfo.angle;\n if (diffNext > 180) diffNext -= 360;\n if (diffNext < -180) diffNext += 360;\n targetAngle = pointInfo.angle + diffNext * 0.4;\n }\n\n let diff = targetAngle - lastAngle;\n if (diff > 180) diff -= 360;\n if (diff < -180) diff += 360;\n\n const bearingSmoothing = options.bearingSmoothing ?? 0.2;\n return {\n angle: lastAngle + diff * bearingSmoothing,\n point: {\n latitude: pointInfo.latitude,\n longitude: pointInfo.longitude,\n },\n };\n}\n\n/**\n * 路由回放\n * @param points 路径点\n * @param options 回放选项\n * @returns 回放控制器\n */\nexport function useRoutePlayback(\n points: Array<LatLng | [number, number] | number[]>,\n options: RoutePlaybackOptions = {}\n): RoutePlaybackController {\n const map = React.useContext(MapContext);\n const optionsRef = React.useRef(options);\n const [state, setState] = React.useState<RoutePlaybackState>(DEFAULT_STATE);\n const stateRef = React.useRef<RoutePlaybackState>(DEFAULT_STATE);\n const [speedMultiplier, setSpeedMultiplierState] = React.useState(options.speedMultiplier ?? 1);\n const timerRef = React.useRef<ReturnType<typeof setInterval> | null>(null);\n const startAtRef = React.useRef(0);\n const elapsedBeforePauseRef = React.useRef(0);\n const lastAngleRef = React.useRef(0);\n const previousPathRef = React.useRef<LatLng[] | null>(null);\n const previousDurationRef = React.useRef<number | null>(null);\n\n React.useEffect(() => {\n optionsRef.current = options;\n }, [options]);\n\n const emitProgress = React.useEffectEvent((nextState: RoutePlaybackState) => {\n options.onProgress?.(nextState);\n });\n\n const emitComplete = React.useEffectEvent((nextState: RoutePlaybackState) => {\n options.onComplete?.(nextState);\n });\n\n const normalizedPath = React.useMemo(() => {\n // 长路径可选走一次抽稀,减少轨迹回放期间的计算量。\n const normalized = normalizeLatLngList(points) as LatLng[];\n if (normalized.length <= 2 || !options.simplificationTolerance) {\n return normalized;\n }\n return ExpoGaodeMapModule.simplifyPolyline(normalized, options.simplificationTolerance);\n }, [options.simplificationTolerance, points]);\n\n const totalDistance = React.useMemo(\n () => ExpoGaodeMapModule.calculatePathLength(normalizedPath),\n [normalizedPath]\n );\n\n const durationSeconds = React.useMemo(() => {\n if (options.durationSeconds) {\n return options.durationSeconds;\n }\n\n const baseSpeed = options.baseSpeedMps ?? 15;\n const minDuration = options.minDurationSeconds ?? 5;\n if (totalDistance <= 0) {\n return 0;\n }\n\n return Math.max(minDuration, totalDistance / (baseSpeed * Math.max(speedMultiplier, 0.1)));\n }, [\n options.baseSpeedMps,\n options.durationSeconds,\n options.minDurationSeconds,\n speedMultiplier,\n totalDistance,\n ]);\n\n const stopTimer = React.useCallback(() => {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const publishState = React.useCallback(\n (nextState: RoutePlaybackState) => {\n // 统一从这里下发状态,避免不同控制分支各自维护回调时机。\n stateRef.current = nextState;\n setState(nextState);\n emitProgress(nextState);\n },\n []\n );\n\n const syncProgress = React.useCallback(\n async (progress: number, keepPlaying: boolean) => {\n // 根据“当前进度 -> 已行驶距离 -> 路径上的点”推导出车辆位置,\n // 再同步决定 smoothMovePath / 相机跟随 / 对外状态。\n if (normalizedPath.length === 0 || totalDistance <= 0 || durationSeconds <= 0) {\n const nextState = {\n ...DEFAULT_STATE,\n currentPosition: normalizedPath[0] ?? null,\n totalDistance,\n durationSeconds,\n };\n publishState(nextState);\n return nextState;\n }\n\n const clampedProgress = Math.max(0, Math.min(1, progress));\n const traveledDistance = totalDistance * clampedProgress;\n const { angle, point } = getMarkerAngle(\n normalizedPath,\n totalDistance,\n traveledDistance,\n lastAngleRef.current,\n optionsRef.current\n );\n lastAngleRef.current = angle;\n\n const nextState: RoutePlaybackState = {\n isPlaying: keepPlaying,\n isPaused: !keepPlaying && clampedProgress > 0 && clampedProgress < 1,\n progress: clampedProgress,\n currentPosition: point ?? normalizedPath[0] ?? null,\n currentAngle: angle,\n totalDistance,\n traveledDistance,\n durationSeconds,\n smoothMovePath: keepPlaying ? normalizedPath : undefined,\n smoothMoveDuration: keepPlaying ? durationSeconds : undefined,\n };\n\n publishState(nextState);\n\n if (optionsRef.current.followCamera === true && nextState.currentPosition && map) {\n await map.moveCamera(\n {\n target: nextState.currentPosition,\n zoom: optionsRef.current.followZoom ?? 17,\n bearing: angle,\n },\n optionsRef.current.updateIntervalMs ?? 100\n );\n }\n\n return nextState;\n },\n [\n durationSeconds,\n map,\n normalizedPath,\n publishState,\n totalDistance,\n ]\n );\n\n const runPlaybackTick = React.useCallback(async () => {\n const elapsedMs = Date.now() - startAtRef.current + elapsedBeforePauseRef.current;\n const progress = durationSeconds <= 0 ? 1 : elapsedMs / (durationSeconds * 1000);\n\n if (progress >= 1) {\n stopTimer();\n elapsedBeforePauseRef.current = 0;\n startAtRef.current = 0;\n const completedState = await syncProgress(1, false);\n emitComplete(completedState);\n return;\n }\n\n await syncProgress(progress, true);\n }, [durationSeconds, stopTimer, syncProgress]);\n\n const startTimer = React.useCallback(() => {\n stopTimer();\n const interval = Math.max(optionsRef.current.updateIntervalMs ?? 100, 16);\n timerRef.current = setInterval(() => {\n void runPlaybackTick();\n }, interval);\n }, [runPlaybackTick, stopTimer]);\n\n const stop = React.useCallback(() => {\n stopTimer();\n elapsedBeforePauseRef.current = 0;\n startAtRef.current = 0;\n lastAngleRef.current = 0;\n publishState({\n ...DEFAULT_STATE,\n currentPosition: normalizedPath[0] ?? null,\n totalDistance,\n durationSeconds,\n });\n }, [durationSeconds, normalizedPath, publishState, stopTimer, totalDistance]);\n\n const start = React.useCallback(async () => {\n stopTimer();\n elapsedBeforePauseRef.current = 0;\n startAtRef.current = Date.now();\n lastAngleRef.current = 0;\n\n if (optionsRef.current.autoFit === true && map && normalizedPath.length > 0) {\n await fitCameraToCoordinates(map, normalizedPath, optionsRef.current.fitOptions);\n }\n\n await syncProgress(0, true);\n startTimer();\n }, [\n map,\n normalizedPath,\n startTimer,\n syncProgress,\n ]);\n\n const pause = React.useCallback(() => {\n if (!timerRef.current || durationSeconds <= 0) {\n return;\n }\n\n stopTimer();\n elapsedBeforePauseRef.current += Date.now() - startAtRef.current;\n startAtRef.current = 0;\n const currentState = stateRef.current;\n publishState({\n ...currentState,\n isPlaying: false,\n isPaused: true,\n smoothMovePath: undefined,\n smoothMoveDuration: undefined,\n });\n }, [durationSeconds, publishState, stopTimer]);\n\n const resume = React.useCallback(async () => {\n const currentState = stateRef.current;\n if (currentState.progress >= 1) {\n await start();\n return;\n }\n\n startAtRef.current = Date.now();\n publishState({\n ...currentState,\n isPlaying: true,\n isPaused: false,\n smoothMovePath: normalizedPath,\n smoothMoveDuration: durationSeconds,\n });\n startTimer();\n }, [\n durationSeconds,\n normalizedPath,\n publishState,\n start,\n startTimer,\n ]);\n\n const seek = React.useCallback(\n (progress: number) => {\n // seek 只重算“已经播放过的时间”,其余状态由 syncProgress 统一刷新。\n const clamped = Math.max(0, Math.min(1, progress));\n elapsedBeforePauseRef.current = clamped * durationSeconds * 1000;\n startAtRef.current = Date.now();\n void syncProgress(clamped, !!timerRef.current);\n },\n [durationSeconds, syncProgress]\n );\n\n const setSpeedMultiplier = React.useCallback((multiplier: number) => {\n setSpeedMultiplierState(Math.max(multiplier, 0.1));\n }, []);\n\n React.useEffect(() => () => stopTimer(), [stopTimer]);\n\n React.useEffect(() => {\n const pathChanged = previousPathRef.current !== normalizedPath;\n const durationChanged =\n previousDurationRef.current !== null && previousDurationRef.current !== durationSeconds;\n\n previousPathRef.current = normalizedPath;\n previousDurationRef.current = durationSeconds;\n\n if (pathChanged) {\n stopTimer();\n elapsedBeforePauseRef.current = 0;\n startAtRef.current = 0;\n lastAngleRef.current = 0;\n publishState({\n ...DEFAULT_STATE,\n currentPosition: normalizedPath[0] ?? null,\n totalDistance,\n durationSeconds,\n });\n return;\n }\n\n if (!durationChanged) {\n return;\n }\n\n const currentState = stateRef.current;\n\n if (currentState.isPlaying) {\n elapsedBeforePauseRef.current = currentState.progress * durationSeconds * 1000;\n startAtRef.current = Date.now();\n publishState({\n ...currentState,\n totalDistance,\n durationSeconds,\n smoothMoveDuration: durationSeconds,\n });\n startTimer();\n return;\n }\n\n if (currentState.isPaused) {\n elapsedBeforePauseRef.current = currentState.progress * durationSeconds * 1000;\n startAtRef.current = 0;\n publishState({\n ...currentState,\n totalDistance,\n durationSeconds,\n });\n return;\n }\n\n publishState({\n ...currentState,\n currentPosition:\n currentState.progress > 0 ? currentState.currentPosition : normalizedPath[0] ?? null,\n totalDistance,\n durationSeconds,\n });\n }, [durationSeconds, normalizedPath, publishState, startTimer, stopTimer, totalDistance]);\n\n return {\n ...state,\n totalDistance,\n durationSeconds,\n start: () => {\n void start();\n },\n pause,\n resume: () => {\n void resume();\n },\n stop,\n seek,\n setSpeedMultiplier,\n };\n}\n"]}
@@ -1,3 +1,6 @@
1
+ /**
2
+ * 几何模块
3
+ */
1
4
  import type { LatLng, LatLngPoint } from '../types';
2
5
  export declare const geometryMethods: {
3
6
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/module/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAKpD,eAAO,MAAM,eAAe;IAG1B;;;;;OAKG;4CACqC,WAAW,eAAe,WAAW,GAAG,MAAM;IActF;;;;;OAKG;6BAEO,WAAW,EAAE,YACZ;QACP,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GACA,MAAM;IA0BT;;;;;;OAMG;2BACoB,WAAW,UAAU,WAAW,UAAU,MAAM,GAAG,OAAO;IAejF;;;;;OAKG;4BACqB,WAAW,WAAW,WAAW,EAAE,GAAG,WAAW,EAAE,EAAE,GAAG,OAAO;IAcvF;;;;OAIG;kCAC2B,WAAW,EAAE,GAAG,WAAW,EAAE,EAAE,GAAG,MAAM;IAWtE;;;;;OAKG;sCAC+B,WAAW,aAAa,WAAW,GAAG,MAAM;IAc9E;;;;;OAKG;gCACyB,WAAW,EAAE,UAAU,WAAW,GAAG;QAC/D,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,IAAI;IAcR;;;;OAIG;+BACwB,WAAW,EAAE,GAAG,WAAW,EAAE,EAAE,GAAG,MAAM,GAAG,IAAI;IAW1E;;;;OAIG;gCACyB,WAAW,EAAE,GAAG;QAC1C,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,WAAW,CAAC;KACrB,GAAG,IAAI;IAYR;;;;;OAKG;8BACuB,WAAW,aAAa,MAAM,GAAG,MAAM;IAWjE;;;;;OAKG;6BACsB,WAAW,EAAE,aAAa,MAAM,GAAG,MAAM,EAAE;IAWpE;;;;OAIG;gCACyB,WAAW,EAAE,GAAG,MAAM;IAUlD;;;;;OAKG;+BACwB,MAAM,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,EAAE;IAmBnE;;;;;OAKG;+BACwB,WAAW,EAAE,YAAY,MAAM,GAAG;QAC3D,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,IAAI;IAWR;;;;;OAKG;6BACsB,WAAW,QAAQ,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAU/F;;;;OAIG;uBACgB;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,GAAG,IAAI;IAUtE;;;;;OAKG;8BACuB,WAAW,QAAQ,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAUrF;;;;;OAKG;yBACkB;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,QAAQ,MAAM,GAAG,MAAM,GAAG,IAAI;IAU3E;;;;;OAKG;+BACwB,WAAW,YAAY,WAAW,EAAE,EAAE,GAAG,WAAW,EAAE,EAAE,EAAE,GAAG,MAAM;IA6B9F;;;;;OAKG;gCAEO,KAAK,CAAC,WAAW,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,kBAChC,MAAM,GACrB,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CASrE,CAAC"}
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/module/geometry.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,6 @@
1
+ /**
2
+ * 几何模块
3
+ */
1
4
  import { ErrorHandler, ErrorLogger } from '../utils/ErrorHandler';
2
5
  import { normalizeLatLng, normalizeLatLngList } from '../utils/GeoUtils';
3
6
  import { nativeModule } from './nativeModule';
@@ -1 +1 @@
1
- {"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/module/geometry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,MAAM,eAAe,GAAG;IAG7B;;;;;OAKG;IACH,0BAA0B,CAAC,WAAwB,EAAE,WAAwB;QAC3E,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,YAAY,CAAC,uBAAuB,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,0BAA0B,CAC5C,eAAe,CAAC,WAAW,CAAC,EAC5B,eAAe,CAAC,WAAW,CAAC,CAC7B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,gBAAgB,CACd,MAAqB,EACrB,UAMI,EAAE;QAEN,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,YAAY,CAAC,uBAAuB,EAAE,CAAC;QAC/C,CAAC;QAED,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACtC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,gBAAgB,CAClC,UAAU,EACV,OAAO,CAAC,eAAe,IAAI,GAAG,EAC9B,OAAO,CAAC,gBAAgB,IAAI,GAAG,EAC/B,OAAO,CAAC,SAAS,IAAI,EAAE,EACvB,OAAO,EACP,OAAO,CACR,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,CAAC,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,eAAe,CAAC,KAAkB,EAAE,MAAmB,EAAE,MAAc;QACrE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,YAAY,CAAC,uBAAuB,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,eAAe,CACjC,eAAe,CAAC,KAAK,CAAC,EACtB,eAAe,CAAC,MAAM,CAAC,EACvB,MAAM,CACP,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,CAAC,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,KAAkB,EAAE,OAAwC;QAC3E,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,YAAY,CAAC,uBAAuB,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,gBAAgB,CAClC,eAAe,CAAC,KAAK,CAAC,EACtB,mBAAmB,CAAC,OAAO,CAAC,CAC7B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,CAAC,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,oBAAoB,CAAC,OAAwC;QAC3D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,YAAY,CAAC,uBAAuB,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,sBAAsB,CAAC,SAAsB,EAAE,SAAsB;QACnE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,YAAY,CAAC,uBAAuB,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,sBAAsB,CACxC,eAAe,CAAC,SAAS,CAAC,EAC1B,eAAe,CAAC,SAAS,CAAC,CAC3B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,qBAAqB,CAAC,IAAmB,EAAE,MAAmB;QAM5D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,YAAY,CAAC,uBAAuB,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,qBAAqB,CACvC,mBAAmB,CAAC,IAAI,CAAC,EACzB,eAAe,CAAC,MAAM,CAAC,CACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,OAAwC;QACxD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,YAAY,CAAC,uBAAuB,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,mBAAmB,CAAC,MAAqB;QAOvC,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YACzC,OAAO,YAAY,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAClF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,UAAuB,EAAE,SAAiB;QACtD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,YAAY,CAAC,uBAAuB,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,CAAC,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,MAAqB,EAAE,SAAiB;QACvD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,YAAY,CAAC,uBAAuB,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,mBAAmB,CAAC,MAAqB;QACvC,IAAI,CAAC,YAAY;YAAE,OAAO,CAAC,CAAC;QAC5B,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAClF,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,WAA0C;QACtD,IAAI,CAAC,YAAY,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,6CAA6C;YAC7C,IAAI,QAAQ,GAAW,EAAE,CAAC;YAC1B,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI,IAAI,UAAU,IAAI,WAAW,EAAE,CAAC;gBACzF,QAAQ,GAAG,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAC;YACxC,CAAC;iBAAM,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;gBAC3C,QAAQ,GAAG,WAAW,CAAC;YACzB,CAAC;YAED,IAAI,CAAC,QAAQ;gBAAE,OAAO,EAAE,CAAC;YACzB,OAAO,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3D,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,MAAqB,EAAE,QAAgB;QAKxD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,YAAY,CAAC,uBAAuB,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC;QAChF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,UAAuB,EAAE,IAAY;QAChD,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAC/B,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,YAAY,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,IAAyC;QACpD,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAC/B,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,UAAuB,EAAE,IAAY;QACjD,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAC/B,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,KAA+B,EAAE,IAAY;QACzD,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAC/B,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,mBAAmB,CAAC,KAAkB,EAAE,QAA6C;QACnF,IAAI,CAAC,YAAY;YAAE,OAAO,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YAE/C,qDAAqD;YACrD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,MAAM,uBAAuB,GAAI,QAA8B,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CACnF,mBAAmB,CAAC,YAAY,CAAC,CAClC,CAAC;gBAEF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,uBAAuB,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;oBACvE,IAAI,YAAY,CAAC,gBAAgB,CAAC,eAAe,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;wBACnF,OAAO,KAAK,CAAC;oBACf,CAAC;gBACH,CAAC;gBAED,OAAO,CAAC,CAAC,CAAC;YACZ,CAAC;YAED,MAAM,kBAAkB,GAAG,QAA2B,CAAC;YACvD,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;YAChF,OAAO,YAAY,CAAC,mBAAmB,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QAC9E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,mBAAmB,CACjB,MAAgD,EAChD,cAAsB;QAEtB,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,mBAAmB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;YAClG,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import type { LatLng, LatLngPoint } from '../types';\nimport { ErrorHandler, ErrorLogger } from '../utils/ErrorHandler';\nimport { normalizeLatLng, normalizeLatLngList } from '../utils/GeoUtils';\nimport { nativeModule } from './nativeModule';\n\nexport const geometryMethods = {\n\n\n /**\n * 计算两个坐标点之间的距离\n * @param coordinate1 第一个坐标点\n * @param coordinate2 第二个坐标点\n * @returns 两点之间的距离(单位:米)\n */\n distanceBetweenCoordinates(coordinate1: LatLngPoint, coordinate2: LatLngPoint): number {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.distanceBetweenCoordinates(\n normalizeLatLng(coordinate1),\n normalizeLatLng(coordinate2)\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '计算距离');\n }\n },\n\n /**\n * 根据多个坐标点计算可同时可见的推荐缩放级别\n * @param points 坐标点集合(至少 1 个)\n * @param options 视口与缩放边界选项\n * @returns 推荐 zoom\n */\n calculateFitZoom(\n points: LatLngPoint[],\n options: {\n viewportWidthPx?: number;\n viewportHeightPx?: number;\n paddingPx?: number;\n minZoom?: number;\n maxZoom?: number;\n } = {}\n ): number {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n\n const normalized = normalizeLatLngList(points);\n const minZoom = options.minZoom ?? 3;\n const maxZoom = options.maxZoom ?? 20;\n if (normalized.length === 0) {\n return minZoom;\n }\n\n try {\n return nativeModule.calculateFitZoom(\n normalized,\n options.viewportWidthPx ?? 390,\n options.viewportHeightPx ?? 844,\n options.paddingPx ?? 48,\n minZoom,\n maxZoom\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '计算拟合缩放级别');\n }\n },\n\n /**\n * 判断点是否在圆内\n * @param point 要判断的点\n * @param center 圆心坐标\n * @param radius 圆半径(单位:米)\n * @returns 是否在圆内\n */\n isPointInCircle(point: LatLngPoint, center: LatLngPoint, radius: number): boolean {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.isPointInCircle(\n normalizeLatLng(point),\n normalizeLatLng(center),\n radius\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '判断点是否在圆内');\n }\n },\n\n /**\n * 判断点是否在多边形内\n * @param point 要判断的点\n * @param polygon 多边形的顶点坐标数组,支持嵌套数组(多边形空洞)\n * @returns 是否在多边形内\n */\n isPointInPolygon(point: LatLngPoint, polygon: LatLngPoint[] | LatLngPoint[][]): boolean {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.isPointInPolygon(\n normalizeLatLng(point),\n normalizeLatLngList(polygon)\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '判断点是否在多边形内');\n }\n },\n\n /**\n * 计算多边形面积\n * @param polygon 多边形的顶点坐标数组,支持嵌套数组(多边形空洞)\n * @returns 面积(单位:平方米)\n */\n calculatePolygonArea(polygon: LatLngPoint[] | LatLngPoint[][]): number {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.calculatePolygonArea(normalizeLatLngList(polygon));\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '计算多边形面积');\n }\n },\n\n /**\n * 计算矩形面积\n * @param southWest 西南角坐标\n * @param northEast 东北角坐标\n * @returns 面积(单位:平方米)\n */\n calculateRectangleArea(southWest: LatLngPoint, northEast: LatLngPoint): number {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.calculateRectangleArea(\n normalizeLatLng(southWest),\n normalizeLatLng(northEast)\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '计算矩形面积');\n }\n },\n\n /**\n * 获取路径上距离目标点最近的点\n * @param path 路径点集合\n * @param target 目标点\n * @returns 最近点信息,包含坐标、索引和距离\n */\n getNearestPointOnPath(path: LatLngPoint[], target: LatLngPoint): {\n latitude: number;\n longitude: number;\n index: number;\n distanceMeters: number;\n } | null {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.getNearestPointOnPath(\n normalizeLatLngList(path),\n normalizeLatLng(target)\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '获取最近点');\n }\n },\n\n /**\n * 计算多边形质心\n * @param polygon 多边形顶点坐标数组,支持嵌套数组\n * @returns 质心坐标\n */\n calculateCentroid(polygon: LatLngPoint[] | LatLngPoint[][]): LatLng | null {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.calculateCentroid(normalizeLatLngList(polygon));\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '计算质心');\n }\n },\n\n /**\n * 计算路径边界和中心点\n * @param points 路径点集合\n * @returns 边界信息,包含 north, south, east, west 和 center\n */\n calculatePathBounds(points: LatLngPoint[]): {\n north: number;\n south: number;\n east: number;\n west: number;\n center: LatLngPoint;\n } | null {\n if (!nativeModule) return null;\n try {\n const normalized = normalizeLatLngList(points);\n if (normalized.length === 0) return null;\n return nativeModule.calculatePathBounds(normalized);\n } catch (error) {\n ErrorLogger.warn('calculatePathBounds 失败', { pointsCount: points.length, error });\n return null;\n }\n },\n\n /**\n * GeoHash 编码\n * @param coordinate 坐标点\n * @param precision 精度 (1-12)\n * @returns GeoHash 字符串\n */\n encodeGeoHash(coordinate: LatLngPoint, precision: number): string {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.encodeGeoHash(normalizeLatLng(coordinate), precision);\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, 'GeoHash 编码');\n }\n },\n\n /**\n * 轨迹抽稀 (RDP 算法)\n * @param points 原始轨迹点\n * @param tolerance 允许误差(米)\n * @returns 简化后的轨迹点\n */\n simplifyPolyline(points: LatLngPoint[], tolerance: number): LatLng[] {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.simplifyPolyline(normalizeLatLngList(points), tolerance);\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '轨迹抽稀');\n }\n },\n\n /**\n * 计算路径总长度\n * @param points 路径点\n * @returns 长度(米)\n */\n calculatePathLength(points: LatLngPoint[]): number {\n if (!nativeModule) return 0;\n try {\n return nativeModule.calculatePathLength(normalizeLatLngList(points));\n } catch (error) {\n ErrorLogger.warn('calculatePathLength 失败', { pointsCount: points.length, error });\n return 0;\n }\n },\n\n /**\n * 解析高德地图 API 返回的 Polyline 字符串\n * 格式: \"lng,lat;lng,lat;...\"\n * @param polylineStr 高德原始 polyline 字符串,或包含 polyline 属性的对象\n * @returns 解析后的点集\n */\n parsePolyline(polylineStr: string | { polyline: string }): LatLng[] {\n if (!nativeModule || !polylineStr) return [];\n try {\n // 兼容性处理:如果传入的是对象 { polyline: '...' },自动提取字符串\n let finalStr: string = '';\n if (typeof polylineStr === 'object' && polylineStr !== null && 'polyline' in polylineStr) {\n finalStr = polylineStr.polyline || '';\n } else if (typeof polylineStr === 'string') {\n finalStr = polylineStr;\n }\n\n if (!finalStr) return [];\n return nativeModule.parsePolyline(finalStr);\n } catch (error) {\n ErrorLogger.warn('解析 Polyline 失败', { polylineStr, error });\n return [];\n }\n },\n\n /**\n * 获取路径上指定距离的点\n * @param points 路径点\n * @param distance 距离起点的米数\n * @returns 点信息(坐标+角度)\n */\n getPointAtDistance(points: LatLngPoint[], distance: number): {\n latitude: number;\n longitude: number;\n angle: number;\n } | null {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.getPointAtDistance(normalizeLatLngList(points), distance);\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '获取路径上的点');\n }\n },\n\n /**\n * 经纬度转换为地图瓦片坐标\n * @param coordinate 经纬度点\n * @param zoom 缩放级别\n * @returns 瓦片坐标(x, y, z)\n */\n latLngToTile(coordinate: LatLngPoint, zoom: number): { x: number; y: number; z: number } | null {\n if (!nativeModule) return null;\n try {\n return nativeModule.latLngToTile(normalizeLatLng(coordinate), zoom);\n } catch (error) {\n ErrorLogger.warn('latLngToTile 失败', { coordinate, zoom, error });\n return null;\n }\n },\n\n /**\n * 地图瓦片坐标转换为经纬度\n * @param tile 瓦片坐标(x, y, z)\n * @returns 经纬度点\n */\n tileToLatLng(tile: { x: number; y: number; z: number }): LatLng | null {\n if (!nativeModule) return null;\n try {\n return nativeModule.tileToLatLng(tile);\n } catch (error) {\n ErrorLogger.warn('tileToLatLng 失败', { tile, error });\n return null;\n }\n },\n\n /**\n * 经纬度转换为地图像素坐标\n * @param coordinate 经纬度点\n * @param zoom 缩放级别\n * @returns 像素坐标(x, y)\n */\n latLngToPixel(coordinate: LatLngPoint, zoom: number): { x: number; y: number } | null {\n if (!nativeModule) return null;\n try {\n return nativeModule.latLngToPixel(normalizeLatLng(coordinate), zoom);\n } catch (error) {\n ErrorLogger.warn('latLngToPixel 失败', { coordinate, zoom, error });\n return null;\n }\n },\n\n /**\n * 地图像素坐标转换为经纬度\n * @param pixel 像素坐标(x, y)\n * @param zoom 缩放级别\n * @returns 经纬度点\n */\n pixelToLatLng(pixel: { x: number; y: number }, zoom: number): LatLng | null {\n if (!nativeModule) return null;\n try {\n return nativeModule.pixelToLatLng(pixel, zoom);\n } catch (error) {\n ErrorLogger.warn('pixelToLatLng 失败', { pixel, zoom, error });\n return null;\n }\n },\n\n /**\n * 批量地理围栏检测\n * @param point 待检查的点\n * @param polygons 多边形数组,格式为 LatLngPoint[][] 或 LatLngPoint[][][]\n * @returns 包含点索引的数组(-1 表示不在任何多边形内)\n */\n findPointInPolygons(point: LatLngPoint, polygons: LatLngPoint[][] | LatLngPoint[][][]): number {\n if (!nativeModule) return -1;\n try {\n const normalizedPoint = normalizeLatLng(point);\n\n // 处理三维数组 (LatLngPoint[][][]) 和二维数组 (LatLngPoint[][])\n if (Array.isArray(polygons[0]) && Array.isArray(polygons[0][0])) {\n const normalizedMultiPolygons = (polygons as LatLngPoint[][][]).map((polygonRings) =>\n normalizeLatLngList(polygonRings)\n );\n\n for (let index = 0; index < normalizedMultiPolygons.length; index += 1) {\n if (nativeModule.isPointInPolygon(normalizedPoint, normalizedMultiPolygons[index])) {\n return index;\n }\n }\n\n return -1;\n }\n\n const normalizedPolygons = polygons as LatLngPoint[][];\n const processedPolygons = normalizedPolygons.map((p) => normalizeLatLngList(p));\n return nativeModule.findPointInPolygons(normalizedPoint, processedPolygons);\n } catch (error) {\n ErrorLogger.warn('findPointInPolygons 失败', { point, error });\n return -1;\n }\n },\n\n /**\n * 生成网格聚合数据 (常用于展示网格聚合图或大规模点数据处理)\n * @param points 包含经纬度和权重的点数组\n * @param gridSizeMeters 网格大小(米)\n * @returns 包含经纬度和强度的网格点数组\n */\n generateHeatmapGrid(\n points: Array<LatLngPoint & { weight?: number }>,\n gridSizeMeters: number\n ): Array<{ latitude: number; longitude: number; intensity: number }> {\n if (!nativeModule || points.length === 0) return [];\n try {\n return nativeModule.generateHeatmapGrid(points, gridSizeMeters);\n } catch (error) {\n ErrorLogger.warn('generateHeatmapGrid 失败', { pointsCount: points.length, gridSizeMeters, error });\n return [];\n }\n },\n};\n"]}
1
+ {"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/module/geometry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 几何模块\n */\n\nimport type { LatLng, LatLngPoint } from '../types';\nimport { ErrorHandler, ErrorLogger } from '../utils/ErrorHandler';\nimport { normalizeLatLng, normalizeLatLngList } from '../utils/GeoUtils';\nimport { nativeModule } from './nativeModule';\n\nexport const geometryMethods = {\n\n /**\n * 计算两个坐标点之间的距离\n * @param coordinate1 第一个坐标点\n * @param coordinate2 第二个坐标点\n * @returns 两点之间的距离(单位:米)\n */\n distanceBetweenCoordinates(coordinate1: LatLngPoint, coordinate2: LatLngPoint): number {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.distanceBetweenCoordinates(\n normalizeLatLng(coordinate1),\n normalizeLatLng(coordinate2)\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '计算距离');\n }\n },\n\n /**\n * 根据多个坐标点计算可同时可见的推荐缩放级别\n * @param points 坐标点集合(至少 1 个)\n * @param options 视口与缩放边界选项\n * @returns 推荐 zoom\n */\n calculateFitZoom(\n points: LatLngPoint[],\n options: {\n viewportWidthPx?: number;\n viewportHeightPx?: number;\n paddingPx?: number;\n minZoom?: number;\n maxZoom?: number;\n } = {}\n ): number {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n\n const normalized = normalizeLatLngList(points);\n const minZoom = options.minZoom ?? 3;\n const maxZoom = options.maxZoom ?? 20;\n if (normalized.length === 0) {\n return minZoom;\n }\n\n try {\n return nativeModule.calculateFitZoom(\n normalized,\n options.viewportWidthPx ?? 390,\n options.viewportHeightPx ?? 844,\n options.paddingPx ?? 48,\n minZoom,\n maxZoom\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '计算拟合缩放级别');\n }\n },\n\n /**\n * 判断点是否在圆内\n * @param point 要判断的点\n * @param center 圆心坐标\n * @param radius 圆半径(单位:米)\n * @returns 是否在圆内\n */\n isPointInCircle(point: LatLngPoint, center: LatLngPoint, radius: number): boolean {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.isPointInCircle(\n normalizeLatLng(point),\n normalizeLatLng(center),\n radius\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '判断点是否在圆内');\n }\n },\n\n /**\n * 判断点是否在多边形内\n * @param point 要判断的点\n * @param polygon 多边形的顶点坐标数组,支持嵌套数组(多边形空洞)\n * @returns 是否在多边形内\n */\n isPointInPolygon(point: LatLngPoint, polygon: LatLngPoint[] | LatLngPoint[][]): boolean {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.isPointInPolygon(\n normalizeLatLng(point),\n normalizeLatLngList(polygon)\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '判断点是否在多边形内');\n }\n },\n\n /**\n * 计算多边形面积\n * @param polygon 多边形的顶点坐标数组,支持嵌套数组(多边形空洞)\n * @returns 面积(单位:平方米)\n */\n calculatePolygonArea(polygon: LatLngPoint[] | LatLngPoint[][]): number {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.calculatePolygonArea(normalizeLatLngList(polygon));\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '计算多边形面积');\n }\n },\n\n /**\n * 计算矩形面积\n * @param southWest 西南角坐标\n * @param northEast 东北角坐标\n * @returns 面积(单位:平方米)\n */\n calculateRectangleArea(southWest: LatLngPoint, northEast: LatLngPoint): number {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.calculateRectangleArea(\n normalizeLatLng(southWest),\n normalizeLatLng(northEast)\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '计算矩形面积');\n }\n },\n\n /**\n * 获取路径上距离目标点最近的点\n * @param path 路径点集合\n * @param target 目标点\n * @returns 最近点信息,包含坐标、索引和距离\n */\n getNearestPointOnPath(path: LatLngPoint[], target: LatLngPoint): {\n latitude: number;\n longitude: number;\n index: number;\n distanceMeters: number;\n } | null {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.getNearestPointOnPath(\n normalizeLatLngList(path),\n normalizeLatLng(target)\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '获取最近点');\n }\n },\n\n /**\n * 计算多边形质心\n * @param polygon 多边形顶点坐标数组,支持嵌套数组\n * @returns 质心坐标\n */\n calculateCentroid(polygon: LatLngPoint[] | LatLngPoint[][]): LatLng | null {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.calculateCentroid(normalizeLatLngList(polygon));\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '计算质心');\n }\n },\n\n /**\n * 计算路径边界和中心点\n * @param points 路径点集合\n * @returns 边界信息,包含 north, south, east, west 和 center\n */\n calculatePathBounds(points: LatLngPoint[]): {\n north: number;\n south: number;\n east: number;\n west: number;\n center: LatLngPoint;\n } | null {\n if (!nativeModule) return null;\n try {\n const normalized = normalizeLatLngList(points);\n if (normalized.length === 0) return null;\n return nativeModule.calculatePathBounds(normalized);\n } catch (error) {\n ErrorLogger.warn('calculatePathBounds 失败', { pointsCount: points.length, error });\n return null;\n }\n },\n\n /**\n * GeoHash 编码\n * @param coordinate 坐标点\n * @param precision 精度 (1-12)\n * @returns GeoHash 字符串\n */\n encodeGeoHash(coordinate: LatLngPoint, precision: number): string {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.encodeGeoHash(normalizeLatLng(coordinate), precision);\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, 'GeoHash 编码');\n }\n },\n\n /**\n * 轨迹抽稀 (RDP 算法)\n * @param points 原始轨迹点\n * @param tolerance 允许误差(米)\n * @returns 简化后的轨迹点\n */\n simplifyPolyline(points: LatLngPoint[], tolerance: number): LatLng[] {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.simplifyPolyline(normalizeLatLngList(points), tolerance);\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '轨迹抽稀');\n }\n },\n\n /**\n * 计算路径总长度\n * @param points 路径点\n * @returns 长度(米)\n */\n calculatePathLength(points: LatLngPoint[]): number {\n if (!nativeModule) return 0;\n try {\n return nativeModule.calculatePathLength(normalizeLatLngList(points));\n } catch (error) {\n ErrorLogger.warn('calculatePathLength 失败', { pointsCount: points.length, error });\n return 0;\n }\n },\n\n /**\n * 解析高德地图 API 返回的 Polyline 字符串\n * 格式: \"lng,lat;lng,lat;...\"\n * @param polylineStr 高德原始 polyline 字符串,或包含 polyline 属性的对象\n * @returns 解析后的点集\n */\n parsePolyline(polylineStr: string | { polyline: string }): LatLng[] {\n if (!nativeModule || !polylineStr) return [];\n try {\n // 兼容性处理:如果传入的是对象 { polyline: '...' },自动提取字符串\n let finalStr: string = '';\n if (typeof polylineStr === 'object' && polylineStr !== null && 'polyline' in polylineStr) {\n finalStr = polylineStr.polyline || '';\n } else if (typeof polylineStr === 'string') {\n finalStr = polylineStr;\n }\n\n if (!finalStr) return [];\n return nativeModule.parsePolyline(finalStr);\n } catch (error) {\n ErrorLogger.warn('解析 Polyline 失败', { polylineStr, error });\n return [];\n }\n },\n\n /**\n * 获取路径上指定距离的点\n * @param points 路径点\n * @param distance 距离起点的米数\n * @returns 点信息(坐标+角度)\n */\n getPointAtDistance(points: LatLngPoint[], distance: number): {\n latitude: number;\n longitude: number;\n angle: number;\n } | null {\n if (!nativeModule) {\n throw ErrorHandler.nativeModuleUnavailable();\n }\n try {\n return nativeModule.getPointAtDistance(normalizeLatLngList(points), distance);\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, '获取路径上的点');\n }\n },\n\n /**\n * 经纬度转换为地图瓦片坐标\n * @param coordinate 经纬度点\n * @param zoom 缩放级别\n * @returns 瓦片坐标(x, y, z)\n */\n latLngToTile(coordinate: LatLngPoint, zoom: number): { x: number; y: number; z: number } | null {\n if (!nativeModule) return null;\n try {\n return nativeModule.latLngToTile(normalizeLatLng(coordinate), zoom);\n } catch (error) {\n ErrorLogger.warn('latLngToTile 失败', { coordinate, zoom, error });\n return null;\n }\n },\n\n /**\n * 地图瓦片坐标转换为经纬度\n * @param tile 瓦片坐标(x, y, z)\n * @returns 经纬度点\n */\n tileToLatLng(tile: { x: number; y: number; z: number }): LatLng | null {\n if (!nativeModule) return null;\n try {\n return nativeModule.tileToLatLng(tile);\n } catch (error) {\n ErrorLogger.warn('tileToLatLng 失败', { tile, error });\n return null;\n }\n },\n\n /**\n * 经纬度转换为地图像素坐标\n * @param coordinate 经纬度点\n * @param zoom 缩放级别\n * @returns 像素坐标(x, y)\n */\n latLngToPixel(coordinate: LatLngPoint, zoom: number): { x: number; y: number } | null {\n if (!nativeModule) return null;\n try {\n return nativeModule.latLngToPixel(normalizeLatLng(coordinate), zoom);\n } catch (error) {\n ErrorLogger.warn('latLngToPixel 失败', { coordinate, zoom, error });\n return null;\n }\n },\n\n /**\n * 地图像素坐标转换为经纬度\n * @param pixel 像素坐标(x, y)\n * @param zoom 缩放级别\n * @returns 经纬度点\n */\n pixelToLatLng(pixel: { x: number; y: number }, zoom: number): LatLng | null {\n if (!nativeModule) return null;\n try {\n return nativeModule.pixelToLatLng(pixel, zoom);\n } catch (error) {\n ErrorLogger.warn('pixelToLatLng 失败', { pixel, zoom, error });\n return null;\n }\n },\n\n /**\n * 批量地理围栏检测\n * @param point 待检查的点\n * @param polygons 多边形数组,格式为 LatLngPoint[][] 或 LatLngPoint[][][]\n * @returns 包含点索引的数组(-1 表示不在任何多边形内)\n */\n findPointInPolygons(point: LatLngPoint, polygons: LatLngPoint[][] | LatLngPoint[][][]): number {\n if (!nativeModule) return -1;\n try {\n const normalizedPoint = normalizeLatLng(point);\n\n // 处理三维数组 (LatLngPoint[][][]) 和二维数组 (LatLngPoint[][])\n if (Array.isArray(polygons[0]) && Array.isArray(polygons[0][0])) {\n const normalizedMultiPolygons = (polygons as LatLngPoint[][][]).map((polygonRings) =>\n normalizeLatLngList(polygonRings)\n );\n\n for (let index = 0; index < normalizedMultiPolygons.length; index += 1) {\n if (nativeModule.isPointInPolygon(normalizedPoint, normalizedMultiPolygons[index])) {\n return index;\n }\n }\n\n return -1;\n }\n\n const normalizedPolygons = polygons as LatLngPoint[][];\n const processedPolygons = normalizedPolygons.map((p) => normalizeLatLngList(p));\n return nativeModule.findPointInPolygons(normalizedPoint, processedPolygons);\n } catch (error) {\n ErrorLogger.warn('findPointInPolygons 失败', { point, error });\n return -1;\n }\n },\n\n /**\n * 生成网格聚合数据 (常用于展示网格聚合图或大规模点数据处理)\n * @param points 包含经纬度和权重的点数组\n * @param gridSizeMeters 网格大小(米)\n * @returns 包含经纬度和强度的网格点数组\n */\n generateHeatmapGrid(\n points: Array<LatLngPoint & { weight?: number }>,\n gridSizeMeters: number\n ): Array<{ latitude: number; longitude: number; intensity: number }> {\n if (!nativeModule || points.length === 0) return [];\n try {\n return nativeModule.generateHeatmapGrid(points, gridSizeMeters);\n } catch (error) {\n ErrorLogger.warn('generateHeatmapGrid 失败', { pointsCount: points.length, gridSizeMeters, error });\n return [];\n }\n },\n};\n"]}
@@ -1,13 +1,48 @@
1
+ /**
2
+ * 位置模块
3
+ */
1
4
  import type { Coordinates, CoordinateType, GeoLanguage, HeadingListener, LatLng, LatLngPoint, LocationListener, ReGeocode } from '../types';
2
5
  import type { PermissionStatus } from '../types/common.types';
3
6
  export declare const locationMethods: {
7
+ /**
8
+ * 开始位置更新
9
+ */
4
10
  start(): void;
11
+ /**
12
+ * 停止位置更新
13
+ */
5
14
  stop(): void;
15
+ /**
16
+ * 检查是否正在定位
17
+ * @returns 是否正在定位
18
+ */
6
19
  isStarted(): Promise<boolean>;
20
+ /**
21
+ * 获取当前位置
22
+ * @returns 当前位置
23
+ */
7
24
  getCurrentLocation(): Promise<Coordinates | ReGeocode>;
25
+ /**
26
+ * 坐标转换
27
+ * @param coordinate 坐标点
28
+ * @param type 坐标类型
29
+ * @returns 转换后的坐标
30
+ */
8
31
  coordinateConvert(coordinate: LatLngPoint, type: CoordinateType): Promise<LatLng>;
32
+ /**
33
+ * 设置语言
34
+ * @param language 语言
35
+ */
9
36
  setGeoLanguage(language: GeoLanguage | string): void;
37
+ /**
38
+ * 设置是否使用逆地理编码
39
+ * @param isReGeocode 是否使用逆地理编码
40
+ */
10
41
  setLocatingWithReGeocode(isReGeocode: boolean): void;
42
+ /**
43
+ * 检查是否已启用后台位置更新
44
+ * @returns 是否已启用后台位置更新
45
+ */
11
46
  readonly isBackgroundLocationEnabled: boolean;
12
47
  /**
13
48
  * 检查位置权限状态
@@ -27,6 +62,10 @@ export declare const locationMethods: {
27
62
  * 引导用户手动授予权限
28
63
  */
29
64
  openAppSettings(): void;
65
+ /**
66
+ * 设置是否允许后台位置更新
67
+ * @param allows 是否允许后台位置更新
68
+ */
30
69
  setAllowsBackgroundLocationUpdates(allows: boolean): void;
31
70
  /**
32
71
  * 添加定位监听器(便捷方法)
@@ -1 +1 @@
1
- {"version":3,"file":"location.d.ts","sourceRoot":"","sources":["../../src/module/location.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,eAAe,EACf,MAAM,EACN,WAAW,EACX,gBAAgB,EAChB,SAAS,EACV,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAa9D,eAAO,MAAM,eAAe;aACjB,IAAI;YAWL,IAAI;iBAWC,OAAO,CAAC,OAAO,CAAC;0BAYD,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;kCAcxB,WAAW,QAAQ,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;6BAoB9D,WAAW,GAAG,MAAM,GAAG,IAAI;0CAWd,OAAO,GAAG,IAAI;0CAWjB,OAAO;IAM1C;;OAEG;+BAC8B,OAAO,CAAC,gBAAgB,CAAC;IAa1D;;OAEG;iCACgC,OAAO,CAAC,gBAAgB,CAAC;IAiB5D;;;OAGG;2CAC0C,OAAO,CAAC,gBAAgB,CAAC;IAiBtE;;;OAGG;uBACgB,IAAI;+CAYoB,OAAO,GAAG,IAAI;IAyCzD;;;;;;OAMG;kCAC2B,gBAAgB,GAAG;QAAE,MAAM,EAAE,MAAM,IAAI,CAAA;KAAE;IAoBvE;;;OAGG;iCAC0B,eAAe,GAAG;QAAE,MAAM,EAAE,MAAM,IAAI,CAAA;KAAE;CAmBtE,CAAC"}
1
+ {"version":3,"file":"location.d.ts","sourceRoot":"","sources":["../../src/module/location.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,eAAe,EACf,MAAM,EACN,WAAW,EACX,gBAAgB,EAChB,SAAS,EACV,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAc9D,eAAO,MAAM,eAAe;IAC1B;;OAEG;aACM,IAAI;IAUb;;OAEG;YACK,IAAI;IAWZ;;;OAGG;iBACU,OAAO,CAAC,OAAO,CAAC;IAW7B;;;OAGG;0BACyB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAa5D;;;;;OAKG;kCACiC,WAAW,QAAQ,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBvF;;;OAGG;6BACsB,WAAW,GAAG,MAAM,GAAG,IAAI;IAUpD;;;OAGG;0CACmC,OAAO,GAAG,IAAI;IAUpD;;;OAGG;0CACgC,OAAO;IAM1C;;OAEG;+BAC8B,OAAO,CAAC,gBAAgB,CAAC;IAa1D;;OAEG;iCACgC,OAAO,CAAC,gBAAgB,CAAC;IAiB5D;;;OAGG;2CAC0C,OAAO,CAAC,gBAAgB,CAAC;IAiBtE;;;OAGG;uBACgB,IAAI;IAWvB;;;OAGG;+CACwC,OAAO,GAAG,IAAI;IAyCzD;;;;;;OAMG;kCAC2B,gBAAgB,GAAG;QAAE,MAAM,EAAE,MAAM,IAAI,CAAA;KAAE;IAoBvE;;;OAGG;iCAC0B,eAAe,GAAG;QAAE,MAAM,EAAE,MAAM,IAAI,CAAA;KAAE;CAmBtE,CAAC"}