expo-gaode-map 2.2.38 → 2.2.39-next.0
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.
- package/android/build.gradle +6 -31
- package/android/src/main/java/expo/modules/gaodemap/ExpoGaodeMapView.kt +35 -12
- package/android/src/main/java/expo/modules/gaodemap/ExpoGaodeMapViewModule.kt +2 -0
- package/android/src/main/java/expo/modules/gaodemap/managers/UIManager.kt +8 -0
- package/android/src/main/java/expo/modules/gaodemap/overlays/MarkerView.kt +13 -5
- package/build/ExpoGaodeMapOfflineModule.js +1 -1
- package/build/ExpoGaodeMapOfflineModule.js.map +1 -1
- package/build/ExpoGaodeMapView.js +2 -8
- package/build/ExpoGaodeMapView.js.map +1 -1
- package/build/components/AreaMaskOverlay.d.ts +1 -2
- package/build/components/AreaMaskOverlay.d.ts.map +1 -1
- package/build/components/AreaMaskOverlay.js +2 -1
- package/build/components/AreaMaskOverlay.js.map +1 -1
- package/build/components/FoldableMapView.d.ts +3 -2
- package/build/components/FoldableMapView.d.ts.map +1 -1
- package/build/components/FoldableMapView.js +2 -1
- package/build/components/FoldableMapView.js.map +1 -1
- package/build/components/MapUI.js +2 -1
- package/build/components/MapUI.js.map +1 -1
- package/build/components/RouteOverlay.d.ts +1 -2
- package/build/components/RouteOverlay.d.ts.map +1 -1
- package/build/components/RouteOverlay.js +5 -5
- package/build/components/RouteOverlay.js.map +1 -1
- package/build/components/overlays/Circle.d.ts +1 -1
- package/build/components/overlays/Circle.d.ts.map +1 -1
- package/build/components/overlays/Circle.js +2 -1
- package/build/components/overlays/Circle.js.map +1 -1
- package/build/components/overlays/Cluster.d.ts +1 -1
- package/build/components/overlays/Cluster.d.ts.map +1 -1
- package/build/components/overlays/Cluster.js +2 -1
- package/build/components/overlays/Cluster.js.map +1 -1
- package/build/components/overlays/HeatMap.d.ts +1 -1
- package/build/components/overlays/HeatMap.d.ts.map +1 -1
- package/build/components/overlays/HeatMap.js +2 -1
- package/build/components/overlays/HeatMap.js.map +1 -1
- package/build/components/overlays/Marker.d.ts +1 -1
- package/build/components/overlays/Marker.d.ts.map +1 -1
- package/build/components/overlays/Marker.js +8 -7
- package/build/components/overlays/Marker.js.map +1 -1
- package/build/components/overlays/MultiPoint.d.ts +1 -2
- package/build/components/overlays/MultiPoint.d.ts.map +1 -1
- package/build/components/overlays/MultiPoint.js +2 -1
- package/build/components/overlays/MultiPoint.js.map +1 -1
- package/build/components/overlays/Polygon.d.ts +1 -1
- package/build/components/overlays/Polygon.d.ts.map +1 -1
- package/build/components/overlays/Polygon.js +2 -1
- package/build/components/overlays/Polygon.js.map +1 -1
- package/build/components/overlays/Polyline.d.ts +1 -1
- package/build/components/overlays/Polyline.d.ts.map +1 -1
- package/build/components/overlays/Polyline.js +2 -1
- package/build/components/overlays/Polyline.js.map +1 -1
- package/build/module/geometry.d.ts.map +1 -1
- package/build/module/geometry.js +2 -1
- package/build/module/geometry.js.map +1 -1
- package/build/search/ExpoGaodeMapSearchModule.d.ts +1 -1
- package/build/search/ExpoGaodeMapSearchModule.d.ts.map +1 -1
- package/build/search/ExpoGaodeMapSearchModule.js.map +1 -1
- package/build/types/common.types.d.ts +1 -1
- package/build/types/common.types.d.ts.map +1 -1
- package/build/types/common.types.js.map +1 -1
- package/build/types/index.d.ts +1 -1
- package/build/types/index.d.ts.map +1 -1
- package/build/types/index.js.map +1 -1
- package/build/types/map-view.types.d.ts +11 -0
- package/build/types/map-view.types.d.ts.map +1 -1
- package/build/types/map-view.types.js.map +1 -1
- package/build/utils/GeoUtils.d.ts +2 -2
- package/build/utils/GeoUtils.d.ts.map +1 -1
- package/build/utils/GeoUtils.js +3 -3
- package/build/utils/GeoUtils.js.map +1 -1
- package/build/utils/RouteUtils.d.ts.map +1 -1
- package/build/utils/RouteUtils.js +5 -2
- package/build/utils/RouteUtils.js.map +1 -1
- package/ios/ExpoGaodeMapView.swift +106 -10
- package/ios/ExpoGaodeMapViewModule.swift +5 -0
- package/ios/overlays/MarkerView.swift +104 -32
- package/package.json +9 -7
- package/plugin/build/withGaodeMap.js +3 -2
package/build/types/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export type { Point, LatLng, LatLngPoint, MapPoi, LatLngBounds, CameraPosition, CameraUpdate, ColorValue, SDKConfig, PermissionStatus, } from './common.types';
|
|
6
6
|
export { MapType } from './common.types';
|
|
7
|
-
export type { LocationEvent, CameraEvent, MapViewProps, MapViewMethods, MapViewRef, ExpoGaodeMapModuleEvents, } from './map-view.types';
|
|
7
|
+
export type { LocationEvent, CameraEvent, ZoomGestureAnchor, MapViewProps, MapViewMethods, MapViewRef, ExpoGaodeMapModuleEvents, } from './map-view.types';
|
|
8
8
|
export type { Coordinates, ReGeocode, HeadingUpdate, LocationOptions, LocationListener, HeadingListener, GeoLanguage, LocationProtocol, } from './location.types';
|
|
9
9
|
export { LocationAccuracy, LocationMode, CoordinateType, } from './location.types';
|
|
10
10
|
export type { MarkerProps, PolylineProps, PolygonProps, CircleProps, HeatMapProps, MultiPointItem, MultiPointProps, ClusterParams, ClusterPoint, ClusterProps, } from './overlays.types';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACV,KAAK,EACL,MAAM,EACN,WAAW,EACX,MAAM,EACN,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,UAAU,EACV,SAAS,EACT,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,YAAY,EACV,aAAa,EACb,WAAW,EACX,YAAY,EACZ,cAAc,EACd,UAAU,EACV,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,WAAW,EACX,SAAS,EACT,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,cAAc,GACf,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,WAAW,EACX,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,cAAc,EACd,eAAe,EACf,aAAa,EACb,YAAY,EACZ,YAAY,GACb,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,YAAY,EACV,oBAAoB,EACpB,uBAAuB,EACvB,WAAW,EACX,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACV,KAAK,EACL,MAAM,EACN,WAAW,EACX,MAAM,EACN,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,UAAU,EACV,SAAS,EACT,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,YAAY,EACV,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,UAAU,EACV,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,WAAW,EACX,SAAS,EACT,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,cAAc,GACf,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,WAAW,EACX,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,cAAc,EACd,eAAe,EACf,aAAa,EACb,YAAY,EACZ,YAAY,GACb,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,YAAY,EACV,oBAAoB,EACpB,uBAAuB,EACvB,WAAW,EACX,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC"}
|
package/build/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAyBzC,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,cAAc,GACf,MAAM,kBAAkB,CAAC","sourcesContent":["/**\n * 高德地图 Expo Module 类型定义统一导出\n * 基于 Expo Modules API 重新设计\n */\n\n// 通用类型\nexport type {\n Point,\n LatLng,\n LatLngPoint,\n MapPoi,\n LatLngBounds,\n CameraPosition,\n CameraUpdate,\n ColorValue,\n SDKConfig,\n PermissionStatus,\n} from './common.types';\n\nexport { MapType } from './common.types';\n\n// 地图视图类型\nexport type {\n LocationEvent,\n CameraEvent,\n ZoomGestureAnchor,\n MapViewProps,\n MapViewMethods,\n MapViewRef,\n ExpoGaodeMapModuleEvents,\n} from './map-view.types';\n\n// 定位类型\nexport type {\n Coordinates,\n ReGeocode,\n HeadingUpdate,\n LocationOptions,\n LocationListener,\n HeadingListener,\n GeoLanguage,\n LocationProtocol,\n} from './location.types';\n\nexport {\n LocationAccuracy,\n LocationMode,\n CoordinateType,\n} from './location.types';\n\n// 覆盖物类型\nexport type {\n MarkerProps,\n PolylineProps,\n PolygonProps,\n CircleProps,\n HeatMapProps,\n MultiPointItem,\n MultiPointProps,\n ClusterParams,\n ClusterPoint,\n ClusterProps,\n} from './overlays.types';\n\n// 模块 facade 类型\nexport type { ExpoGaodeMapModule } from '../ExpoGaodeMapModule';\n\nexport type {\n AreaMaskOverlayProps,\n FitToCoordinatesOptions,\n RouteBounds,\n RouteOverlayProps,\n RoutePlaybackController,\n RoutePlaybackOptions,\n RoutePlaybackState,\n SmoothMoveEndEvent,\n SmoothMoveProgressEvent,\n} from './route-playback.types';\n"]}
|
|
@@ -36,6 +36,12 @@ export interface CameraEvent {
|
|
|
36
36
|
*/
|
|
37
37
|
latLngBounds: LatLngBounds;
|
|
38
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* 缩放手势锚点
|
|
41
|
+
* - `gesture`: 跟随手势中心点缩放(默认)
|
|
42
|
+
* - `center`: 固定地图中心点缩放
|
|
43
|
+
*/
|
|
44
|
+
export type ZoomGestureAnchor = 'gesture' | 'center';
|
|
39
45
|
/**
|
|
40
46
|
* 地图视图属性
|
|
41
47
|
*/
|
|
@@ -166,6 +172,11 @@ export interface MapViewProps {
|
|
|
166
172
|
* 是否启用缩放手势
|
|
167
173
|
*/
|
|
168
174
|
zoomGesturesEnabled?: boolean;
|
|
175
|
+
/**
|
|
176
|
+
* 缩放手势锚点
|
|
177
|
+
* @default 'gesture'
|
|
178
|
+
*/
|
|
179
|
+
zoomGestureAnchor?: ZoomGestureAnchor;
|
|
169
180
|
/**
|
|
170
181
|
* 是否启用滑动手势
|
|
171
182
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map-view.types.d.ts","sourceRoot":"","sources":["../../src/types/map-view.types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"map-view.types.d.ts","sourceRoot":"","sources":["../../src/types/map-view.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map-view.types.js","sourceRoot":"","sources":["../../src/types/map-view.types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * 高德地图视图相关类型定义\n * 基于 Expo Modules API\n */\n\nimport type { StyleProp, ViewStyle, NativeSyntheticEvent } from 'react-native';\nimport type { CameraPosition, CameraUpdate, LatLng, LatLngBounds, MapPoi, MapType, Point, LatLngPoint } from './common.types';\nimport type { Coordinates, ReGeocode, HeadingUpdate } from './location.types';\nimport type { FitToCoordinatesOptions } from './route-playback.types';\n\n/**\n * 定位事件数据\n */\nexport interface LocationEvent {\n /**\n * 纬度\n */\n latitude: number;\n \n /**\n * 经度\n */\n longitude: number;\n \n /**\n * 定位精度(米)\n */\n accuracy: number;\n}\n\n\n/**\n * 地图相机事件\n */\nexport interface CameraEvent {\n /**\n * 相机位置\n */\n cameraPosition: CameraPosition;\n\n /**\n * 可见区域边界\n */\n latLngBounds: LatLngBounds;\n}\n\n/**\n * 地图视图属性\n */\nexport interface MapViewProps {\n /**\n * 地图类型\n */\n mapType?: MapType;\n\n /**\n * 初始相机位置\n */\n initialCameraPosition?: CameraPosition;\n\n /**\n * 是否显示当前定位\n */\n myLocationEnabled?: boolean;\n\n /**\n * 是否跟随用户位置\n * @default false\n */\n followUserLocation?: boolean;\n\n /**\n * 定位蓝点配置\n */\n userLocationRepresentation?: {\n /** 精度圈是否显示 @default true */\n showsAccuracyRing?: boolean;\n /** 是否显示方向指示 @default true @platform ios */\n showsHeadingIndicator?: boolean;\n /** 精度圈填充颜色 支持 '#RRGGBB'、'red' 或 ARGB 数字 */\n fillColor?: string | number;\n /** 精度圈边线颜色 */\n strokeColor?: string | number;\n /** 精度圈边线宽度 @default 0 */\n lineWidth?: number;\n /** 内部蓝色圆点是否使用律动效果 @default true @platform ios */\n enablePulseAnimation?: boolean;\n /** 定位点背景色 @default 'white' @platform ios */\n locationDotBgColor?: string | number;\n /** 定位点蓝色圆点颜色 @default 'blue' @platform ios */\n locationDotFillColor?: string | number;\n /** 定位图标 支持网络图片(http/https)、本地文件(file://)或资源名称 */\n image?: string;\n /** 定位图标宽度(像素) */\n imageWidth?: number;\n /** 定位图标高度(像素) */\n imageHeight?: number;\n /**\n * 是否显示定位蓝点 @default true\n * - iOS: 对应 mapView.showsUserLocation\n * - Android: 对应 MyLocationStyle.showMyLocation() (5.1.0+)\n */\n showMyLocation?: boolean;\n /** 定位图标锚点 U 坐标 (0.0-1.0) @platform android */\n anchorU?: number;\n /** 定位图标锚点 V 坐标 (0.0-1.0) @platform android */\n anchorV?: number;\n /**\n * 定位蓝点展现模式 @platform android\n * @default 'LOCATION_ROTATE_NO_CENTER' (连续定位、定位点旋转、不移动到中心)\n *\n * 🧭 **方向指示说明**:\n * - Android 通过 locationType 实现方向指示(定位点依照设备方向旋转)\n * - iOS 通过 showsHeadingIndicator 实现方向指示(显示扇形方向指示器)\n *\n * 📱 **Android 方向指示模式**(推荐使用以下两种):\n * - 'LOCATION_ROTATE': 定位点依照设备方向旋转,视角跟随移动到中心\n * - 'LOCATION_ROTATE_NO_CENTER': 定位点依照设备方向旋转,视角不移动到中心 ⭐\n *\n * 🗺️ **其他模式**:\n * - 'SHOW': 只定位一次\n * - 'LOCATE': 定位一次,且将视角移动到地图中心点\n * - 'FOLLOW': 连续定位、跟随移动,但定位点不旋转\n * - 'MAP_ROTATE': 地图依照设备方向旋转(而非定位点旋转)\n * - 'FOLLOW_NO_CENTER': 连续定位、不移动到中心,定位点不旋转\n * - 'MAP_ROTATE_NO_CENTER': 地图依照设备方向旋转,不移动到中心\n *\n * 显式设置 locationType 时,会覆盖 followUserLocation 的默认模式选择。\n */\n locationType?: 'SHOW' | 'LOCATE' | 'FOLLOW' | 'MAP_ROTATE' | 'LOCATION_ROTATE' |\n 'LOCATION_ROTATE_NO_CENTER' | 'FOLLOW_NO_CENTER' | 'MAP_ROTATE_NO_CENTER';\n };\n\n /**\n * 是否显示室内地图\n * \n */\n indoorViewEnabled?: boolean;\n\n /**\n * 是否显示3D建筑\n */\n buildingsEnabled?: boolean;\n\n /**\n * 是否显示标注\n * @platform android\n * @note iOS 暂不支持\n */\n labelsEnabled?: boolean;\n\n /**\n * 是否显示指南针\n */\n compassEnabled?: boolean;\n\n /**\n * 是否显示缩放按钮\n * @platform android\n */\n zoomControlsEnabled?: boolean;\n\n /**\n * 是否显示比例尺\n */\n scaleControlsEnabled?: boolean;\n\n /**\n * 是否显示定位按钮\n * @platform android\n */\n myLocationButtonEnabled?: boolean;\n\n /**\n * 是否显示路况\n */\n trafficEnabled?: boolean;\n\n /**\n * 最大缩放级别\n */\n maxZoom?: number;\n\n /**\n * 最小缩放级别\n */\n minZoom?: number;\n\n /**\n * 是否启用缩放手势\n */\n zoomGesturesEnabled?: boolean;\n\n /**\n * 是否启用滑动手势\n */\n scrollGesturesEnabled?: boolean;\n\n /**\n * 是否启用旋转手势\n */\n rotateGesturesEnabled?: boolean;\n\n /**\n * 是否启用倾斜手势\n */\n tiltGesturesEnabled?: boolean;\n\n /**\n * 定位的最小更新距离(米)\n * @platform ios\n */\n distanceFilter?: number;\n\n /**\n * 最小更新角度(度)\n * @platform ios\n */\n headingFilter?: number;\n\n /**\n * 是否启用国内外地图自动切换\n * - true: 当中心点在国外时自动切换到苹果地图(iOS),国内时切换回高德地图\n * - false: 始终使用高德地图\n * @platform ios 当前仅支持 iOS 安卓因为需要使用 Google Maps SDK和谷歌服务\n * @default false\n */\n worldMapSwitchEnabled?: boolean;\n\n /**\n * 自定义地图样式\n *\n * 支持两种方式:\n * 1. 在线样式:提供 styleId(从高德开放平台获取)\n * 2. 本地样式:提供 styleDataPath 和可选的 extraStyleDataPath\n *\n * @example\n * // 使用在线样式\n * customMapStyle={{ styleId: \"your-style-id\" }}\n *\n * @example\n * // 使用本地样式文件\n * customMapStyle={{\n * styleDataPath: \"path/to/style.data\",\n * extraStyleDataPath: \"path/to/extra.data\"\n * }}\n */\n customMapStyle?: {\n /** 在线样式ID(从高德开放平台获取) */\n styleId?: string;\n /** 本地样式文件路径 */\n styleDataPath?: string;\n /** 额外样式文件路径(可选) */\n extraStyleDataPath?: string;\n };\n\n /**\n * 样式\n */\n style?: StyleProp<ViewStyle>;\n\n /**\n * 点击地图事件\n */\n onMapPress?: (event: NativeSyntheticEvent<LatLng>) => void;\n\n /**\n * 点击标注点事件\n */\n onPressPoi?: (event: NativeSyntheticEvent<MapPoi>) => void;\n\n /**\n * 长按地图事件\n */\n onMapLongPress?: (event: NativeSyntheticEvent<LatLng>) => void;\n\n /**\n * 地图状态改变事件(实时触发)\n * 可配合 `cameraEventThrottleMs` 控制事件频率\n */\n onCameraMove?: (event: NativeSyntheticEvent<CameraEvent>) => void;\n\n /**\n * 地图移动事件节流间隔(毫秒)\n * `0` 表示不节流\n * @default 32\n */\n cameraEventThrottleMs?: number;\n\n /**\n * 地图状态改变完成事件\n */\n onCameraIdle?: (event: NativeSyntheticEvent<CameraEvent>) => void;\n\n /**\n * 地图加载完成事件\n */\n onLoad?: (event: NativeSyntheticEvent<{}>) => void;\n\n /**\n * 地图定位更新事件\n */\n onLocation?: (event: NativeSyntheticEvent<LocationEvent>) => void;\n\n /**\n * 子组件\n */\n children?: React.ReactNode;\n}\n\n\n/**\n * 地图视图方法\n */\nexport interface MapViewMethods {\n /**\n * 移动相机\n * @param cameraPosition 目标相机位置\n * @param duration 动画时长(毫秒)\n */\n moveCamera(cameraPosition: CameraUpdate, duration?: number): Promise<void>;\n\n /**\n * 将屏幕坐标转换为地理坐标\n * @param point 屏幕坐标\n * @returns 地理坐标\n */\n getLatLng(point: Point): Promise<LatLng>;\n\n /**\n * 设置地图中心点\n * @param center 中心点\n * @param animated 是否启用动画\n */\n setCenter(center: LatLngPoint, animated?: boolean): Promise<void>;\n\n /**\n * 设置地图缩放级别\n * @param zoom 缩放级别\n * @param animated 是否启用动画\n */\n setZoom(zoom: number, animated?: boolean): Promise<void>;\n\n /**\n * 获取相机位置\n * @returns 相机位置\n */\n getCameraPosition(): Promise<CameraPosition>;\n\n /**\n * 截取地图快照\n * @returns 快照图片文件路径\n */\n takeSnapshot(): Promise<string>;\n\n /**\n * 根据坐标集合自动移动相机\n */\n fitToCoordinates(points: LatLngPoint[], options?: FitToCoordinatesOptions): Promise<void>;\n}\n\n/**\n * MapView Ref 公开接口(用户使用)\n */\nexport interface MapViewRef {\n moveCamera(position: CameraUpdate, duration?: number): Promise<void>;\n getLatLng(point: Point): Promise<LatLng>;\n setCenter(center: LatLngPoint, animated?: boolean): Promise<void>;\n setZoom(zoom: number, animated?: boolean): Promise<void>;\n getCameraPosition(): Promise<CameraPosition>;\n takeSnapshot(): Promise<string>;\n fitToCoordinates(points: LatLngPoint[], options?: FitToCoordinatesOptions): Promise<void>;\n}\n\n/**\n * Expo 模块事件类型\n * 定义了原生模块可以触发的事件\n */\nexport type ExpoGaodeMapModuleEvents = {\n /**\n * 定位更新事件\n * 当位置发生变化时触发\n * @param location 位置信息,包含坐标和可选的逆地理编码信息\n */\n onLocationUpdate: (location: Coordinates | ReGeocode) => void;\n \n /**\n * 方向更新事件(iOS)\n * 当设备方向发生变化时触发\n * @param heading 方向信息\n */\n onHeadingUpdate: (heading: HeadingUpdate) => void;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"map-view.types.js","sourceRoot":"","sources":["../../src/types/map-view.types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * 高德地图视图相关类型定义\n * 基于 Expo Modules API\n */\n\nimport type { StyleProp, ViewStyle, NativeSyntheticEvent } from 'react-native';\nimport type { CameraPosition, CameraUpdate, LatLng, LatLngBounds, MapPoi, MapType, Point, LatLngPoint } from './common.types';\nimport type { Coordinates, ReGeocode, HeadingUpdate } from './location.types';\nimport type { FitToCoordinatesOptions } from './route-playback.types';\n\n/**\n * 定位事件数据\n */\nexport interface LocationEvent {\n /**\n * 纬度\n */\n latitude: number;\n \n /**\n * 经度\n */\n longitude: number;\n \n /**\n * 定位精度(米)\n */\n accuracy: number;\n}\n\n\n/**\n * 地图相机事件\n */\nexport interface CameraEvent {\n /**\n * 相机位置\n */\n cameraPosition: CameraPosition;\n\n /**\n * 可见区域边界\n */\n latLngBounds: LatLngBounds;\n}\n\n/**\n * 缩放手势锚点\n * - `gesture`: 跟随手势中心点缩放(默认)\n * - `center`: 固定地图中心点缩放\n */\nexport type ZoomGestureAnchor = 'gesture' | 'center';\n\n/**\n * 地图视图属性\n */\nexport interface MapViewProps {\n /**\n * 地图类型\n */\n mapType?: MapType;\n\n /**\n * 初始相机位置\n */\n initialCameraPosition?: CameraPosition;\n\n /**\n * 是否显示当前定位\n */\n myLocationEnabled?: boolean;\n\n /**\n * 是否跟随用户位置\n * @default false\n */\n followUserLocation?: boolean;\n\n /**\n * 定位蓝点配置\n */\n userLocationRepresentation?: {\n /** 精度圈是否显示 @default true */\n showsAccuracyRing?: boolean;\n /** 是否显示方向指示 @default true @platform ios */\n showsHeadingIndicator?: boolean;\n /** 精度圈填充颜色 支持 '#RRGGBB'、'red' 或 ARGB 数字 */\n fillColor?: string | number;\n /** 精度圈边线颜色 */\n strokeColor?: string | number;\n /** 精度圈边线宽度 @default 0 */\n lineWidth?: number;\n /** 内部蓝色圆点是否使用律动效果 @default true @platform ios */\n enablePulseAnimation?: boolean;\n /** 定位点背景色 @default 'white' @platform ios */\n locationDotBgColor?: string | number;\n /** 定位点蓝色圆点颜色 @default 'blue' @platform ios */\n locationDotFillColor?: string | number;\n /** 定位图标 支持网络图片(http/https)、本地文件(file://)或资源名称 */\n image?: string;\n /** 定位图标宽度(像素) */\n imageWidth?: number;\n /** 定位图标高度(像素) */\n imageHeight?: number;\n /**\n * 是否显示定位蓝点 @default true\n * - iOS: 对应 mapView.showsUserLocation\n * - Android: 对应 MyLocationStyle.showMyLocation() (5.1.0+)\n */\n showMyLocation?: boolean;\n /** 定位图标锚点 U 坐标 (0.0-1.0) @platform android */\n anchorU?: number;\n /** 定位图标锚点 V 坐标 (0.0-1.0) @platform android */\n anchorV?: number;\n /**\n * 定位蓝点展现模式 @platform android\n * @default 'LOCATION_ROTATE_NO_CENTER' (连续定位、定位点旋转、不移动到中心)\n *\n * 🧭 **方向指示说明**:\n * - Android 通过 locationType 实现方向指示(定位点依照设备方向旋转)\n * - iOS 通过 showsHeadingIndicator 实现方向指示(显示扇形方向指示器)\n *\n * 📱 **Android 方向指示模式**(推荐使用以下两种):\n * - 'LOCATION_ROTATE': 定位点依照设备方向旋转,视角跟随移动到中心\n * - 'LOCATION_ROTATE_NO_CENTER': 定位点依照设备方向旋转,视角不移动到中心 ⭐\n *\n * 🗺️ **其他模式**:\n * - 'SHOW': 只定位一次\n * - 'LOCATE': 定位一次,且将视角移动到地图中心点\n * - 'FOLLOW': 连续定位、跟随移动,但定位点不旋转\n * - 'MAP_ROTATE': 地图依照设备方向旋转(而非定位点旋转)\n * - 'FOLLOW_NO_CENTER': 连续定位、不移动到中心,定位点不旋转\n * - 'MAP_ROTATE_NO_CENTER': 地图依照设备方向旋转,不移动到中心\n *\n * 显式设置 locationType 时,会覆盖 followUserLocation 的默认模式选择。\n */\n locationType?: 'SHOW' | 'LOCATE' | 'FOLLOW' | 'MAP_ROTATE' | 'LOCATION_ROTATE' |\n 'LOCATION_ROTATE_NO_CENTER' | 'FOLLOW_NO_CENTER' | 'MAP_ROTATE_NO_CENTER';\n };\n\n /**\n * 是否显示室内地图\n * \n */\n indoorViewEnabled?: boolean;\n\n /**\n * 是否显示3D建筑\n */\n buildingsEnabled?: boolean;\n\n /**\n * 是否显示标注\n * @platform android\n * @note iOS 暂不支持\n */\n labelsEnabled?: boolean;\n\n /**\n * 是否显示指南针\n */\n compassEnabled?: boolean;\n\n /**\n * 是否显示缩放按钮\n * @platform android\n */\n zoomControlsEnabled?: boolean;\n\n /**\n * 是否显示比例尺\n */\n scaleControlsEnabled?: boolean;\n\n /**\n * 是否显示定位按钮\n * @platform android\n */\n myLocationButtonEnabled?: boolean;\n\n /**\n * 是否显示路况\n */\n trafficEnabled?: boolean;\n\n /**\n * 最大缩放级别\n */\n maxZoom?: number;\n\n /**\n * 最小缩放级别\n */\n minZoom?: number;\n\n /**\n * 是否启用缩放手势\n */\n zoomGesturesEnabled?: boolean;\n\n /**\n * 缩放手势锚点\n * @default 'gesture'\n */\n zoomGestureAnchor?: ZoomGestureAnchor;\n\n /**\n * 是否启用滑动手势\n */\n scrollGesturesEnabled?: boolean;\n\n /**\n * 是否启用旋转手势\n */\n rotateGesturesEnabled?: boolean;\n\n /**\n * 是否启用倾斜手势\n */\n tiltGesturesEnabled?: boolean;\n\n /**\n * 定位的最小更新距离(米)\n * @platform ios\n */\n distanceFilter?: number;\n\n /**\n * 最小更新角度(度)\n * @platform ios\n */\n headingFilter?: number;\n\n /**\n * 是否启用国内外地图自动切换\n * - true: 当中心点在国外时自动切换到苹果地图(iOS),国内时切换回高德地图\n * - false: 始终使用高德地图\n * @platform ios 当前仅支持 iOS 安卓因为需要使用 Google Maps SDK和谷歌服务\n * @default false\n */\n worldMapSwitchEnabled?: boolean;\n\n /**\n * 自定义地图样式\n *\n * 支持两种方式:\n * 1. 在线样式:提供 styleId(从高德开放平台获取)\n * 2. 本地样式:提供 styleDataPath 和可选的 extraStyleDataPath\n *\n * @example\n * // 使用在线样式\n * customMapStyle={{ styleId: \"your-style-id\" }}\n *\n * @example\n * // 使用本地样式文件\n * customMapStyle={{\n * styleDataPath: \"path/to/style.data\",\n * extraStyleDataPath: \"path/to/extra.data\"\n * }}\n */\n customMapStyle?: {\n /** 在线样式ID(从高德开放平台获取) */\n styleId?: string;\n /** 本地样式文件路径 */\n styleDataPath?: string;\n /** 额外样式文件路径(可选) */\n extraStyleDataPath?: string;\n };\n\n /**\n * 样式\n */\n style?: StyleProp<ViewStyle>;\n\n /**\n * 点击地图事件\n */\n onMapPress?: (event: NativeSyntheticEvent<LatLng>) => void;\n\n /**\n * 点击标注点事件\n */\n onPressPoi?: (event: NativeSyntheticEvent<MapPoi>) => void;\n\n /**\n * 长按地图事件\n */\n onMapLongPress?: (event: NativeSyntheticEvent<LatLng>) => void;\n\n /**\n * 地图状态改变事件(实时触发)\n * 可配合 `cameraEventThrottleMs` 控制事件频率\n */\n onCameraMove?: (event: NativeSyntheticEvent<CameraEvent>) => void;\n\n /**\n * 地图移动事件节流间隔(毫秒)\n * `0` 表示不节流\n * @default 32\n */\n cameraEventThrottleMs?: number;\n\n /**\n * 地图状态改变完成事件\n */\n onCameraIdle?: (event: NativeSyntheticEvent<CameraEvent>) => void;\n\n /**\n * 地图加载完成事件\n */\n onLoad?: (event: NativeSyntheticEvent<{}>) => void;\n\n /**\n * 地图定位更新事件\n */\n onLocation?: (event: NativeSyntheticEvent<LocationEvent>) => void;\n\n /**\n * 子组件\n */\n children?: React.ReactNode;\n}\n\n\n/**\n * 地图视图方法\n */\nexport interface MapViewMethods {\n /**\n * 移动相机\n * @param cameraPosition 目标相机位置\n * @param duration 动画时长(毫秒)\n */\n moveCamera(cameraPosition: CameraUpdate, duration?: number): Promise<void>;\n\n /**\n * 将屏幕坐标转换为地理坐标\n * @param point 屏幕坐标\n * @returns 地理坐标\n */\n getLatLng(point: Point): Promise<LatLng>;\n\n /**\n * 设置地图中心点\n * @param center 中心点\n * @param animated 是否启用动画\n */\n setCenter(center: LatLngPoint, animated?: boolean): Promise<void>;\n\n /**\n * 设置地图缩放级别\n * @param zoom 缩放级别\n * @param animated 是否启用动画\n */\n setZoom(zoom: number, animated?: boolean): Promise<void>;\n\n /**\n * 获取相机位置\n * @returns 相机位置\n */\n getCameraPosition(): Promise<CameraPosition>;\n\n /**\n * 截取地图快照\n * @returns 快照图片文件路径\n */\n takeSnapshot(): Promise<string>;\n\n /**\n * 根据坐标集合自动移动相机\n */\n fitToCoordinates(points: LatLngPoint[], options?: FitToCoordinatesOptions): Promise<void>;\n}\n\n/**\n * MapView Ref 公开接口(用户使用)\n */\nexport interface MapViewRef {\n moveCamera(position: CameraUpdate, duration?: number): Promise<void>;\n getLatLng(point: Point): Promise<LatLng>;\n setCenter(center: LatLngPoint, animated?: boolean): Promise<void>;\n setZoom(zoom: number, animated?: boolean): Promise<void>;\n getCameraPosition(): Promise<CameraPosition>;\n takeSnapshot(): Promise<string>;\n fitToCoordinates(points: LatLngPoint[], options?: FitToCoordinatesOptions): Promise<void>;\n}\n\n/**\n * Expo 模块事件类型\n * 定义了原生模块可以触发的事件\n */\nexport type ExpoGaodeMapModuleEvents = {\n /**\n * 定位更新事件\n * 当位置发生变化时触发\n * @param location 位置信息,包含坐标和可选的逆地理编码信息\n */\n onLocationUpdate: (location: Coordinates | ReGeocode) => void;\n \n /**\n * 方向更新事件(iOS)\n * 当设备方向发生变化时触发\n * @param heading 方向信息\n */\n onHeadingUpdate: (heading: HeadingUpdate) => void;\n};\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 地理位置工具类
|
|
3
3
|
*/
|
|
4
|
-
import { LatLng, LatLngPoint } from '../types/common.types';
|
|
4
|
+
import type { LatLng, LatLngPoint } from '../types/common.types';
|
|
5
5
|
/**
|
|
6
6
|
* 将坐标点归一化为对象格式
|
|
7
7
|
* 支持 [longitude, latitude] 数组或 { latitude, longitude } 对象
|
|
@@ -9,7 +9,7 @@ import { LatLng, LatLngPoint } from '../types/common.types';
|
|
|
9
9
|
*
|
|
10
10
|
* @param point 坐标点
|
|
11
11
|
* @returns { latitude, longitude } 对象
|
|
12
|
-
|
|
12
|
+
*/
|
|
13
13
|
export declare function normalizeLatLng(point: LatLngPoint): LatLng;
|
|
14
14
|
/**
|
|
15
15
|
* 将坐标点数组归一化为对象数组
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeoUtils.d.ts","sourceRoot":"","sources":["../../src/utils/GeoUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"GeoUtils.d.ts","sourceRoot":"","sources":["../../src/utils/GeoUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAOjE;;;;;;;IAOI;AACJ,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CA+B1D;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAAC;AACrE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;AACzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC"}
|
package/build/utils/GeoUtils.js
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @param point 坐标点
|
|
7
7
|
* @returns { latitude, longitude } 对象
|
|
8
|
-
|
|
8
|
+
*/
|
|
9
9
|
export function normalizeLatLng(point) {
|
|
10
10
|
if (Array.isArray(point)) {
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
const longitude = Number(point[0]);
|
|
12
|
+
const latitude = Number(point[1]);
|
|
13
13
|
// 智能纠错:如果纬度超出范围 [-90, 90] 且交换后在范围内,则认为是用户传反了
|
|
14
14
|
if (Math.abs(latitude) > 90 && Math.abs(longitude) <= 90) {
|
|
15
15
|
console.warn(`[expo-gaode-map] 检测到坐标数组格式可能为 [latitude, longitude] (${point}),已自动纠正为 [longitude, latitude]。建议显式使用 [经度, 纬度] 格式以遵循 GeoJSON 标准。`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeoUtils.js","sourceRoot":"","sources":["../../src/utils/GeoUtils.ts"],"names":[],"mappings":"AAUA;;;;;;;
|
|
1
|
+
{"version":3,"file":"GeoUtils.js","sourceRoot":"","sources":["../../src/utils/GeoUtils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 地理位置工具类\n */\nimport type { LatLng, LatLngPoint } from '../types/common.types';\n\ntype LatLngLike = {\n latitude?: unknown;\n longitude?: unknown;\n};\n\n/**\n * 将坐标点归一化为对象格式\n * 支持 [longitude, latitude] 数组或 { latitude, longitude } 对象\n * 注意:数组格式遵循 GeoJSON 标准,即 [经度, 纬度]\n * \n * @param point 坐标点\n * @returns { latitude, longitude } 对象\n */\nexport function normalizeLatLng(point: LatLngPoint): LatLng {\n if (Array.isArray(point)) {\n const longitude = Number(point[0]);\n const latitude = Number(point[1]);\n\n // 智能纠错:如果纬度超出范围 [-90, 90] 且交换后在范围内,则认为是用户传反了\n if (Math.abs(latitude) > 90 && Math.abs(longitude) <= 90) {\n console.warn(\n `[expo-gaode-map] 检测到坐标数组格式可能为 [latitude, longitude] (${point}),已自动纠正为 [longitude, latitude]。建议显式使用 [经度, 纬度] 格式以遵循 GeoJSON 标准。`\n );\n return {\n latitude: longitude,\n longitude: latitude\n };\n }\n\n return {\n longitude,\n latitude,\n };\n }\n // 对象格式:强制转换为数字,防止传入 string 类型导致原生层 Crash\n if (point && typeof point === 'object') {\n const p = point as LatLngLike;\n return {\n latitude: Number(p.latitude),\n longitude: Number(p.longitude),\n };\n }\n \n return point as LatLng;\n}\n\n/**\n * 将坐标点数组归一化为对象数组\n * 支持一维数组 [p1, p2, ...] 或二维嵌套数组 [[p1, p2, ...], [p3, p4, ...]]\n * \n * @param points 坐标点数组或嵌套数组\n * @returns 归一化后的坐标数组\n */\nexport function normalizeLatLngList(points: LatLngPoint[]): LatLng[];\nexport function normalizeLatLngList(points: LatLngPoint[][]): LatLng[][];\nexport function normalizeLatLngList(points: LatLngPoint[] | LatLngPoint[][]): LatLng[] | LatLng[][];\nexport function normalizeLatLngList(\n points: LatLngPoint[] | LatLngPoint[][]\n): LatLng[] | LatLng[][] {\n if (!points || points.length === 0) return [];\n\n // 检查是否为嵌套数组 (检查第一项是否也是数组或对象,且不符合 LatLngPoint 的基本判断)\n // 如果第一项是数组且长度 > 2,或者第一项的第一个元素也是数组/对象,则认为是嵌套数组\n const firstItem = points[0];\n \n if (Array.isArray(firstItem)) {\n // 如果第一项是 [number, number],则这可能是一个一维坐标点数组 (LatLngPoint[])\n // 除非所有元素都是数组且至少有一个子数组长度不等于2,或者我们明确知道这是嵌套的\n // 为了支持 Polygon 的嵌套格式,我们需要递归处理\n \n // 启发式判断:如果第一项是数组且它的第一个元素也是数组或对象,那么它一定是嵌套的\n if (Array.isArray(firstItem[0]) || (typeof firstItem[0] === 'object' && firstItem[0] !== null && 'latitude' in firstItem[0])) {\n return (points as LatLngPoint[][]).map(ring => ring.map(normalizeLatLng));\n }\n \n // 另一种情况:用户传入的是 [[lng, lat], [lng, lat]],这既可以看作 LatLngPoint[],\n // 也可以看作 LatLngPoint[][] (只有一个外轮廓)。\n // 在 Polygon 组件中,我们希望统一处理。\n // 如果是 Polygon 传入的,我们希望保留嵌套结构。\n // 但 normalizeLatLngList 是通用的。\n \n // 改进逻辑:如果 data[0] 是一个点,我们把它当作一维数组处理。\n // 如果 data[0] 不是一个点(即它是点的集合),我们当作二维处理。\n if (isPoint(firstItem)) {\n return (points as LatLngPoint[]).map(normalizeLatLng);\n } else {\n return (points as LatLngPoint[][]).map(ring => ring.map(normalizeLatLng));\n }\n }\n\n return (points as LatLngPoint[]).map(normalizeLatLng);\n}\n\n/**\n * 判断一个对象是否为坐标点 (LatLngPoint)\n */\nfunction isPoint(item: unknown): item is LatLngPoint {\n if (!item || typeof item !== 'object') return false;\n // { latitude, longitude } 格式\n if ('latitude' in item && 'longitude' in (item as Record<string, unknown>)) return true;\n // [longitude, latitude] 格式\n if (Array.isArray(item) && item.length >= 2 && typeof item[0] === 'number' && typeof item[1] === 'number') return true;\n return false;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouteUtils.d.ts","sourceRoot":"","sources":["../../src/utils/RouteUtils.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAU,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,KAAK,EACV,uBAAuB,EACvB,sBAAsB,EACtB,iBAAiB,EACjB,WAAW,EACZ,MAAM,+BAA+B,CAAC;AA+EvC;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,IAAI,CAAC,uBAAuB,EAAE,SAAS,GAAG,SAAS,CAAM,GACjE,MAAM,CAQR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,GAAE,IAAI,CACX,uBAAuB,EACvB,eAAe,GAAG,WAAW,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,SAAS,GAAG,SAAS,CAC1F,GACL,WAAW,GAAG,IAAI,CAqCpB;AAkCD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CA0B1E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,sBAAsB,EAC3B,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"RouteUtils.d.ts","sourceRoot":"","sources":["../../src/utils/RouteUtils.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAU,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,KAAK,EACV,uBAAuB,EACvB,sBAAsB,EACtB,iBAAiB,EACjB,WAAW,EACZ,MAAM,+BAA+B,CAAC;AA+EvC;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,IAAI,CAAC,uBAAuB,EAAE,SAAS,GAAG,SAAS,CAAM,GACjE,MAAM,CAQR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,GAAE,IAAI,CACX,uBAAuB,EACvB,eAAe,GAAG,WAAW,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,SAAS,GAAG,SAAS,CAC1F,GACL,WAAW,GAAG,IAAI,CAqCpB;AAkCD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CA0B1E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,sBAAsB,EAC3B,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,YAAY,GAAG,IAAI,CAgB5E"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* 这些逻辑用于在 JS 层统一处理路线回放、区域遮罩和路径自适应视野等场景。
|
|
7
7
|
*/
|
|
8
8
|
import ExpoGaodeMapModule from '../ExpoGaodeMapModule';
|
|
9
|
-
import {
|
|
9
|
+
import { normalizeLatLngList } from './GeoUtils';
|
|
10
10
|
const MIN_ZOOM = 3; // 最小缩放级别
|
|
11
11
|
const MAX_ZOOM = 20; // 最大缩放级别
|
|
12
12
|
const DEFAULT_SINGLE_POINT_ZOOM = 16; // 默认单点缩放级别
|
|
@@ -213,7 +213,10 @@ export async function fitCameraToCoordinates(map, points, options = {}) {
|
|
|
213
213
|
}
|
|
214
214
|
const currentCamera = await map.getCameraPosition().catch(() => ({}));
|
|
215
215
|
if (normalized.length === 1) {
|
|
216
|
-
const single =
|
|
216
|
+
const single = normalized[0];
|
|
217
|
+
if (!single) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
217
220
|
await map.moveCamera({
|
|
218
221
|
target: single,
|
|
219
222
|
zoom: options.singlePointZoom ?? currentCamera.zoom ?? DEFAULT_SINGLE_POINT_ZOOM,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouteUtils.js","sourceRoot":"","sources":["../../src/utils/RouteUtils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 路线与区域展示相关的工具函数。\n *\n * 本文件主要负责路径坐标的边界计算、推荐缩放级别估算、\n * 高德 polyline / 多环边界字符串解析,以及将地图相机移动到合适的展示范围。\n * 这些逻辑用于在 JS 层统一处理路线回放、区域遮罩和路径自适应视野等场景。\n */\nimport ExpoGaodeMapModule from '../ExpoGaodeMapModule';\nimport type { LatLng, LatLngBounds, LatLngPoint } from '../types/common.types';\nimport type {\n FitToCoordinatesOptions,\n FitToCoordinatesTarget,\n MultiRingPolyline,\n RouteBounds,\n} from '../types/route-playback.types';\nimport { normalizeLatLng, normalizeLatLngList } from './GeoUtils';\n\nconst MIN_ZOOM = 3; // 最小缩放级别\nconst MAX_ZOOM = 20; // 最大缩放级别\nconst DEFAULT_SINGLE_POINT_ZOOM = 16; // 默认单点缩放级别\nconst DEFAULT_PADDING_FACTOR = 1.2; // 默认缓冲因子\nconst DEFAULT_VIEWPORT_WIDTH_PX = 390; // 默认视口宽度(像素)\nconst DEFAULT_VIEWPORT_HEIGHT_PX = 844; // 默认视口高度(像素)\nconst DEFAULT_PADDING_PX = 48; // 默认缓冲值(像素)\n\n/**\n * 将缩放缓冲因子换算成地图四周需要预留的像素 padding。\n *\n * paddingFactor 表示“视野比实际路径范围放大多少倍”:\n * - 1 表示不额外留白;\n * - 1.2 表示路径只占视口中间约 83%,四周留出约 8.3% 的空白。\n *\n * @param paddingFactor 缓冲因子,必须大于 1 才会产生 padding。\n * @param viewportWidthPx 视口宽度,单位像素。\n * @param viewportHeightPx 视口高度,单位像素。\n * @returns 以较短边计算得到的单边 padding,单位像素。\n */\nfunction paddingFactorToPaddingPx(\n paddingFactor: number,\n viewportWidthPx: number,\n viewportHeightPx: number\n): number {\n if (!Number.isFinite(paddingFactor) || paddingFactor <= 1) {\n return 0;\n }\n const paddingRatio = (1 - 1 / paddingFactor) / 2;\n return Math.max(0, Math.min(viewportWidthPx, viewportHeightPx) * paddingRatio);\n}\n\n/**\n * 优先调用原生模块计算适配一组坐标的推荐缩放级别。\n *\n * 原生侧通常能结合地图 SDK 的投影与缩放规则给出更接近真实显示效果的 zoom。\n * 如果原生模块不可用或计算失败,返回 null,由上层使用纯 TS 估算逻辑兜底。\n *\n * @param points 路径点列表,每个点包含经纬度。\n * @param options 选项对象,包含缓冲因子、视口宽度、视口高度、最小缩放级别、最大缩放级别。\n * @defaultOptions 默认选项值。\n * @returns 推荐缩放级别,可能为 null。\n */\nfunction calculateFitZoom(\n points: LatLng[],\n options: Pick<\n FitToCoordinatesOptions,\n 'paddingFactor' | 'paddingPx' | 'viewportWidthPx' | 'viewportHeightPx' | 'minZoom' | 'maxZoom'\n >\n): number | null {\n if (points.length === 0) {\n return null;\n }\n\n const viewportWidthPx = options.viewportWidthPx ?? DEFAULT_VIEWPORT_WIDTH_PX;\n const viewportHeightPx = options.viewportHeightPx ?? DEFAULT_VIEWPORT_HEIGHT_PX;\n const paddingFromFactor = paddingFactorToPaddingPx(\n options.paddingFactor ?? DEFAULT_PADDING_FACTOR,\n viewportWidthPx,\n viewportHeightPx\n );\n const paddingPx = options.paddingPx ?? (paddingFromFactor > 0 ? paddingFromFactor : DEFAULT_PADDING_PX);\n\n try {\n return ExpoGaodeMapModule.calculateFitZoom(points, {\n viewportWidthPx,\n viewportHeightPx,\n paddingPx,\n minZoom: options.minZoom,\n maxZoom: options.maxZoom,\n });\n } catch {\n return null;\n }\n}\n\n/**\n * 估算路径的推荐缩放级别\n * @param {number} latitudeDelta - 纬度跨度(度)\n * @param {number} longitudeDelta - 经度跨度(度)\n * @param {FitToCoordinatesOptions} options - 选项对象,包含最小缩放级别、最大缩放级别\n * @defaultOptions 默认选项值\n * @returns {number} - 推荐缩放级别\n */\nexport function estimateZoomLevel(\n latitudeDelta: number,\n longitudeDelta: number,\n options: Pick<FitToCoordinatesOptions, 'minZoom' | 'maxZoom'> = {}\n): number {\n // 使用经纬度跨度估算一个“足够看全路径”的缩放级别。\n // 这是高层 TS 兜底逻辑,不依赖具体原生 SDK 的 fitBounds 能力。\n const span = Math.max(latitudeDelta, longitudeDelta, 0.0001);\n const rawZoom = Math.log2(360 / span);\n const minZoom = options.minZoom ?? MIN_ZOOM;\n const maxZoom = options.maxZoom ?? MAX_ZOOM;\n return Math.max(minZoom, Math.min(maxZoom, Number(rawZoom.toFixed(2))));\n}\n\n/**\n * 根据路径点计算地图展示所需的中心点、外接矩形、经纬度跨度和推荐缩放级别。\n *\n * 该函数会先统一坐标格式,再根据所有点的最南/北/东/西位置生成边界。\n * recommendedZoom 优先使用原生计算结果,失败时退回到经纬度跨度估算。\n * \n * @param points 路径点列表,每个点包含经纬度。\n * @param options 选项对象,包含缓冲因子、视口宽度、视口高度、最小缩放级别、最大缩放级别。\n * @defaultOptions 默认选项值。\n * @returns 推荐缩放级别,可能为 null。\n */\nexport function getRouteBounds(\n points: LatLngPoint[],\n options: Pick<\n FitToCoordinatesOptions,\n 'paddingFactor' | 'paddingPx' | 'viewportWidthPx' | 'viewportHeightPx' | 'minZoom' | 'maxZoom'\n > = {}\n): RouteBounds | null {\n // 统一将路径点转换为对象坐标,再计算中心点、边界和推荐缩放。\n const normalized = normalizeLatLngList(points) as LatLng[];\n if (normalized.length === 0) {\n return null;\n }\n\n const latitudes = normalized.map((point) => point.latitude);\n const longitudes = normalized.map((point) => point.longitude);\n\n const north = Math.max(...latitudes);\n const south = Math.min(...latitudes);\n const east = Math.max(...longitudes);\n const west = Math.min(...longitudes);\n const paddingFactor = options.paddingFactor ?? DEFAULT_PADDING_FACTOR;\n const latitudeDelta = Math.max((north - south) * paddingFactor, 0.0001);\n const longitudeDelta = Math.max((east - west) * paddingFactor, 0.0001);\n const nativeZoom = calculateFitZoom(normalized, options);\n const fallbackZoom = estimateZoomLevel(latitudeDelta, longitudeDelta, options);\n\n return {\n center: {\n latitude: (north + south) / 2,\n longitude: (east + west) / 2,\n },\n bounds: {\n north,\n south,\n east,\n west,\n },\n span: {\n latitudeDelta,\n longitudeDelta,\n },\n recommendedZoom: nativeZoom ?? fallbackZoom,\n };\n}\n\n/**\n * 解析单个高德 polyline 环。\n *\n * 高德返回的 polyline 字符串通常为 `longitude,latitude;longitude,latitude`。\n * 这里会忽略空片段和非法坐标,避免单个异常点导致整个边界解析失败。\n * \n * @param polyline 高德 polyline 字符串。\n * @returns 解析后的 LatLng 点数组。\n */\nfunction parsePolylineRing(polyline: string): LatLng[] {\n if (!polyline.trim()) {\n return [];\n }\n\n return polyline\n .split(';')\n .map((segment) => segment.trim())\n .filter(Boolean)\n .map((segment) => {\n const [longitude, latitude] = segment.split(',').map((value) => Number(value.trim()));\n if (!Number.isFinite(longitude) || !Number.isFinite(latitude)) {\n return null;\n }\n\n return {\n latitude,\n longitude,\n };\n })\n .filter((point): point is LatLng => point !== null);\n}\n\n/**\n * 解析高德多环 polyline,并计算整体坐标边界。\n *\n * 常用于 AOI、行政区或多边形边界等场景。高德以 `|` 分隔多个环,\n * 每个环内部再以 `;` 分隔坐标点。\n * \n * @param polyline 高德 polyline 字符串。\n * @returns 解析后的 LatLng 点数组数组。\n */\nexport function parseMultiRingPolyline(polyline: string): MultiRingPolyline {\n // 高德 AOI / 多边形边界常见格式为 ring1|ring2,\n // 这里按“外环/内环”统一拆成二维坐标数组。\n const rings = polyline\n .split('|')\n .map((ring) => parsePolylineRing(ring))\n .filter((ring) => ring.length > 0);\n\n const flattened = rings.flat();\n const bounds = flattened.length\n ? {\n southwest: {\n latitude: Math.min(...flattened.map((point) => point.latitude)),\n longitude: Math.min(...flattened.map((point) => point.longitude)),\n },\n northeast: {\n latitude: Math.max(...flattened.map((point) => point.latitude)),\n longitude: Math.max(...flattened.map((point) => point.longitude)),\n },\n }\n : null;\n\n return {\n rings,\n bounds,\n };\n}\n\n/**\n * 将地图相机移动到能够完整展示指定坐标集合的位置。\n *\n * 单点场景直接定位到该点;多点场景会先计算路径边界,再移动到边界中心并应用推荐缩放。\n * 默认会沿用当前相机的 bearing 和 tilt,除非调用方显式关闭 preserveBearing / preserveTilt。\n * \n * @param map 高德地图实例。\n * @param points 路径点列表,每个点包含经纬度。\n * @param options 选项对象,包含移动时间、缓冲因子、视口宽度、视口高度、最小缩放级别、最大缩放级别。\n * @defaultOptions 默认选项值。\n */\nexport async function fitCameraToCoordinates(\n map: FitToCoordinatesTarget,\n points: LatLngPoint[],\n options: FitToCoordinatesOptions = {}\n): Promise<void> {\n // 高层相机适配:\n // 1. 单点时直接移动到该点;\n // 2. 多点时计算中心点与推荐缩放;\n // 3. 尽量保留当前朝向和俯仰,避免突兀跳变。\n const normalized = normalizeLatLngList(points) as LatLng[];\n if (normalized.length === 0) {\n return;\n }\n\n const currentCamera: Awaited<ReturnType<FitToCoordinatesTarget['getCameraPosition']>> =\n await map.getCameraPosition().catch(() => ({}));\n\n if (normalized.length === 1) {\n const single = normalizeLatLng(normalized[0]);\n await map.moveCamera(\n {\n target: single,\n zoom: options.singlePointZoom ?? currentCamera.zoom ?? DEFAULT_SINGLE_POINT_ZOOM,\n bearing: options.preserveBearing === false ? options.bearing : currentCamera.bearing ?? options.bearing,\n tilt: options.preserveTilt === false ? options.tilt : currentCamera.tilt ?? options.tilt,\n },\n options.duration ?? 0\n );\n return;\n }\n\n const routeBounds = getRouteBounds(normalized, options);\n if (!routeBounds) {\n return;\n }\n\n await map.moveCamera(\n {\n target: routeBounds.center,\n zoom: routeBounds.recommendedZoom,\n bearing: options.preserveBearing === false ? options.bearing : currentCamera.bearing ?? options.bearing,\n tilt: options.preserveTilt === false ? options.tilt : currentCamera.tilt ?? options.tilt,\n },\n options.duration ?? 0\n );\n}\n\n/**\n * 将路径点转换为高德地图通用的西南/东北矩形边界。\n * \n * @param points 路径点列表,每个点包含经纬度。\n * @returns 高德地图通用的西南/东北矩形边界。\n */\nexport function buildLatLngBounds(points: LatLngPoint[]): LatLngBounds | null {\n const routeBounds = getRouteBounds(points);\n if (!routeBounds) {\n return null;\n }\n\n return {\n southwest: {\n latitude: routeBounds.bounds.south,\n longitude: routeBounds.bounds.west,\n },\n northeast: {\n latitude: routeBounds.bounds.north,\n longitude: routeBounds.bounds.east,\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"RouteUtils.js","sourceRoot":"","sources":["../../src/utils/RouteUtils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 路线与区域展示相关的工具函数。\n *\n * 本文件主要负责路径坐标的边界计算、推荐缩放级别估算、\n * 高德 polyline / 多环边界字符串解析,以及将地图相机移动到合适的展示范围。\n * 这些逻辑用于在 JS 层统一处理路线回放、区域遮罩和路径自适应视野等场景。\n */\nimport ExpoGaodeMapModule from '../ExpoGaodeMapModule';\nimport type { LatLng, LatLngBounds, LatLngPoint } from '../types/common.types';\nimport type {\n FitToCoordinatesOptions,\n FitToCoordinatesTarget,\n MultiRingPolyline,\n RouteBounds,\n} from '../types/route-playback.types';\nimport { normalizeLatLngList } from './GeoUtils';\n\nconst MIN_ZOOM = 3; // 最小缩放级别\nconst MAX_ZOOM = 20; // 最大缩放级别\nconst DEFAULT_SINGLE_POINT_ZOOM = 16; // 默认单点缩放级别\nconst DEFAULT_PADDING_FACTOR = 1.2; // 默认缓冲因子\nconst DEFAULT_VIEWPORT_WIDTH_PX = 390; // 默认视口宽度(像素)\nconst DEFAULT_VIEWPORT_HEIGHT_PX = 844; // 默认视口高度(像素)\nconst DEFAULT_PADDING_PX = 48; // 默认缓冲值(像素)\n\n/**\n * 将缩放缓冲因子换算成地图四周需要预留的像素 padding。\n *\n * paddingFactor 表示“视野比实际路径范围放大多少倍”:\n * - 1 表示不额外留白;\n * - 1.2 表示路径只占视口中间约 83%,四周留出约 8.3% 的空白。\n *\n * @param paddingFactor 缓冲因子,必须大于 1 才会产生 padding。\n * @param viewportWidthPx 视口宽度,单位像素。\n * @param viewportHeightPx 视口高度,单位像素。\n * @returns 以较短边计算得到的单边 padding,单位像素。\n */\nfunction paddingFactorToPaddingPx(\n paddingFactor: number,\n viewportWidthPx: number,\n viewportHeightPx: number\n): number {\n if (!Number.isFinite(paddingFactor) || paddingFactor <= 1) {\n return 0;\n }\n const paddingRatio = (1 - 1 / paddingFactor) / 2;\n return Math.max(0, Math.min(viewportWidthPx, viewportHeightPx) * paddingRatio);\n}\n\n/**\n * 优先调用原生模块计算适配一组坐标的推荐缩放级别。\n *\n * 原生侧通常能结合地图 SDK 的投影与缩放规则给出更接近真实显示效果的 zoom。\n * 如果原生模块不可用或计算失败,返回 null,由上层使用纯 TS 估算逻辑兜底。\n *\n * @param points 路径点列表,每个点包含经纬度。\n * @param options 选项对象,包含缓冲因子、视口宽度、视口高度、最小缩放级别、最大缩放级别。\n * @defaultOptions 默认选项值。\n * @returns 推荐缩放级别,可能为 null。\n */\nfunction calculateFitZoom(\n points: LatLng[],\n options: Pick<\n FitToCoordinatesOptions,\n 'paddingFactor' | 'paddingPx' | 'viewportWidthPx' | 'viewportHeightPx' | 'minZoom' | 'maxZoom'\n >\n): number | null {\n if (points.length === 0) {\n return null;\n }\n\n const viewportWidthPx = options.viewportWidthPx ?? DEFAULT_VIEWPORT_WIDTH_PX;\n const viewportHeightPx = options.viewportHeightPx ?? DEFAULT_VIEWPORT_HEIGHT_PX;\n const paddingFromFactor = paddingFactorToPaddingPx(\n options.paddingFactor ?? DEFAULT_PADDING_FACTOR,\n viewportWidthPx,\n viewportHeightPx\n );\n const paddingPx = options.paddingPx ?? (paddingFromFactor > 0 ? paddingFromFactor : DEFAULT_PADDING_PX);\n\n try {\n return ExpoGaodeMapModule.calculateFitZoom(points, {\n viewportWidthPx,\n viewportHeightPx,\n paddingPx,\n minZoom: options.minZoom,\n maxZoom: options.maxZoom,\n });\n } catch {\n return null;\n }\n}\n\n/**\n * 估算路径的推荐缩放级别\n * @param {number} latitudeDelta - 纬度跨度(度)\n * @param {number} longitudeDelta - 经度跨度(度)\n * @param {FitToCoordinatesOptions} options - 选项对象,包含最小缩放级别、最大缩放级别\n * @defaultOptions 默认选项值\n * @returns {number} - 推荐缩放级别\n */\nexport function estimateZoomLevel(\n latitudeDelta: number,\n longitudeDelta: number,\n options: Pick<FitToCoordinatesOptions, 'minZoom' | 'maxZoom'> = {}\n): number {\n // 使用经纬度跨度估算一个“足够看全路径”的缩放级别。\n // 这是高层 TS 兜底逻辑,不依赖具体原生 SDK 的 fitBounds 能力。\n const span = Math.max(latitudeDelta, longitudeDelta, 0.0001);\n const rawZoom = Math.log2(360 / span);\n const minZoom = options.minZoom ?? MIN_ZOOM;\n const maxZoom = options.maxZoom ?? MAX_ZOOM;\n return Math.max(minZoom, Math.min(maxZoom, Number(rawZoom.toFixed(2))));\n}\n\n/**\n * 根据路径点计算地图展示所需的中心点、外接矩形、经纬度跨度和推荐缩放级别。\n *\n * 该函数会先统一坐标格式,再根据所有点的最南/北/东/西位置生成边界。\n * recommendedZoom 优先使用原生计算结果,失败时退回到经纬度跨度估算。\n * \n * @param points 路径点列表,每个点包含经纬度。\n * @param options 选项对象,包含缓冲因子、视口宽度、视口高度、最小缩放级别、最大缩放级别。\n * @defaultOptions 默认选项值。\n * @returns 推荐缩放级别,可能为 null。\n */\nexport function getRouteBounds(\n points: LatLngPoint[],\n options: Pick<\n FitToCoordinatesOptions,\n 'paddingFactor' | 'paddingPx' | 'viewportWidthPx' | 'viewportHeightPx' | 'minZoom' | 'maxZoom'\n > = {}\n): RouteBounds | null {\n // 统一将路径点转换为对象坐标,再计算中心点、边界和推荐缩放。\n const normalized = normalizeLatLngList(points) as LatLng[];\n if (normalized.length === 0) {\n return null;\n }\n\n const latitudes = normalized.map((point) => point.latitude);\n const longitudes = normalized.map((point) => point.longitude);\n\n const north = Math.max(...latitudes);\n const south = Math.min(...latitudes);\n const east = Math.max(...longitudes);\n const west = Math.min(...longitudes);\n const paddingFactor = options.paddingFactor ?? DEFAULT_PADDING_FACTOR;\n const latitudeDelta = Math.max((north - south) * paddingFactor, 0.0001);\n const longitudeDelta = Math.max((east - west) * paddingFactor, 0.0001);\n const nativeZoom = calculateFitZoom(normalized, options);\n const fallbackZoom = estimateZoomLevel(latitudeDelta, longitudeDelta, options);\n\n return {\n center: {\n latitude: (north + south) / 2,\n longitude: (east + west) / 2,\n },\n bounds: {\n north,\n south,\n east,\n west,\n },\n span: {\n latitudeDelta,\n longitudeDelta,\n },\n recommendedZoom: nativeZoom ?? fallbackZoom,\n };\n}\n\n/**\n * 解析单个高德 polyline 环。\n *\n * 高德返回的 polyline 字符串通常为 `longitude,latitude;longitude,latitude`。\n * 这里会忽略空片段和非法坐标,避免单个异常点导致整个边界解析失败。\n * \n * @param polyline 高德 polyline 字符串。\n * @returns 解析后的 LatLng 点数组。\n */\nfunction parsePolylineRing(polyline: string): LatLng[] {\n if (!polyline.trim()) {\n return [];\n }\n\n return polyline\n .split(';')\n .map((segment) => segment.trim())\n .filter(Boolean)\n .map((segment) => {\n const [longitude, latitude] = segment.split(',').map((value) => Number(value.trim()));\n if (!Number.isFinite(longitude) || !Number.isFinite(latitude)) {\n return null;\n }\n\n return {\n latitude,\n longitude,\n };\n })\n .filter((point): point is LatLng => point !== null);\n}\n\n/**\n * 解析高德多环 polyline,并计算整体坐标边界。\n *\n * 常用于 AOI、行政区或多边形边界等场景。高德以 `|` 分隔多个环,\n * 每个环内部再以 `;` 分隔坐标点。\n * \n * @param polyline 高德 polyline 字符串。\n * @returns 解析后的 LatLng 点数组数组。\n */\nexport function parseMultiRingPolyline(polyline: string): MultiRingPolyline {\n // 高德 AOI / 多边形边界常见格式为 ring1|ring2,\n // 这里按“外环/内环”统一拆成二维坐标数组。\n const rings = polyline\n .split('|')\n .map((ring) => parsePolylineRing(ring))\n .filter((ring) => ring.length > 0);\n\n const flattened = rings.flat();\n const bounds = flattened.length\n ? {\n southwest: {\n latitude: Math.min(...flattened.map((point) => point.latitude)),\n longitude: Math.min(...flattened.map((point) => point.longitude)),\n },\n northeast: {\n latitude: Math.max(...flattened.map((point) => point.latitude)),\n longitude: Math.max(...flattened.map((point) => point.longitude)),\n },\n }\n : null;\n\n return {\n rings,\n bounds,\n };\n}\n\n/**\n * 将地图相机移动到能够完整展示指定坐标集合的位置。\n *\n * 单点场景直接定位到该点;多点场景会先计算路径边界,再移动到边界中心并应用推荐缩放。\n * 默认会沿用当前相机的 bearing 和 tilt,除非调用方显式关闭 preserveBearing / preserveTilt。\n * \n * @param map 高德地图实例。\n * @param points 路径点列表,每个点包含经纬度。\n * @param options 选项对象,包含移动时间、缓冲因子、视口宽度、视口高度、最小缩放级别、最大缩放级别。\n * @defaultOptions 默认选项值。\n */\nexport async function fitCameraToCoordinates(\n map: FitToCoordinatesTarget,\n points: LatLngPoint[],\n options: FitToCoordinatesOptions = {}\n): Promise<void> {\n // 高层相机适配:\n // 1. 单点时直接移动到该点;\n // 2. 多点时计算中心点与推荐缩放;\n // 3. 尽量保留当前朝向和俯仰,避免突兀跳变。\n const normalized = normalizeLatLngList(points) as LatLng[];\n if (normalized.length === 0) {\n return;\n }\n\n const currentCamera: Awaited<ReturnType<FitToCoordinatesTarget['getCameraPosition']>> =\n await map.getCameraPosition().catch(() => ({}));\n\n if (normalized.length === 1) {\n const single = normalized[0];\n if (!single) {\n return;\n }\n await map.moveCamera(\n {\n target: single,\n zoom: options.singlePointZoom ?? currentCamera.zoom ?? DEFAULT_SINGLE_POINT_ZOOM,\n bearing: options.preserveBearing === false ? options.bearing : currentCamera.bearing ?? options.bearing,\n tilt: options.preserveTilt === false ? options.tilt : currentCamera.tilt ?? options.tilt,\n },\n options.duration ?? 0\n );\n return;\n }\n\n const routeBounds = getRouteBounds(normalized, options);\n if (!routeBounds) {\n return;\n }\n\n await map.moveCamera(\n {\n target: routeBounds.center,\n zoom: routeBounds.recommendedZoom,\n bearing: options.preserveBearing === false ? options.bearing : currentCamera.bearing ?? options.bearing,\n tilt: options.preserveTilt === false ? options.tilt : currentCamera.tilt ?? options.tilt,\n },\n options.duration ?? 0\n );\n}\n\n/**\n * 将路径点转换为高德地图通用的西南/东北矩形边界。\n * \n * @param points 路径点列表,每个点包含经纬度。\n * @returns 高德地图通用的西南/东北矩形边界。\n */\nexport function buildLatLngBounds(points: LatLngPoint[]): LatLngBounds | null {\n const routeBounds = getRouteBounds(points);\n if (!routeBounds) {\n return null;\n }\n\n return {\n southwest: {\n latitude: routeBounds.bounds.south,\n longitude: routeBounds.bounds.west,\n },\n northeast: {\n latitude: routeBounds.bounds.north,\n longitude: routeBounds.bounds.east,\n },\n };\n}\n"]}
|
|
@@ -28,6 +28,12 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
|
|
|
28
28
|
var showsScale: Bool = true
|
|
29
29
|
/// 是否启用缩放手势
|
|
30
30
|
var isZoomEnabled: Bool = true
|
|
31
|
+
/// 缩放手势锚点:gesture 跟随手势中心点;center 固定地图中心点
|
|
32
|
+
var zoomGestureAnchor: String = "gesture" {
|
|
33
|
+
didSet {
|
|
34
|
+
applyZoomGestureSettings()
|
|
35
|
+
}
|
|
36
|
+
}
|
|
31
37
|
/// 是否启用滚动手势
|
|
32
38
|
var isScrollEnabled: Bool = true
|
|
33
39
|
/// 是否启用旋转手势
|
|
@@ -113,9 +119,15 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
|
|
|
113
119
|
private var pendingCameraMoveData: [String: Any]?
|
|
114
120
|
private var cameraMoveDispatchWorkItem: DispatchWorkItem?
|
|
115
121
|
private var lastCameraMoveDispatchTime: CFTimeInterval = 0
|
|
122
|
+
/// iOS 缩放惯性/连续 setZoom 可能多次触发 regionDidChange,合并后再派发 idle。
|
|
123
|
+
private var pendingCameraIdleData: [String: Any]?
|
|
124
|
+
private var cameraIdleDispatchWorkItem: DispatchWorkItem?
|
|
125
|
+
private let cameraIdleDebounceMs = 160
|
|
116
126
|
|
|
117
127
|
/// 缩放手势识别器(用于模拟惯性)
|
|
118
128
|
private var pinchGesture: UIPinchGestureRecognizer!
|
|
129
|
+
private var centerAnchoredPinchStartZoom: CGFloat?
|
|
130
|
+
private var centerAnchoredZoomCoordinate: CLLocationCoordinate2D?
|
|
119
131
|
|
|
120
132
|
// 惯性动画相关属性
|
|
121
133
|
private var displayLink: CADisplayLink?
|
|
@@ -361,12 +373,11 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
|
|
|
361
373
|
uiManager.setMapType(1)
|
|
362
374
|
uiManager.setShowsScale(showsScale)
|
|
363
375
|
uiManager.setShowsCompass(showsCompass)
|
|
364
|
-
|
|
376
|
+
applyZoomGestureSettings()
|
|
365
377
|
uiManager.setScrollEnabled(isScrollEnabled)
|
|
366
378
|
uiManager.setRotateEnabled(isRotateEnabled)
|
|
367
379
|
uiManager.setTiltEnabled(isTiltEnabled)
|
|
368
380
|
uiManager.setShowsUserLocation(showsUserLocation, followUser: followUserLocation)
|
|
369
|
-
updatePinchGestureState()
|
|
370
381
|
}
|
|
371
382
|
|
|
372
383
|
/**
|
|
@@ -390,7 +401,7 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
|
|
|
390
401
|
|
|
391
402
|
uiManager.setShowsScale(showsScale)
|
|
392
403
|
uiManager.setShowsCompass(showsCompass)
|
|
393
|
-
|
|
404
|
+
applyZoomGestureSettings()
|
|
394
405
|
uiManager.setScrollEnabled(isScrollEnabled)
|
|
395
406
|
uiManager.setRotateEnabled(isRotateEnabled)
|
|
396
407
|
uiManager.setTiltEnabled(isTiltEnabled)
|
|
@@ -398,13 +409,12 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
|
|
|
398
409
|
uiManager.setShowsTraffic(showsTraffic)
|
|
399
410
|
uiManager.setShowsBuildings(showsBuildings)
|
|
400
411
|
uiManager.setShowsIndoorMap(showsIndoorMap)
|
|
401
|
-
updatePinchGestureState()
|
|
402
412
|
mapView.distanceFilter = distanceFilter
|
|
403
413
|
mapView.headingFilter = headingFilter
|
|
404
414
|
if let customMapStyleData {
|
|
405
415
|
uiManager.setCustomMapStyle(customMapStyleData)
|
|
406
416
|
}
|
|
407
|
-
|
|
417
|
+
|
|
408
418
|
// 更新苹果地图样式
|
|
409
419
|
updateAppleMapStyle()
|
|
410
420
|
|
|
@@ -439,6 +449,13 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
|
|
|
439
449
|
// MARK: - 手势处理
|
|
440
450
|
|
|
441
451
|
@objc func handlePinch(_ gesture: UIPinchGestureRecognizer) {
|
|
452
|
+
guard isZoomEnabled else { return }
|
|
453
|
+
|
|
454
|
+
if zoomGestureAnchor == "center" {
|
|
455
|
+
handleCenterAnchoredPinch(gesture)
|
|
456
|
+
return
|
|
457
|
+
}
|
|
458
|
+
|
|
442
459
|
if gesture.state == .began {
|
|
443
460
|
// 手势开始,立即停止之前的惯性动画,避免冲突
|
|
444
461
|
stopInertiaAnimation()
|
|
@@ -455,6 +472,44 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
|
|
|
455
472
|
}
|
|
456
473
|
}
|
|
457
474
|
}
|
|
475
|
+
|
|
476
|
+
private func handleCenterAnchoredPinch(_ gesture: UIPinchGestureRecognizer) {
|
|
477
|
+
switch gesture.state {
|
|
478
|
+
case .began:
|
|
479
|
+
stopInertiaAnimation()
|
|
480
|
+
centerAnchoredPinchStartZoom = mapView.zoomLevel
|
|
481
|
+
centerAnchoredZoomCoordinate = mapView.centerCoordinate
|
|
482
|
+
case .changed:
|
|
483
|
+
let startZoom = centerAnchoredPinchStartZoom ?? mapView.zoomLevel
|
|
484
|
+
let center = centerAnchoredZoomCoordinate ?? mapView.centerCoordinate
|
|
485
|
+
let zoomDelta = log2(Double(max(gesture.scale, 0.0001)))
|
|
486
|
+
applyCenterAnchoredZoom(CGFloat(Double(startZoom) + zoomDelta), center: center)
|
|
487
|
+
case .ended, .cancelled, .failed:
|
|
488
|
+
centerAnchoredPinchStartZoom = nil
|
|
489
|
+
let velocity = gesture.velocity
|
|
490
|
+
if abs(velocity) > 0.1 {
|
|
491
|
+
zoomVelocity = Double(velocity) * 0.02
|
|
492
|
+
if centerAnchoredZoomCoordinate == nil {
|
|
493
|
+
centerAnchoredZoomCoordinate = mapView.centerCoordinate
|
|
494
|
+
}
|
|
495
|
+
startInertiaAnimation()
|
|
496
|
+
} else {
|
|
497
|
+
centerAnchoredZoomCoordinate = nil
|
|
498
|
+
}
|
|
499
|
+
default:
|
|
500
|
+
break
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
private func applyCenterAnchoredZoom(_ zoom: CGFloat, center: CLLocationCoordinate2D) {
|
|
505
|
+
let validZoom = max(mapView.minZoomLevel, min(mapView.maxZoomLevel, zoom))
|
|
506
|
+
let status = MAMapStatus()
|
|
507
|
+
status.centerCoordinate = center
|
|
508
|
+
status.zoomLevel = validZoom
|
|
509
|
+
status.rotationDegree = mapView.rotationDegree
|
|
510
|
+
status.cameraDegree = mapView.cameraDegree
|
|
511
|
+
mapView.setMapStatus(status, animated: false, duration: 0)
|
|
512
|
+
}
|
|
458
513
|
|
|
459
514
|
private func startInertiaAnimation() {
|
|
460
515
|
stopInertiaAnimation()
|
|
@@ -476,12 +531,21 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
|
|
|
476
531
|
// 碰到边界,停止动画
|
|
477
532
|
newZoom = max(mapView.minZoomLevel, min(mapView.maxZoomLevel, newZoom))
|
|
478
533
|
stopInertiaAnimation()
|
|
479
|
-
|
|
534
|
+
if zoomGestureAnchor == "center" {
|
|
535
|
+
applyCenterAnchoredZoom(newZoom, center: centerAnchoredZoomCoordinate ?? mapView.centerCoordinate)
|
|
536
|
+
centerAnchoredZoomCoordinate = nil
|
|
537
|
+
} else {
|
|
538
|
+
mapView.setZoomLevel(newZoom, animated: false)
|
|
539
|
+
}
|
|
480
540
|
return
|
|
481
541
|
}
|
|
482
542
|
|
|
483
543
|
// 更新地图缩放级别(animated: false 以保证逐帧控制的流畅性)
|
|
484
|
-
|
|
544
|
+
if zoomGestureAnchor == "center" {
|
|
545
|
+
applyCenterAnchoredZoom(newZoom, center: centerAnchoredZoomCoordinate ?? mapView.centerCoordinate)
|
|
546
|
+
} else {
|
|
547
|
+
mapView.setZoomLevel(newZoom, animated: false)
|
|
548
|
+
}
|
|
485
549
|
|
|
486
550
|
// 减速(应用摩擦力)
|
|
487
551
|
zoomVelocity *= friction
|
|
@@ -489,6 +553,7 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
|
|
|
489
553
|
// 停止条件
|
|
490
554
|
if abs(zoomVelocity) < velocityThreshold {
|
|
491
555
|
stopInertiaAnimation()
|
|
556
|
+
centerAnchoredZoomCoordinate = nil
|
|
492
557
|
}
|
|
493
558
|
}
|
|
494
559
|
|
|
@@ -806,6 +871,9 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
|
|
|
806
871
|
pendingCameraMoveData = nil
|
|
807
872
|
cameraMoveDispatchWorkItem?.cancel()
|
|
808
873
|
cameraMoveDispatchWorkItem = nil
|
|
874
|
+
pendingCameraIdleData = nil
|
|
875
|
+
cameraIdleDispatchWorkItem?.cancel()
|
|
876
|
+
cameraIdleDispatchWorkItem = nil
|
|
809
877
|
if let privacyObserver {
|
|
810
878
|
NotificationCenter.default.removeObserver(privacyObserver)
|
|
811
879
|
}
|
|
@@ -879,13 +947,20 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
|
|
|
879
947
|
pinchGesture.delegate = self
|
|
880
948
|
resolvedMapView.addGestureRecognizer(pinchGesture)
|
|
881
949
|
self.pinchGesture = pinchGesture
|
|
882
|
-
|
|
950
|
+
applyZoomGestureSettings()
|
|
883
951
|
}
|
|
884
952
|
|
|
885
|
-
private func
|
|
953
|
+
private func applyZoomGestureSettings() {
|
|
954
|
+
uiManager?.setZoomEnabled(isZoomEnabled && zoomGestureAnchor != "center")
|
|
886
955
|
pinchGesture?.isEnabled = isZoomEnabled
|
|
956
|
+
if zoomGestureAnchor != "center" {
|
|
957
|
+
centerAnchoredPinchStartZoom = nil
|
|
958
|
+
centerAnchoredZoomCoordinate = nil
|
|
959
|
+
}
|
|
887
960
|
if !isZoomEnabled {
|
|
888
961
|
stopInertiaAnimation()
|
|
962
|
+
centerAnchoredPinchStartZoom = nil
|
|
963
|
+
centerAnchoredZoomCoordinate = nil
|
|
889
964
|
}
|
|
890
965
|
}
|
|
891
966
|
}
|
|
@@ -958,7 +1033,7 @@ extension ExpoGaodeMapView {
|
|
|
958
1033
|
*/
|
|
959
1034
|
public func mapView(_ mapView: MAMapView, regionDidChangeAnimated animated: Bool) {
|
|
960
1035
|
flushPendingCameraMoveEvent()
|
|
961
|
-
|
|
1036
|
+
scheduleCameraIdleEvent(buildCameraEventData(for: mapView))
|
|
962
1037
|
|
|
963
1038
|
// 这里的 overlayViews 是 [UIView] 类型,可能包含 ClusterView
|
|
964
1039
|
for view in overlayViews {
|
|
@@ -1038,6 +1113,27 @@ extension ExpoGaodeMapView {
|
|
|
1038
1113
|
lastCameraMoveDispatchTime = timestamp
|
|
1039
1114
|
onCameraMove(eventData)
|
|
1040
1115
|
}
|
|
1116
|
+
|
|
1117
|
+
private func scheduleCameraIdleEvent(_ eventData: [String: Any]) {
|
|
1118
|
+
pendingCameraIdleData = eventData
|
|
1119
|
+
cameraIdleDispatchWorkItem?.cancel()
|
|
1120
|
+
|
|
1121
|
+
let workItem = DispatchWorkItem { [weak self] in
|
|
1122
|
+
guard let self = self, let latestEventData = self.pendingCameraIdleData else {
|
|
1123
|
+
return
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
self.pendingCameraIdleData = nil
|
|
1127
|
+
self.cameraIdleDispatchWorkItem = nil
|
|
1128
|
+
self.onCameraIdle(latestEventData)
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
cameraIdleDispatchWorkItem = workItem
|
|
1132
|
+
DispatchQueue.main.asyncAfter(
|
|
1133
|
+
deadline: .now() + Double(cameraIdleDebounceMs) / 1000.0,
|
|
1134
|
+
execute: workItem
|
|
1135
|
+
)
|
|
1136
|
+
}
|
|
1041
1137
|
|
|
1042
1138
|
/**
|
|
1043
1139
|
* 地图单击事件
|
|
@@ -43,6 +43,11 @@ public class ExpoGaodeMapViewModule: Module {
|
|
|
43
43
|
Prop("zoomGesturesEnabled") { (view: ExpoGaodeMapView, enabled: Bool) in
|
|
44
44
|
view.isZoomEnabled = enabled
|
|
45
45
|
}
|
|
46
|
+
|
|
47
|
+
// 缩放手势锚点:gesture 使用手势焦点,center 固定地图中心点
|
|
48
|
+
Prop("zoomGestureAnchor") { (view: ExpoGaodeMapView, anchor: String?) in
|
|
49
|
+
view.zoomGestureAnchor = anchor == "center" ? "center" : "gesture"
|
|
50
|
+
}
|
|
46
51
|
|
|
47
52
|
Prop("scrollGesturesEnabled") { (view: ExpoGaodeMapView, enabled: Bool) in
|
|
48
53
|
view.isScrollEnabled = enabled
|