expo-gaode-map-navigation 1.1.5-next.1 → 1.1.5-next.3

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 (136) hide show
  1. package/android/build.gradle +10 -0
  2. package/android/src/main/cpp/CMakeLists.txt +24 -0
  3. package/android/src/main/cpp/cluster_jni.cpp +848 -0
  4. package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapModule.kt +616 -92
  5. package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapOfflineModule.kt +493 -0
  6. package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapView.kt +230 -14
  7. package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapViewModule.kt +37 -27
  8. package/android/src/main/java/expo/modules/gaodemap/map/MapPreloadManager.kt +494 -0
  9. package/android/src/main/java/expo/modules/gaodemap/map/companion/BitmapDescriptorCache.kt +30 -0
  10. package/android/src/main/java/expo/modules/gaodemap/map/companion/IconBitmapCache.kt +37 -0
  11. package/android/src/main/java/expo/modules/gaodemap/map/managers/UIManager.kt +76 -0
  12. package/android/src/main/java/expo/modules/gaodemap/map/modules/LocationManager.kt +15 -3
  13. package/android/src/main/java/expo/modules/gaodemap/map/modules/SDKInitializer.kt +4 -59
  14. package/android/src/main/java/expo/modules/gaodemap/map/overlays/CircleView.kt +9 -12
  15. package/android/src/main/java/expo/modules/gaodemap/map/overlays/CircleViewModule.kt +5 -6
  16. package/android/src/main/java/expo/modules/gaodemap/map/overlays/ClusterView.kt +539 -66
  17. package/android/src/main/java/expo/modules/gaodemap/map/overlays/ClusterViewModule.kt +17 -1
  18. package/android/src/main/java/expo/modules/gaodemap/map/overlays/HeatMapView.kt +165 -33
  19. package/android/src/main/java/expo/modules/gaodemap/map/overlays/HeatMapViewModule.kt +15 -3
  20. package/android/src/main/java/expo/modules/gaodemap/map/overlays/MarkerView.kt +1249 -672
  21. package/android/src/main/java/expo/modules/gaodemap/map/overlays/MarkerViewModule.kt +40 -17
  22. package/android/src/main/java/expo/modules/gaodemap/map/overlays/MultiPointView.kt +177 -22
  23. package/android/src/main/java/expo/modules/gaodemap/map/overlays/MultiPointViewModule.kt +11 -3
  24. package/android/src/main/java/expo/modules/gaodemap/map/overlays/PolygonView.kt +57 -14
  25. package/android/src/main/java/expo/modules/gaodemap/map/overlays/PolygonViewModule.kt +9 -5
  26. package/android/src/main/java/expo/modules/gaodemap/map/overlays/PolylineView.kt +90 -63
  27. package/android/src/main/java/expo/modules/gaodemap/map/overlays/PolylineViewModule.kt +7 -3
  28. package/android/src/main/java/expo/modules/gaodemap/map/services/LocationForegroundService.kt +3 -2
  29. package/android/src/main/java/expo/modules/gaodemap/map/utils/BitmapDescriptorCache.kt +20 -0
  30. package/android/src/main/java/expo/modules/gaodemap/map/utils/ClusterNative.kt +13 -0
  31. package/android/src/main/java/expo/modules/gaodemap/map/utils/ColorParser.kt +20 -0
  32. package/android/src/main/java/expo/modules/gaodemap/map/utils/GeometryUtils.kt +515 -0
  33. package/android/src/main/java/expo/modules/gaodemap/map/utils/LatLngParser.kt +91 -0
  34. package/android/src/main/java/expo/modules/gaodemap/map/utils/PermissionHelper.kt +248 -0
  35. package/build/ExpoGaodeMapNaviView.d.ts +7 -7
  36. package/build/ExpoGaodeMapNaviView.js +8 -8
  37. package/build/ExpoGaodeMapNavigationModule.d.ts +2 -1
  38. package/build/index.d.ts +35 -33
  39. package/build/index.js +70 -106
  40. package/build/map/ExpoGaodeMapModule.d.ts +2 -201
  41. package/build/map/ExpoGaodeMapModule.js +584 -14
  42. package/build/map/ExpoGaodeMapOfflineModule.d.ts +139 -0
  43. package/build/map/ExpoGaodeMapOfflineModule.js +8 -0
  44. package/build/map/ExpoGaodeMapView.js +66 -58
  45. package/build/map/components/FoldableMapView.d.ts +38 -0
  46. package/build/map/components/FoldableMapView.js +209 -0
  47. package/build/map/components/MapContext.d.ts +12 -0
  48. package/build/map/components/MapContext.js +54 -0
  49. package/build/map/components/MapUI.d.ts +18 -0
  50. package/build/map/components/MapUI.js +29 -0
  51. package/build/map/components/overlays/Circle.js +34 -3
  52. package/build/map/components/overlays/Cluster.d.ts +3 -1
  53. package/build/map/components/overlays/Cluster.js +31 -2
  54. package/build/map/components/overlays/HeatMap.d.ts +3 -1
  55. package/build/map/components/overlays/HeatMap.js +33 -3
  56. package/build/map/components/overlays/Marker.d.ts +1 -1
  57. package/build/map/components/overlays/Marker.js +37 -32
  58. package/build/map/components/overlays/MultiPoint.js +1 -1
  59. package/build/map/components/overlays/Polygon.js +30 -3
  60. package/build/map/components/overlays/Polyline.js +36 -3
  61. package/build/map/index.d.ts +25 -5
  62. package/build/map/index.js +59 -18
  63. package/build/map/types/common.types.d.ts +40 -0
  64. package/build/map/types/common.types.js +0 -4
  65. package/build/map/types/index.d.ts +3 -2
  66. package/build/map/types/map-view.types.d.ts +108 -3
  67. package/build/map/types/native-module.types.d.ts +363 -0
  68. package/build/map/types/native-module.types.js +5 -0
  69. package/build/map/types/offline.types.d.ts +132 -0
  70. package/build/map/types/offline.types.js +5 -0
  71. package/build/map/types/overlays.types.d.ts +137 -24
  72. package/build/map/utils/ErrorHandler.d.ts +110 -0
  73. package/build/map/utils/ErrorHandler.js +421 -0
  74. package/build/map/utils/GeoUtils.d.ts +20 -0
  75. package/build/map/utils/GeoUtils.js +76 -0
  76. package/build/map/utils/OfflineMapManager.d.ts +148 -0
  77. package/build/map/utils/OfflineMapManager.js +217 -0
  78. package/build/map/utils/PermissionUtils.d.ts +91 -0
  79. package/build/map/utils/PermissionUtils.js +255 -0
  80. package/build/map/utils/PlatformDetector.d.ts +102 -0
  81. package/build/map/utils/PlatformDetector.js +186 -0
  82. package/build/types/index.d.ts +1 -0
  83. package/build/types/index.js +1 -0
  84. package/build/types/native-module.types.d.ts +69 -0
  85. package/build/types/native-module.types.js +2 -0
  86. package/build/types/naviview.types.d.ts +1 -1
  87. package/expo-module.config.json +12 -10
  88. package/ios/ExpoGaodeMapNavigation.podspec +9 -0
  89. package/ios/map/ExpoGaodeMapModule.swift +485 -75
  90. package/ios/map/ExpoGaodeMapOfflineModule.swift +479 -0
  91. package/ios/map/ExpoGaodeMapView.swift +611 -62
  92. package/ios/map/ExpoGaodeMapViewModule.swift +48 -26
  93. package/ios/map/MapPreloadManager.swift +348 -0
  94. package/ios/map/cpp/ClusterEngine.cpp +110 -0
  95. package/ios/map/cpp/ClusterEngine.hpp +20 -0
  96. package/ios/map/cpp/ColorParser.cpp +135 -0
  97. package/ios/map/cpp/ColorParser.hpp +14 -0
  98. package/ios/map/cpp/GeometryEngine.cpp +574 -0
  99. package/ios/map/cpp/GeometryEngine.hpp +159 -0
  100. package/ios/map/cpp/QuadTree.cpp +92 -0
  101. package/ios/map/cpp/QuadTree.hpp +42 -0
  102. package/ios/map/cpp/README.md +55 -0
  103. package/ios/map/cpp/tests/benchmark_js.js +41 -0
  104. package/ios/map/cpp/tests/run.sh +17 -0
  105. package/ios/map/cpp/tests/test_main.cpp +276 -0
  106. package/ios/map/managers/UIManager.swift +72 -1
  107. package/ios/map/modules/LocationManager.swift +114 -165
  108. package/ios/map/overlays/CircleView.swift +16 -32
  109. package/ios/map/overlays/CircleViewModule.swift +12 -12
  110. package/ios/map/overlays/ClusterAnnotation.swift +32 -0
  111. package/ios/map/overlays/ClusterView.swift +331 -45
  112. package/ios/map/overlays/ClusterViewModule.swift +20 -6
  113. package/ios/map/overlays/HeatMapView.swift +135 -32
  114. package/ios/map/overlays/HeatMapViewModule.swift +20 -8
  115. package/ios/map/overlays/MarkerView.swift +613 -130
  116. package/ios/map/overlays/MarkerViewModule.swift +38 -18
  117. package/ios/map/overlays/MultiPointView.swift +168 -10
  118. package/ios/map/overlays/MultiPointViewModule.swift +27 -5
  119. package/ios/map/overlays/PolygonView.swift +62 -23
  120. package/ios/map/overlays/PolygonViewModule.swift +18 -12
  121. package/ios/map/overlays/PolylineView.swift +21 -13
  122. package/ios/map/overlays/PolylineViewModule.swift +18 -12
  123. package/ios/map/utils/ClusterNative.h +96 -0
  124. package/ios/map/utils/ClusterNative.mm +377 -0
  125. package/ios/map/utils/ColorParser.swift +12 -1
  126. package/ios/map/utils/CppBridging.mm +13 -0
  127. package/ios/map/utils/GeometryUtils.swift +34 -0
  128. package/ios/map/utils/LatLngParser.swift +87 -0
  129. package/ios/map/utils/PermissionManager.swift +135 -6
  130. package/package.json +1 -1
  131. package/build/map/ExpoGaodeMap.types.d.ts +0 -41
  132. package/build/map/ExpoGaodeMap.types.js +0 -24
  133. package/build/map/utils/EventManager.d.ts +0 -10
  134. package/build/map/utils/EventManager.js +0 -26
  135. package/build/map/utils/ModuleLoader.d.ts +0 -73
  136. package/build/map/utils/ModuleLoader.js +0 -112
@@ -35,7 +35,8 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  const React = __importStar(require("react"));
37
37
  const expo_modules_core_1 = require("expo-modules-core");
38
- const NativeCircleView = (0, expo_modules_core_1.requireNativeViewManager)('NaviCircleView');
38
+ const GeoUtils_1 = require("../../utils/GeoUtils");
39
+ const NativeCircleView = (0, expo_modules_core_1.requireNativeViewManager)('CircleView');
39
40
  /**
40
41
  * 高德地图圆形覆盖物组件(声明式)
41
42
  *
@@ -44,7 +45,37 @@ const NativeCircleView = (0, expo_modules_core_1.requireNativeViewManager)('Navi
44
45
  * @returns 渲染原生圆形组件
45
46
  */
46
47
  function Circle(props) {
47
- return <NativeCircleView {...props}/>;
48
+ const { center, ...restProps } = props;
49
+ const normalizedCenter = (0, GeoUtils_1.normalizeLatLng)(center);
50
+ return (<NativeCircleView center={normalizedCenter} {...restProps}/>);
51
+ }
52
+ /**
53
+ * 🔑 性能优化:浅比较关键属性
54
+ */
55
+ function arePropsEqual(prevProps, nextProps) {
56
+ // 比较中心点坐标
57
+ const prevCenter = (0, GeoUtils_1.normalizeLatLng)(prevProps.center);
58
+ const nextCenter = (0, GeoUtils_1.normalizeLatLng)(nextProps.center);
59
+ if (prevCenter.latitude !== nextCenter.latitude ||
60
+ prevCenter.longitude !== nextCenter.longitude) {
61
+ return false;
62
+ }
63
+ // 比较半径
64
+ if (prevProps.radius !== nextProps.radius) {
65
+ return false;
66
+ }
67
+ // 比较样式属性
68
+ if (prevProps.strokeWidth !== nextProps.strokeWidth ||
69
+ prevProps.strokeColor !== nextProps.strokeColor ||
70
+ prevProps.fillColor !== nextProps.fillColor ||
71
+ prevProps.zIndex !== nextProps.zIndex) {
72
+ return false;
73
+ }
74
+ // 比较回调
75
+ if (prevProps.onCirclePress !== nextProps.onCirclePress) {
76
+ return false;
77
+ }
78
+ return true;
48
79
  }
49
80
  // 导出优化后的组件
50
- exports.default = React.memo(Circle);
81
+ exports.default = React.memo(Circle, arePropsEqual);
@@ -6,4 +6,6 @@ import type { ClusterProps } from '../../types';
6
6
  * @param props 点聚合组件的属性配置
7
7
  * @returns 渲染原生点聚合组件
8
8
  */
9
- export default function Cluster(props: ClusterProps): React.JSX.Element;
9
+ declare function Cluster(props: ClusterProps): React.JSX.Element;
10
+ declare const _default: React.MemoExoticComponent<typeof Cluster>;
11
+ export default _default;
@@ -33,10 +33,9 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.default = Cluster;
37
36
  const expo_modules_core_1 = require("expo-modules-core");
38
37
  const React = __importStar(require("react"));
39
- const NativeCluster = (0, expo_modules_core_1.requireNativeViewManager)('NaviClusterView');
38
+ const NativeCluster = (0, expo_modules_core_1.requireNativeViewManager)('ClusterView');
40
39
  /**
41
40
  * 高德地图点聚合组件
42
41
  *
@@ -46,3 +45,33 @@ const NativeCluster = (0, expo_modules_core_1.requireNativeViewManager)('NaviClu
46
45
  function Cluster(props) {
47
46
  return <NativeCluster {...props}/>;
48
47
  }
48
+ /**
49
+ * 🔑 性能优化:浅比较关键属性
50
+ * 只检查最常变化的属性,避免深度比较开销
51
+ */
52
+ function arePropsEqual(prevProps, nextProps) {
53
+ // 比较 points 数组引用(最常变化)
54
+ if (prevProps.points !== nextProps.points) {
55
+ return false;
56
+ }
57
+ // 比较 radius
58
+ if (prevProps.radius !== nextProps.radius) {
59
+ return false;
60
+ }
61
+ // 比较 minClusterSize
62
+ if (prevProps.minClusterSize !== nextProps.minClusterSize) {
63
+ return false;
64
+ }
65
+ // 比较 clusterBuckets
66
+ if (prevProps.clusterBuckets !== nextProps.clusterBuckets) {
67
+ return false;
68
+ }
69
+ // 比较 onClusterPress 回调
70
+ if (prevProps.onClusterPress !== nextProps.onClusterPress) {
71
+ return false;
72
+ }
73
+ // 其他属性相同,不重新渲染
74
+ return true;
75
+ }
76
+ // 导出优化后的组件
77
+ exports.default = React.memo(Cluster, arePropsEqual);
@@ -6,4 +6,6 @@ import type { HeatMapProps } from '../../types';
6
6
  * @param props - 热力图配置属性,继承自NativeHeatMap组件的属性
7
7
  * @returns 渲染高德地图原生热力图组件
8
8
  */
9
- export default function HeatMap(props: HeatMapProps): React.JSX.Element;
9
+ declare function HeatMap(props: HeatMapProps): React.JSX.Element;
10
+ declare const _default: React.MemoExoticComponent<typeof HeatMap>;
11
+ export default _default;
@@ -33,10 +33,11 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.default = HeatMap;
37
36
  const expo_modules_core_1 = require("expo-modules-core");
38
37
  const React = __importStar(require("react"));
39
- const NativeHeatMap = (0, expo_modules_core_1.requireNativeViewManager)('NaviHeatMapView');
38
+ const react_native_1 = require("react-native");
39
+ const GeoUtils_1 = require("../../utils/GeoUtils");
40
+ const NativeHeatMap = (0, expo_modules_core_1.requireNativeViewManager)('HeatMapView');
40
41
  /**
41
42
  * 高德地图热力图组件
42
43
  *
@@ -44,5 +45,34 @@ const NativeHeatMap = (0, expo_modules_core_1.requireNativeViewManager)('NaviHea
44
45
  * @returns 渲染高德地图原生热力图组件
45
46
  */
46
47
  function HeatMap(props) {
47
- return <NativeHeatMap {...props}/>;
48
+ const { data, ...restProps } = props;
49
+ const normalizedData = (0, GeoUtils_1.normalizeLatLngList)(data);
50
+ return (<NativeHeatMap data={normalizedData} {...restProps} collapsable={false} pointerEvents="none" style={styles.hidden}/>);
48
51
  }
52
+ const styles = react_native_1.StyleSheet.create({
53
+ hidden: {
54
+ width: 0,
55
+ height: 0,
56
+ backgroundColor: 'transparent',
57
+ },
58
+ });
59
+ /**
60
+ * 🔑 性能优化:浅比较关键属性
61
+ */
62
+ function arePropsEqual(prevProps, nextProps) {
63
+ // 比较 data 数组引用(最常变化)
64
+ if (prevProps.data !== nextProps.data) {
65
+ return false;
66
+ }
67
+ if (prevProps.visible !== nextProps.visible) {
68
+ return false;
69
+ }
70
+ // 比较样式属性
71
+ if (prevProps.radius !== nextProps.radius ||
72
+ prevProps.opacity !== nextProps.opacity) {
73
+ return false;
74
+ }
75
+ return true;
76
+ }
77
+ // 导出优化后的组件
78
+ exports.default = React.memo(HeatMap, arePropsEqual);
@@ -5,7 +5,7 @@ import type { MarkerProps } from '../../types';
5
5
  *
6
6
  * 支持:
7
7
  * - 自定义图标(icon)
8
- * - 自定义内容(children
8
+ * - 自定义内容(children)- 自动测量尺寸
9
9
  * - 大头针样式(pinColor)
10
10
  * - 拖拽功能
11
11
  * - 所有事件回调
@@ -35,61 +35,66 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  const React = __importStar(require("react"));
37
37
  const expo_modules_core_1 = require("expo-modules-core");
38
- const NativeMarkerView = (0, expo_modules_core_1.requireNativeViewManager)('NaviMarkerView');
38
+ const GeoUtils_1 = require("../../utils/GeoUtils");
39
+ const NativeMarkerView = (0, expo_modules_core_1.requireNativeViewManager)('MarkerView');
39
40
  /**
40
41
  * Marker 组件 - 完全声明式 API
41
42
  *
42
43
  * 支持:
43
44
  * - 自定义图标(icon)
44
- * - 自定义内容(children
45
+ * - 自定义内容(children)- 自动测量尺寸
45
46
  * - 大头针样式(pinColor)
46
47
  * - 拖拽功能
47
48
  * - 所有事件回调
48
49
  */
49
50
  function Marker(props) {
50
- // 根据是否有 children 来决定使用哪个尺寸属性
51
- // 有 children:使用 customViewWidth/customViewHeight(默认 200x40)
52
- // 无 children:使用 iconWidth/iconHeight(用于自定义图标,默认 40x40)
53
- const containerWidth = props.children
54
- ? (props.customViewWidth && props.customViewWidth > 0 ? props.customViewWidth : 200)
55
- : (props.iconWidth && props.iconWidth > 0 ? props.iconWidth : 40);
56
- const containerHeight = props.children
57
- ? (props.customViewHeight && props.customViewHeight > 0 ? props.customViewHeight : 40)
58
- : (props.iconHeight && props.iconHeight > 0 ? props.iconHeight : 40);
59
51
  // 从 props 中排除 position 属性,避免传递到原生层
60
- const { position, ...restProps } = props;
61
- return (<NativeMarkerView latitude={position.latitude} longitude={position.longitude} iconWidth={containerWidth} iconHeight={containerHeight} customViewWidth={containerWidth} customViewHeight={containerHeight} {...restProps}>
62
- {props.children}
52
+ const { position, customViewWidth, customViewHeight, iconWidth, iconHeight, children, smoothMovePath, ...restProps } = props;
53
+ // 归一化坐标处理
54
+ const normalizedPosition = (0, GeoUtils_1.normalizeLatLng)(position);
55
+ const normalizedSmoothMovePath = smoothMovePath ? (0, GeoUtils_1.normalizeLatLngList)(smoothMovePath) : undefined;
56
+ // 根据是否有 children 来决定使用哪个尺寸属性
57
+ const hasChildren = !!children;
58
+ // 智能尺寸计算
59
+ const finalIconWidth = hasChildren
60
+ ? (customViewWidth && customViewWidth > 0 ? customViewWidth : 0)
61
+ : (iconWidth && iconWidth > 0 ? iconWidth : 40);
62
+ const finalIconHeight = hasChildren
63
+ ? (customViewHeight && customViewHeight > 0 ? customViewHeight : 0)
64
+ : (iconHeight && iconHeight > 0 ? iconHeight : 40);
65
+ return (<NativeMarkerView latitude={normalizedPosition.latitude} longitude={normalizedPosition.longitude} iconWidth={finalIconWidth} iconHeight={finalIconHeight} customViewWidth={finalIconWidth} customViewHeight={finalIconHeight} smoothMovePath={normalizedSmoothMovePath} {...restProps}>
66
+ {children}
63
67
  </NativeMarkerView>);
64
68
  }
65
69
  /**
66
- * 自定义比较函数
67
- * 深度比较 position 和其他关键属性
70
+ * 🔑 性能优化:极简比较函数
71
+ * 只检查最常变化的关键属性,减少 JS 线程开销
68
72
  */
69
73
  function arePropsEqual(prevProps, nextProps) {
70
- // 比较 position
71
- if (prevProps.position.latitude !== nextProps.position.latitude ||
72
- prevProps.position.longitude !== nextProps.position.longitude) {
74
+ // 快速路径:比较 position (最常变化)
75
+ const prevPos = (0, GeoUtils_1.normalizeLatLng)(prevProps.position);
76
+ const nextPos = (0, GeoUtils_1.normalizeLatLng)(nextProps.position);
77
+ if (prevPos.latitude !== nextPos.latitude ||
78
+ prevPos.longitude !== nextPos.longitude) {
73
79
  return false;
74
80
  }
75
- // 比较基础属性
76
- if (prevProps.title !== nextProps.title ||
77
- prevProps.snippet !== nextProps.snippet ||
78
- prevProps.icon !== nextProps.icon ||
79
- prevProps.pinColor !== nextProps.pinColor ||
80
- prevProps.draggable !== nextProps.draggable ||
81
- prevProps.animatesDrop !== nextProps.animatesDrop ||
82
- prevProps.iconWidth !== nextProps.iconWidth ||
83
- prevProps.iconHeight !== nextProps.iconHeight ||
84
- prevProps.customViewWidth !== nextProps.customViewWidth ||
85
- prevProps.customViewHeight !== nextProps.customViewHeight) {
81
+ // 比较 cacheKey (如果提供了 cacheKey,其他属性理论上不会变)
82
+ if (prevProps.cacheKey !== nextProps.cacheKey) {
86
83
  return false;
87
84
  }
88
- // 比较 children(简单比较,可根据需要深度比较)
85
+ // 比较 children (如果有 children)
89
86
  if (prevProps.children !== nextProps.children) {
90
87
  return false;
91
88
  }
92
- // 其他属性相同,不需要重新渲染
89
+ // 比较 smoothMovePath (平滑移动路径)
90
+ if (JSON.stringify(prevProps.smoothMovePath) !== JSON.stringify(nextProps.smoothMovePath)) {
91
+ return false;
92
+ }
93
+ // 比较 smoothMoveDuration (平滑移动时长)
94
+ if (prevProps.smoothMoveDuration !== nextProps.smoothMoveDuration) {
95
+ return false;
96
+ }
97
+ // 其他属性相同,不重新渲染
93
98
  return true;
94
99
  }
95
100
  // 导出优化后的组件
@@ -36,7 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.default = MultiPoint;
37
37
  const expo_modules_core_1 = require("expo-modules-core");
38
38
  const React = __importStar(require("react"));
39
- const NativeMultiPoint = (0, expo_modules_core_1.requireNativeViewManager)('NaviMultiPointView');
39
+ const NativeMultiPoint = (0, expo_modules_core_1.requireNativeViewManager)('MultiPointView');
40
40
  /**
41
41
  * 高德地图多点标记组件
42
42
  *
@@ -34,8 +34,9 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  const React = __importStar(require("react"));
37
+ const GeoUtils_1 = require("../../utils/GeoUtils");
37
38
  const expo_modules_core_1 = require("expo-modules-core");
38
- const NativePolygonView = (0, expo_modules_core_1.requireNativeViewManager)('NaviPolygonView');
39
+ const NativePolygonView = (0, expo_modules_core_1.requireNativeViewManager)('PolygonView');
39
40
  /**
40
41
  * 渲染一个高德地图多边形覆盖物组件
41
42
  *
@@ -43,7 +44,33 @@ const NativePolygonView = (0, expo_modules_core_1.requireNativeViewManager)('Nav
43
44
  * @returns 高德地图原生多边形视图组件
44
45
  */
45
46
  function Polygon(props) {
46
- return <NativePolygonView {...props}/>;
47
+ const { points, ...restProps } = props;
48
+ // 归一化坐标数组
49
+ const normalizedPoints = (0, GeoUtils_1.normalizeLatLngList)(points);
50
+ return <NativePolygonView points={normalizedPoints} {...restProps}/>;
51
+ }
52
+ /**
53
+ * 🔑 性能优化:浅比较关键属性
54
+ */
55
+ function arePropsEqual(prevProps, nextProps) {
56
+ // 比较 points 数组引用(最常变化)
57
+ if (prevProps.points !== nextProps.points) {
58
+ return false;
59
+ }
60
+ // 比较样式属性
61
+ if (prevProps.strokeWidth !== nextProps.strokeWidth ||
62
+ prevProps.strokeColor !== nextProps.strokeColor ||
63
+ prevProps.fillColor !== nextProps.fillColor ||
64
+ prevProps.zIndex !== nextProps.zIndex ||
65
+ prevProps.simplificationTolerance !== nextProps.simplificationTolerance) {
66
+ return false;
67
+ }
68
+ // 比较回调
69
+ if (prevProps.onPolygonPress !== nextProps.onPolygonPress ||
70
+ prevProps.onPolygonSimplified !== nextProps.onPolygonSimplified) {
71
+ return false;
72
+ }
73
+ return true;
47
74
  }
48
75
  // 导出优化后的组件
49
- exports.default = React.memo(Polygon);
76
+ exports.default = React.memo(Polygon, arePropsEqual);
@@ -34,8 +34,9 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  const React = __importStar(require("react"));
37
+ const GeoUtils_1 = require("../../utils/GeoUtils");
37
38
  const expo_modules_core_1 = require("expo-modules-core");
38
- const NativePolylineView = (0, expo_modules_core_1.requireNativeViewManager)('NaviPolylineView');
39
+ const NativePolylineView = (0, expo_modules_core_1.requireNativeViewManager)('PolylineView');
39
40
  /**
40
41
  * 渲染高德地图上的折线覆盖物组件
41
42
  *
@@ -43,7 +44,39 @@ const NativePolylineView = (0, expo_modules_core_1.requireNativeViewManager)('Na
43
44
  * @returns 高德地图原生折线视图组件
44
45
  */
45
46
  function Polyline(props) {
46
- return <NativePolylineView {...props}/>;
47
+ const { points, ...restProps } = props;
48
+ // 归一化坐标数组
49
+ const normalizedPoints = (0, GeoUtils_1.normalizeLatLngList)(points);
50
+ return <NativePolylineView points={normalizedPoints} {...restProps}/>;
51
+ }
52
+ /**
53
+ * 🔑 性能优化:浅比较关键属性
54
+ */
55
+ function arePropsEqual(prevProps, nextProps) {
56
+ // 比较 points 数组引用(最常变化)
57
+ if (prevProps.points !== nextProps.points) {
58
+ return false;
59
+ }
60
+ // 比较样式属性
61
+ if (prevProps.strokeWidth !== nextProps.strokeWidth ||
62
+ prevProps.strokeColor !== nextProps.strokeColor ||
63
+ prevProps.zIndex !== nextProps.zIndex ||
64
+ prevProps.geodesic !== nextProps.geodesic ||
65
+ prevProps.dotted !== nextProps.dotted ||
66
+ prevProps.gradient !== nextProps.gradient ||
67
+ prevProps.simplificationTolerance !== nextProps.simplificationTolerance ||
68
+ prevProps.texture !== nextProps.texture) {
69
+ return false;
70
+ }
71
+ // 比较 colors 数组
72
+ if (prevProps.colors !== nextProps.colors) {
73
+ return false;
74
+ }
75
+ // 比较回调
76
+ if (prevProps.onPolylinePress !== nextProps.onPolylinePress) {
77
+ return false;
78
+ }
79
+ return true;
47
80
  }
48
81
  // 导出优化后的组件
49
- exports.default = React.memo(Polyline);
82
+ exports.default = React.memo(Polyline, arePropsEqual);
@@ -1,7 +1,27 @@
1
- export * from './ExpoGaodeMap.types';
2
- export { default as ExpoGaodeMapModule, getWebKey, getSDKConfig } from './ExpoGaodeMapModule';
3
- export type { SDKConfig, PermissionStatus } from './ExpoGaodeMapModule';
1
+ export * from './types';
2
+ export { default as ExpoGaodeMapModule } from './ExpoGaodeMapModule';
4
3
  export { default as MapView } from './ExpoGaodeMapView';
4
+ export { useMap } from './components/MapContext';
5
+ export { MapUI } from './components/MapUI';
5
6
  export { Marker, Polyline, Polygon, Circle, HeatMap, MultiPoint, Cluster, } from './components/overlays';
6
- export { requireModule, OptionalModules, getInstalledModules, printModuleInfo, createLazyLoader, } from './utils/ModuleLoader';
7
- export { default } from './ExpoGaodeMapModule';
7
+ export { ErrorHandler, ErrorLogger, GaodeMapError, ErrorType, } from './utils/ErrorHandler';
8
+ export type { ErrorDetails } from './utils/ErrorHandler';
9
+ export { PlatformDetector, DeviceType, FoldState, isAndroid14Plus, isiOS17Plus, isTablet, isFoldable, isIPad, } from './utils/PlatformDetector';
10
+ export type { DeviceInfo, SystemVersion } from './utils/PlatformDetector';
11
+ export { PermissionUtils, PermissionManager, // 向后兼容的别名
12
+ LocationPermissionType, } from './utils/PermissionUtils';
13
+ export { FoldableMapView, useFoldableMap, } from './components/FoldableMapView';
14
+ export type { FoldableMapViewProps, FoldableConfig, } from './components/FoldableMapView';
15
+ export { OfflineMapManager as ExpoGaodeMapOfflineModule } from './utils/OfflineMapManager';
16
+ export type { OfflineMapInfo, OfflineMapStatus, OfflineMapDownloadConfig, OfflineMapDownloadEvent, OfflineMapCompleteEvent, OfflineMapErrorEvent, OfflineMapPausedEvent, OfflineMapCancelledEvent, OfflineMapStorageInfo, OfflineMapEvents, } from './types/offline.types';
17
+ /**
18
+ * Check or request permissions to access the location.
19
+ * This uses both `requestPermissionsAsync` and `getPermissionsAsync` to interact with the permissions.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * const [status, requestPermission] = useLocationPermissions();
24
+ * ```
25
+ */
26
+ export declare const useLocationPermissions: (options?: import("expo-modules-core").PermissionHookOptions<object> | undefined) => [import("./types").PermissionStatus | null, () => Promise<import("./types").PermissionStatus>, () => Promise<import("./types").PermissionStatus>];
27
+ export { getSDKConfig, getWebKey } from './ExpoGaodeMapModule';
@@ -17,17 +17,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.default = exports.createLazyLoader = exports.printModuleInfo = exports.getInstalledModules = exports.OptionalModules = exports.requireModule = exports.Cluster = exports.MultiPoint = exports.HeatMap = exports.Circle = exports.Polygon = exports.Polyline = exports.Marker = exports.MapView = exports.getSDKConfig = exports.getWebKey = exports.ExpoGaodeMapModule = void 0;
21
- // 导出类型定义
22
- __exportStar(require("./ExpoGaodeMap.types"), exports);
23
- // 导出原生模块 - 直接使用,无需封装
24
- var ExpoGaodeMapModule_1 = require("./ExpoGaodeMapModule");
25
- Object.defineProperty(exports, "ExpoGaodeMapModule", { enumerable: true, get: function () { return __importDefault(ExpoGaodeMapModule_1).default; } });
26
- Object.defineProperty(exports, "getWebKey", { enumerable: true, get: function () { return ExpoGaodeMapModule_1.getWebKey; } });
27
- Object.defineProperty(exports, "getSDKConfig", { enumerable: true, get: function () { return ExpoGaodeMapModule_1.getSDKConfig; } });
20
+ exports.getWebKey = exports.getSDKConfig = exports.useLocationPermissions = exports.ExpoGaodeMapOfflineModule = exports.useFoldableMap = exports.FoldableMapView = exports.LocationPermissionType = exports.PermissionManager = exports.PermissionUtils = exports.isIPad = exports.isFoldable = exports.isTablet = exports.isiOS17Plus = exports.isAndroid14Plus = exports.FoldState = exports.DeviceType = exports.PlatformDetector = exports.ErrorType = exports.GaodeMapError = exports.ErrorLogger = exports.ErrorHandler = exports.Cluster = exports.MultiPoint = exports.HeatMap = exports.Circle = exports.Polygon = exports.Polyline = exports.Marker = exports.MapUI = exports.useMap = exports.MapView = exports.ExpoGaodeMapModule = void 0;
21
+ const expo_modules_core_1 = require("expo-modules-core");
22
+ const ExpoGaodeMapModule_1 = __importDefault(require("./ExpoGaodeMapModule"));
23
+ // 导出类型定义(包含所有通用类型)
24
+ __exportStar(require("./types"), exports);
25
+ // 导出原生模块
26
+ var ExpoGaodeMapModule_2 = require("./ExpoGaodeMapModule");
27
+ Object.defineProperty(exports, "ExpoGaodeMapModule", { enumerable: true, get: function () { return __importDefault(ExpoGaodeMapModule_2).default; } });
28
28
  // 导出地图视图组件
29
29
  var ExpoGaodeMapView_1 = require("./ExpoGaodeMapView");
30
30
  Object.defineProperty(exports, "MapView", { enumerable: true, get: function () { return __importDefault(ExpoGaodeMapView_1).default; } });
31
+ var MapContext_1 = require("./components/MapContext");
32
+ Object.defineProperty(exports, "useMap", { enumerable: true, get: function () { return MapContext_1.useMap; } });
33
+ var MapUI_1 = require("./components/MapUI");
34
+ Object.defineProperty(exports, "MapUI", { enumerable: true, get: function () { return MapUI_1.MapUI; } });
31
35
  // 导出覆盖物组件
32
36
  var overlays_1 = require("./components/overlays");
33
37
  Object.defineProperty(exports, "Marker", { enumerable: true, get: function () { return overlays_1.Marker; } });
@@ -37,13 +41,50 @@ Object.defineProperty(exports, "Circle", { enumerable: true, get: function () {
37
41
  Object.defineProperty(exports, "HeatMap", { enumerable: true, get: function () { return overlays_1.HeatMap; } });
38
42
  Object.defineProperty(exports, "MultiPoint", { enumerable: true, get: function () { return overlays_1.MultiPoint; } });
39
43
  Object.defineProperty(exports, "Cluster", { enumerable: true, get: function () { return overlays_1.Cluster; } });
40
- // 导出模块检测工具
41
- var ModuleLoader_1 = require("./utils/ModuleLoader");
42
- Object.defineProperty(exports, "requireModule", { enumerable: true, get: function () { return ModuleLoader_1.requireModule; } });
43
- Object.defineProperty(exports, "OptionalModules", { enumerable: true, get: function () { return ModuleLoader_1.OptionalModules; } });
44
- Object.defineProperty(exports, "getInstalledModules", { enumerable: true, get: function () { return ModuleLoader_1.getInstalledModules; } });
45
- Object.defineProperty(exports, "printModuleInfo", { enumerable: true, get: function () { return ModuleLoader_1.printModuleInfo; } });
46
- Object.defineProperty(exports, "createLazyLoader", { enumerable: true, get: function () { return ModuleLoader_1.createLazyLoader; } });
47
- // 默认导出原生模块
48
- var ExpoGaodeMapModule_2 = require("./ExpoGaodeMapModule");
49
- Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(ExpoGaodeMapModule_2).default; } });
44
+ // 导出错误处理工具
45
+ var ErrorHandler_1 = require("./utils/ErrorHandler");
46
+ Object.defineProperty(exports, "ErrorHandler", { enumerable: true, get: function () { return ErrorHandler_1.ErrorHandler; } });
47
+ Object.defineProperty(exports, "ErrorLogger", { enumerable: true, get: function () { return ErrorHandler_1.ErrorLogger; } });
48
+ Object.defineProperty(exports, "GaodeMapError", { enumerable: true, get: function () { return ErrorHandler_1.GaodeMapError; } });
49
+ Object.defineProperty(exports, "ErrorType", { enumerable: true, get: function () { return ErrorHandler_1.ErrorType; } });
50
+ // 导出平台检测工具
51
+ var PlatformDetector_1 = require("./utils/PlatformDetector");
52
+ Object.defineProperty(exports, "PlatformDetector", { enumerable: true, get: function () { return PlatformDetector_1.PlatformDetector; } });
53
+ Object.defineProperty(exports, "DeviceType", { enumerable: true, get: function () { return PlatformDetector_1.DeviceType; } });
54
+ Object.defineProperty(exports, "FoldState", { enumerable: true, get: function () { return PlatformDetector_1.FoldState; } });
55
+ Object.defineProperty(exports, "isAndroid14Plus", { enumerable: true, get: function () { return PlatformDetector_1.isAndroid14Plus; } });
56
+ Object.defineProperty(exports, "isiOS17Plus", { enumerable: true, get: function () { return PlatformDetector_1.isiOS17Plus; } });
57
+ Object.defineProperty(exports, "isTablet", { enumerable: true, get: function () { return PlatformDetector_1.isTablet; } });
58
+ Object.defineProperty(exports, "isFoldable", { enumerable: true, get: function () { return PlatformDetector_1.isFoldable; } });
59
+ Object.defineProperty(exports, "isIPad", { enumerable: true, get: function () { return PlatformDetector_1.isIPad; } });
60
+ // 导出权限工具类(仅提供文案和诊断,实际权限请求使用 ExpoGaodeMapModule)
61
+ var PermissionUtils_1 = require("./utils/PermissionUtils");
62
+ Object.defineProperty(exports, "PermissionUtils", { enumerable: true, get: function () { return PermissionUtils_1.PermissionUtils; } });
63
+ Object.defineProperty(exports, "PermissionManager", { enumerable: true, get: function () { return PermissionUtils_1.PermissionManager; } });
64
+ Object.defineProperty(exports, "LocationPermissionType", { enumerable: true, get: function () { return PermissionUtils_1.LocationPermissionType; } });
65
+ // 导出折叠屏适配组件
66
+ var FoldableMapView_1 = require("./components/FoldableMapView");
67
+ Object.defineProperty(exports, "FoldableMapView", { enumerable: true, get: function () { return FoldableMapView_1.FoldableMapView; } });
68
+ Object.defineProperty(exports, "useFoldableMap", { enumerable: true, get: function () { return FoldableMapView_1.useFoldableMap; } });
69
+ // 导出离线地图 API
70
+ var OfflineMapManager_1 = require("./utils/OfflineMapManager");
71
+ Object.defineProperty(exports, "ExpoGaodeMapOfflineModule", { enumerable: true, get: function () { return OfflineMapManager_1.OfflineMapManager; } });
72
+ const requestPermissionsAsync = ExpoGaodeMapModule_1.default.requestLocationPermission;
73
+ const getPermissionsAsync = ExpoGaodeMapModule_1.default.checkLocationPermission;
74
+ /**
75
+ * Check or request permissions to access the location.
76
+ * This uses both `requestPermissionsAsync` and `getPermissionsAsync` to interact with the permissions.
77
+ *
78
+ * @example
79
+ * ```ts
80
+ * const [status, requestPermission] = useLocationPermissions();
81
+ * ```
82
+ */
83
+ exports.useLocationPermissions = (0, expo_modules_core_1.createPermissionHook)({
84
+ getMethod: getPermissionsAsync,
85
+ requestMethod: requestPermissionsAsync,
86
+ });
87
+ // 导出便捷读取的 SDK 配置与 webKey
88
+ var ExpoGaodeMapModule_3 = require("./ExpoGaodeMapModule");
89
+ Object.defineProperty(exports, "getSDKConfig", { enumerable: true, get: function () { return ExpoGaodeMapModule_3.getSDKConfig; } });
90
+ Object.defineProperty(exports, "getWebKey", { enumerable: true, get: function () { return ExpoGaodeMapModule_3.getWebKey; } });
@@ -2,6 +2,39 @@
2
2
  * 高德地图通用类型定义
3
3
  * 基于 Expo Modules API
4
4
  */
5
+ import { PermissionResponse } from 'expo-modules-core';
6
+ /**
7
+ * SDK 配置参数
8
+ */
9
+ export interface SDKConfig {
10
+ /** Android 平台的高德地图 API Key */
11
+ androidKey?: string;
12
+ /** iOS 平台的高德地图 API Key */
13
+ iosKey?: string;
14
+ /** web api key 如果要使用expo-gaode-map-web-api相关的功能,需要配置web api key*/
15
+ webKey?: string;
16
+ }
17
+ /**
18
+ * 权限状态(增强版,支持 Android 14+ 和 iOS 17+)
19
+ */
20
+ export interface PermissionStatus extends PermissionResponse {
21
+ /** 是否已授权(前台位置权限) */
22
+ granted: boolean;
23
+ /** Android 精确位置权限 */
24
+ fineLocation?: boolean;
25
+ /** Android 粗略位置权限 */
26
+ coarseLocation?: boolean;
27
+ /** Android 后台位置权限(Android 10+) */
28
+ backgroundLocation?: boolean;
29
+ /** 是否应显示权限说明(Android) */
30
+ shouldShowRationale?: boolean;
31
+ /** 权限是否被永久拒绝(Android) */
32
+ isPermanentlyDenied?: boolean;
33
+ /** 是否为 Android 14+(Android) */
34
+ isAndroid14Plus?: boolean;
35
+ /** 额外的消息说明 */
36
+ message?: string;
37
+ }
5
38
  /**
6
39
  * 点坐标(屏幕坐标)
7
40
  */
@@ -22,6 +55,13 @@ export interface LatLng {
22
55
  */
23
56
  longitude: number;
24
57
  }
58
+ /**
59
+ * 坐标点类型
60
+ * 支持对象格式 { latitude, longitude }
61
+ * 或数组格式 [longitude, latitude] (GeoJSON 标准)
62
+ * 注意:GeoJSON 标准允许数组包含更多元素(如海拔),但本组件只使用前两个
63
+ */
64
+ export type LatLngPoint = LatLng | [number, number] | number[];
25
65
  /**
26
66
  * 地图标注点(POI)
27
67
  */
@@ -1,8 +1,4 @@
1
1
  "use strict";
2
- /**
3
- * 高德地图通用类型定义
4
- * 基于 Expo Modules API
5
- */
6
2
  Object.defineProperty(exports, "__esModule", { value: true });
7
3
  exports.MapType = void 0;
8
4
  /**
@@ -2,9 +2,10 @@
2
2
  * 高德地图 Expo Module 类型定义统一导出
3
3
  * 基于 Expo Modules API 重新设计
4
4
  */
5
- export type { Point, LatLng, MapPoi, LatLngBounds, CameraPosition, ColorValue, } from './common.types';
5
+ export type { Point, LatLng, LatLngPoint, MapPoi, LatLngBounds, CameraPosition, ColorValue, SDKConfig, PermissionStatus, } from './common.types';
6
6
  export { MapType } from './common.types';
7
- export type { LocationEvent, CameraEvent, MapViewProps, MapViewMethods, MapViewRef, } from './map-view.types';
7
+ export type { LocationEvent, CameraEvent, MapViewProps, MapViewMethods, MapViewRef, ExpoGaodeMapModuleEvents, } from './map-view.types';
8
8
  export type { Coordinates, ReGeocode, LocationOptions, LocationListener, 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';
11
+ export type { ExpoGaodeMapModule } from './native-module.types';