expo-gaode-map-navigation 2.0.17 → 2.0.19

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 (277) hide show
  1. package/android/build.gradle +10 -25
  2. package/build/ExpoGaodeMapNaviView.js +2 -1
  3. package/build/ExpoGaodeMapNaviView.js.map +1 -1
  4. package/build/ExpoGaodeMapNavigationModule.d.ts +1 -1
  5. package/build/ExpoGaodeMapNavigationModule.d.ts.map +1 -1
  6. package/build/ExpoGaodeMapNavigationModule.js.map +1 -1
  7. package/build/map/ExpoGaodeMapModule.d.ts +3 -2
  8. package/build/map/ExpoGaodeMapModule.d.ts.map +1 -1
  9. package/build/map/ExpoGaodeMapModule.js +13 -4
  10. package/build/map/ExpoGaodeMapModule.js.map +1 -1
  11. package/build/map/ExpoGaodeMapOfflineModule.js +1 -1
  12. package/build/map/ExpoGaodeMapOfflineModule.js.map +1 -1
  13. package/build/map/ExpoGaodeMapView.js +2 -8
  14. package/build/map/ExpoGaodeMapView.js.map +1 -1
  15. package/build/map/components/FoldableMapView.d.ts +3 -2
  16. package/build/map/components/FoldableMapView.d.ts.map +1 -1
  17. package/build/map/components/FoldableMapView.js +2 -1
  18. package/build/map/components/FoldableMapView.js.map +1 -1
  19. package/build/map/components/MapUI.js +2 -1
  20. package/build/map/components/MapUI.js.map +1 -1
  21. package/build/map/components/overlays/Circle.d.ts +1 -1
  22. package/build/map/components/overlays/Circle.d.ts.map +1 -1
  23. package/build/map/components/overlays/Circle.js +2 -1
  24. package/build/map/components/overlays/Circle.js.map +1 -1
  25. package/build/map/components/overlays/Cluster.d.ts +1 -1
  26. package/build/map/components/overlays/Cluster.d.ts.map +1 -1
  27. package/build/map/components/overlays/Cluster.js +2 -1
  28. package/build/map/components/overlays/Cluster.js.map +1 -1
  29. package/build/map/components/overlays/HeatMap.d.ts +1 -1
  30. package/build/map/components/overlays/HeatMap.d.ts.map +1 -1
  31. package/build/map/components/overlays/HeatMap.js +2 -1
  32. package/build/map/components/overlays/HeatMap.js.map +1 -1
  33. package/build/map/components/overlays/Marker.d.ts +1 -1
  34. package/build/map/components/overlays/Marker.d.ts.map +1 -1
  35. package/build/map/components/overlays/Marker.js +2 -5
  36. package/build/map/components/overlays/Marker.js.map +1 -1
  37. package/build/map/components/overlays/MultiPoint.d.ts +1 -2
  38. package/build/map/components/overlays/MultiPoint.d.ts.map +1 -1
  39. package/build/map/components/overlays/MultiPoint.js +2 -1
  40. package/build/map/components/overlays/MultiPoint.js.map +1 -1
  41. package/build/map/components/overlays/Polygon.d.ts +1 -1
  42. package/build/map/components/overlays/Polygon.d.ts.map +1 -1
  43. package/build/map/components/overlays/Polygon.js +2 -1
  44. package/build/map/components/overlays/Polygon.js.map +1 -1
  45. package/build/map/components/overlays/Polyline.d.ts +1 -1
  46. package/build/map/components/overlays/Polyline.d.ts.map +1 -1
  47. package/build/map/components/overlays/Polyline.js +2 -1
  48. package/build/map/components/overlays/Polyline.js.map +1 -1
  49. package/build/map/search/ExpoGaodeMapSearchModule.d.ts +1 -1
  50. package/build/map/search/ExpoGaodeMapSearchModule.d.ts.map +1 -1
  51. package/build/map/search/ExpoGaodeMapSearchModule.js.map +1 -1
  52. package/build/map/types/common.types.d.ts +1 -1
  53. package/build/map/types/common.types.d.ts.map +1 -1
  54. package/build/map/types/common.types.js.map +1 -1
  55. package/build/map/types/map-view.types.d.ts +2 -2
  56. package/build/map/types/map-view.types.d.ts.map +1 -1
  57. package/build/map/types/map-view.types.js.map +1 -1
  58. package/build/map/utils/ErrorHandler.d.ts +4 -0
  59. package/build/map/utils/ErrorHandler.d.ts.map +1 -1
  60. package/build/map/utils/ErrorHandler.js +8 -0
  61. package/build/map/utils/ErrorHandler.js.map +1 -1
  62. package/build/map/utils/GeoUtils.d.ts +1 -1
  63. package/build/map/utils/GeoUtils.d.ts.map +1 -1
  64. package/build/map/utils/GeoUtils.js +2 -2
  65. package/build/map/utils/GeoUtils.js.map +1 -1
  66. package/build/route-geometry.d.ts.map +1 -1
  67. package/build/route-geometry.js +24 -8
  68. package/build/route-geometry.js.map +1 -1
  69. package/build/src/ExpoGaodeMapNaviView.d.ts +67 -0
  70. package/build/src/ExpoGaodeMapNaviView.d.ts.map +1 -0
  71. package/build/src/ExpoGaodeMapNaviView.js +138 -0
  72. package/build/src/ExpoGaodeMapNaviView.js.map +1 -0
  73. package/build/src/ExpoGaodeMapNavigation.types.d.ts +2 -0
  74. package/build/src/ExpoGaodeMapNavigation.types.d.ts.map +1 -0
  75. package/build/src/ExpoGaodeMapNavigation.types.js +3 -0
  76. package/build/src/ExpoGaodeMapNavigation.types.js.map +1 -0
  77. package/build/src/ExpoGaodeMapNavigationModule.d.ts +4 -0
  78. package/build/src/ExpoGaodeMapNavigationModule.d.ts.map +1 -0
  79. package/build/src/ExpoGaodeMapNavigationModule.js +27 -0
  80. package/build/src/ExpoGaodeMapNavigationModule.js.map +1 -0
  81. package/build/src/index.d.ts +47 -0
  82. package/build/src/index.d.ts.map +1 -0
  83. package/build/src/index.js +48 -0
  84. package/build/src/index.js.map +1 -0
  85. package/build/src/map/ExpoGaodeMapModule.d.ts +256 -0
  86. package/build/src/map/ExpoGaodeMapModule.d.ts.map +1 -0
  87. package/build/src/map/ExpoGaodeMapModule.js +813 -0
  88. package/build/src/map/ExpoGaodeMapModule.js.map +1 -0
  89. package/build/src/map/ExpoGaodeMapOfflineModule.d.ts +145 -0
  90. package/build/src/map/ExpoGaodeMapOfflineModule.d.ts.map +1 -0
  91. package/build/src/map/ExpoGaodeMapOfflineModule.js +24 -0
  92. package/build/src/map/ExpoGaodeMapOfflineModule.js.map +1 -0
  93. package/build/src/map/ExpoGaodeMapView.d.ts +23 -0
  94. package/build/src/map/ExpoGaodeMapView.d.ts.map +1 -0
  95. package/build/src/map/ExpoGaodeMapView.js +173 -0
  96. package/build/src/map/ExpoGaodeMapView.js.map +1 -0
  97. package/build/src/map/components/FoldableMapView.d.ts +39 -0
  98. package/build/src/map/components/FoldableMapView.d.ts.map +1 -0
  99. package/build/src/map/components/FoldableMapView.js +171 -0
  100. package/build/src/map/components/FoldableMapView.js.map +1 -0
  101. package/build/src/map/components/MapContext.d.ts +13 -0
  102. package/build/src/map/components/MapContext.d.ts.map +1 -0
  103. package/build/src/map/components/MapContext.js +18 -0
  104. package/build/src/map/components/MapContext.js.map +1 -0
  105. package/build/src/map/components/MapUI.d.ts +19 -0
  106. package/build/src/map/components/MapUI.d.ts.map +1 -0
  107. package/build/src/map/components/MapUI.js +24 -0
  108. package/build/src/map/components/MapUI.js.map +1 -0
  109. package/build/src/map/components/overlays/Circle.d.ts +13 -0
  110. package/build/src/map/components/overlays/Circle.d.ts.map +1 -0
  111. package/build/src/map/components/overlays/Circle.js +20 -0
  112. package/build/src/map/components/overlays/Circle.js.map +1 -0
  113. package/build/src/map/components/overlays/Cluster.d.ts +12 -0
  114. package/build/src/map/components/overlays/Cluster.d.ts.map +1 -0
  115. package/build/src/map/components/overlays/Cluster.js +16 -0
  116. package/build/src/map/components/overlays/Cluster.js.map +1 -0
  117. package/build/src/map/components/overlays/HeatMap.d.ts +12 -0
  118. package/build/src/map/components/overlays/HeatMap.d.ts.map +1 -0
  119. package/build/src/map/components/overlays/HeatMap.js +46 -0
  120. package/build/src/map/components/overlays/HeatMap.js.map +1 -0
  121. package/build/src/map/components/overlays/Marker.d.ts +16 -0
  122. package/build/src/map/components/overlays/Marker.d.ts.map +1 -0
  123. package/build/src/map/components/overlays/Marker.js +125 -0
  124. package/build/src/map/components/overlays/Marker.js.map +1 -0
  125. package/build/src/map/components/overlays/MultiPoint.d.ts +9 -0
  126. package/build/src/map/components/overlays/MultiPoint.d.ts.map +1 -0
  127. package/build/src/map/components/overlays/MultiPoint.js +15 -0
  128. package/build/src/map/components/overlays/MultiPoint.js.map +1 -0
  129. package/build/src/map/components/overlays/Polygon.d.ts +12 -0
  130. package/build/src/map/components/overlays/Polygon.d.ts.map +1 -0
  131. package/build/src/map/components/overlays/Polygon.js +20 -0
  132. package/build/src/map/components/overlays/Polygon.js.map +1 -0
  133. package/build/src/map/components/overlays/Polyline.d.ts +12 -0
  134. package/build/src/map/components/overlays/Polyline.d.ts.map +1 -0
  135. package/build/src/map/components/overlays/Polyline.js +20 -0
  136. package/build/src/map/components/overlays/Polyline.js.map +1 -0
  137. package/build/src/map/components/overlays/index.d.ts +8 -0
  138. package/build/src/map/components/overlays/index.d.ts.map +1 -0
  139. package/build/src/map/components/overlays/index.js +8 -0
  140. package/build/src/map/components/overlays/index.js.map +1 -0
  141. package/build/src/map/index.d.ts +35 -0
  142. package/build/src/map/index.d.ts.map +1 -0
  143. package/build/src/map/index.js +48 -0
  144. package/build/src/map/index.js.map +1 -0
  145. package/build/src/map/search/ExpoGaodeMapSearch.types.d.ts +340 -0
  146. package/build/src/map/search/ExpoGaodeMapSearch.types.d.ts.map +1 -0
  147. package/build/src/map/search/ExpoGaodeMapSearch.types.js +19 -0
  148. package/build/src/map/search/ExpoGaodeMapSearch.types.js.map +1 -0
  149. package/build/src/map/search/ExpoGaodeMapSearchModule.d.ts +74 -0
  150. package/build/src/map/search/ExpoGaodeMapSearchModule.d.ts.map +1 -0
  151. package/build/src/map/search/ExpoGaodeMapSearchModule.js +48 -0
  152. package/build/src/map/search/ExpoGaodeMapSearchModule.js.map +1 -0
  153. package/build/src/map/search/index.d.ts +156 -0
  154. package/build/src/map/search/index.d.ts.map +1 -0
  155. package/build/src/map/search/index.js +171 -0
  156. package/build/src/map/search/index.js.map +1 -0
  157. package/build/src/map/types/common.types.d.ts +199 -0
  158. package/build/src/map/types/common.types.d.ts.map +1 -0
  159. package/build/src/map/types/common.types.js +33 -0
  160. package/build/src/map/types/common.types.js.map +1 -0
  161. package/build/src/map/types/index.d.ts +13 -0
  162. package/build/src/map/types/index.d.ts.map +1 -0
  163. package/build/src/map/types/index.js +7 -0
  164. package/build/src/map/types/index.js.map +1 -0
  165. package/build/src/map/types/location.types.d.ts +358 -0
  166. package/build/src/map/types/location.types.d.ts.map +1 -0
  167. package/build/src/map/types/location.types.js +93 -0
  168. package/build/src/map/types/location.types.js.map +1 -0
  169. package/build/src/map/types/map-view.types.d.ts +340 -0
  170. package/build/src/map/types/map-view.types.d.ts.map +1 -0
  171. package/build/src/map/types/map-view.types.js +6 -0
  172. package/build/src/map/types/map-view.types.js.map +1 -0
  173. package/build/src/map/types/native-module.types.d.ts +395 -0
  174. package/build/src/map/types/native-module.types.d.ts.map +1 -0
  175. package/build/src/map/types/native-module.types.js +5 -0
  176. package/build/src/map/types/native-module.types.js.map +1 -0
  177. package/build/src/map/types/offline.types.d.ts +133 -0
  178. package/build/src/map/types/offline.types.d.ts.map +1 -0
  179. package/build/src/map/types/offline.types.js +5 -0
  180. package/build/src/map/types/offline.types.js.map +1 -0
  181. package/build/src/map/types/overlays.types.d.ts +456 -0
  182. package/build/src/map/types/overlays.types.d.ts.map +1 -0
  183. package/build/src/map/types/overlays.types.js +6 -0
  184. package/build/src/map/types/overlays.types.js.map +1 -0
  185. package/build/src/map/types/route-playback.types.d.ts +28 -0
  186. package/build/src/map/types/route-playback.types.d.ts.map +1 -0
  187. package/build/src/map/types/route-playback.types.js +2 -0
  188. package/build/src/map/types/route-playback.types.js.map +1 -0
  189. package/build/src/map/utils/ErrorHandler.d.ts +121 -0
  190. package/build/src/map/utils/ErrorHandler.d.ts.map +1 -0
  191. package/build/src/map/utils/ErrorHandler.js +470 -0
  192. package/build/src/map/utils/ErrorHandler.js.map +1 -0
  193. package/build/src/map/utils/GeoUtils.d.ts +21 -0
  194. package/build/src/map/utils/GeoUtils.d.ts.map +1 -0
  195. package/build/src/map/utils/GeoUtils.js +78 -0
  196. package/build/src/map/utils/GeoUtils.js.map +1 -0
  197. package/build/src/map/utils/OfflineMapManager.d.ts +153 -0
  198. package/build/src/map/utils/OfflineMapManager.d.ts.map +1 -0
  199. package/build/src/map/utils/OfflineMapManager.js +217 -0
  200. package/build/src/map/utils/OfflineMapManager.js.map +1 -0
  201. package/build/src/map/utils/PermissionUtils.d.ts +92 -0
  202. package/build/src/map/utils/PermissionUtils.d.ts.map +1 -0
  203. package/build/src/map/utils/PermissionUtils.js +252 -0
  204. package/build/src/map/utils/PermissionUtils.js.map +1 -0
  205. package/build/src/map/utils/PlatformDetector.d.ts +103 -0
  206. package/build/src/map/utils/PlatformDetector.d.ts.map +1 -0
  207. package/build/src/map/utils/PlatformDetector.js +178 -0
  208. package/build/src/map/utils/PlatformDetector.js.map +1 -0
  209. package/build/src/map/utils/lazyNativeViewManager.d.ts +3 -0
  210. package/build/src/map/utils/lazyNativeViewManager.d.ts.map +1 -0
  211. package/build/src/map/utils/lazyNativeViewManager.js +11 -0
  212. package/build/src/map/utils/lazyNativeViewManager.js.map +1 -0
  213. package/build/src/route-geometry.d.ts +13 -0
  214. package/build/src/route-geometry.d.ts.map +1 -0
  215. package/build/src/route-geometry.js +154 -0
  216. package/build/src/route-geometry.js.map +1 -0
  217. package/build/src/route-planning.d.ts +21 -0
  218. package/build/src/route-planning.d.ts.map +1 -0
  219. package/build/src/route-planning.js +67 -0
  220. package/build/src/route-planning.js.map +1 -0
  221. package/build/src/types/coordinates.types.d.ts +25 -0
  222. package/build/src/types/coordinates.types.d.ts.map +1 -0
  223. package/build/src/types/coordinates.types.js +6 -0
  224. package/build/src/types/coordinates.types.js.map +1 -0
  225. package/build/src/types/independent.types.d.ts +385 -0
  226. package/build/src/types/independent.types.d.ts.map +1 -0
  227. package/build/src/types/independent.types.js +2 -0
  228. package/build/src/types/independent.types.js.map +1 -0
  229. package/build/src/types/index.d.ts +6 -0
  230. package/build/src/types/index.d.ts.map +1 -0
  231. package/build/src/types/index.js +7 -0
  232. package/build/src/types/index.js.map +1 -0
  233. package/build/src/types/native-module.types.d.ts +74 -0
  234. package/build/src/types/native-module.types.d.ts.map +1 -0
  235. package/build/src/types/native-module.types.js +3 -0
  236. package/build/src/types/native-module.types.js.map +1 -0
  237. package/build/src/types/naviview.types.d.ts +562 -0
  238. package/build/src/types/naviview.types.d.ts.map +1 -0
  239. package/build/src/types/naviview.types.js +2 -0
  240. package/build/src/types/naviview.types.js.map +1 -0
  241. package/build/src/types/route.types.d.ts +414 -0
  242. package/build/src/types/route.types.d.ts.map +1 -0
  243. package/build/src/types/route.types.js +137 -0
  244. package/build/src/types/route.types.js.map +1 -0
  245. package/build/src/web-api-fallback.d.ts +5 -0
  246. package/build/src/web-api-fallback.d.ts.map +1 -0
  247. package/build/src/web-api-fallback.js +160 -0
  248. package/build/src/web-api-fallback.js.map +1 -0
  249. package/build/src/web-route-following.d.ts +3 -0
  250. package/build/src/web-route-following.d.ts.map +1 -0
  251. package/build/src/web-route-following.js +178 -0
  252. package/build/src/web-route-following.js.map +1 -0
  253. package/build/types/native-module.types.d.ts +2 -2
  254. package/build/types/native-module.types.d.ts.map +1 -1
  255. package/build/types/native-module.types.js.map +1 -1
  256. package/build/types/naviview.types.d.ts +1 -1
  257. package/build/types/naviview.types.d.ts.map +1 -1
  258. package/build/types/naviview.types.js.map +1 -1
  259. package/build/web-api-fallback.d.ts.map +1 -1
  260. package/build/web-api-fallback.js +0 -1
  261. package/build/web-api-fallback.js.map +1 -1
  262. package/ios/map/ExpoGaodeMapView.swift +145 -3
  263. package/ios/map/cpp/ClusterEngine.cpp +4 -14
  264. package/ios/map/cpp/ClusterEngine.hpp +1 -12
  265. package/ios/map/cpp/ClusterTypes.hpp +18 -0
  266. package/ios/map/cpp/ColorParser.cpp +22 -3
  267. package/ios/map/cpp/GeometryEngine.cpp +1 -1
  268. package/ios/map/cpp/QuadTree.hpp +1 -1
  269. package/ios/map/managers/UIManager.swift +3 -0
  270. package/package.json +16 -8
  271. package/plugin/build/withGaodeMap.js +19 -14
  272. package/shared/cpp/ClusterEngine.cpp +4 -14
  273. package/shared/cpp/ClusterEngine.hpp +1 -12
  274. package/shared/cpp/ClusterTypes.hpp +18 -0
  275. package/shared/cpp/ColorParser.cpp +22 -3
  276. package/shared/cpp/GeometryEngine.cpp +1 -1
  277. package/shared/cpp/QuadTree.hpp +1 -1
@@ -0,0 +1,470 @@
1
+ /**
2
+ * 高德地图错误处理工具
3
+ * 提供友好的错误提示和解决方案指引
4
+ */
5
+ /**
6
+ * 错误类型枚举
7
+ */
8
+ export var ErrorType;
9
+ (function (ErrorType) {
10
+ /** SDK 未初始化 */
11
+ ErrorType["SDK_NOT_INITIALIZED"] = "SDK_NOT_INITIALIZED";
12
+ /** 隐私协议未确认 */
13
+ ErrorType["PRIVACY_NOT_AGREED"] = "PRIVACY_NOT_AGREED";
14
+ /** API Key 配置错误 */
15
+ ErrorType["INVALID_API_KEY"] = "INVALID_API_KEY";
16
+ /** 权限未授予 */
17
+ ErrorType["PERMISSION_DENIED"] = "PERMISSION_DENIED";
18
+ /** 定位失败 */
19
+ ErrorType["LOCATION_FAILED"] = "LOCATION_FAILED";
20
+ /** 原生模块不可用 */
21
+ ErrorType["NATIVE_MODULE_UNAVAILABLE"] = "NATIVE_MODULE_UNAVAILABLE";
22
+ /** 地图视图未初始化 */
23
+ ErrorType["MAP_VIEW_NOT_INITIALIZED"] = "MAP_VIEW_NOT_INITIALIZED";
24
+ /** 参数错误 */
25
+ ErrorType["INVALID_PARAMETER"] = "INVALID_PARAMETER";
26
+ /** 网络错误 */
27
+ ErrorType["NETWORK_ERROR"] = "NETWORK_ERROR";
28
+ })(ErrorType || (ErrorType = {}));
29
+ /**
30
+ * 自定义错误类
31
+ */
32
+ export class GaodeMapError extends Error {
33
+ type;
34
+ solution;
35
+ docUrl;
36
+ originalError;
37
+ constructor(details) {
38
+ const fullMessage = `
39
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
40
+ 🗺️ 高德地图错误 [${details.type}]
41
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
42
+
43
+ ❌ 错误信息:
44
+ ${details.message}
45
+
46
+ 💡 解决方案:
47
+ ${details.solution}
48
+
49
+ ${details.docUrl ? `📖 详细文档:\n ${details.docUrl}\n` : ''}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
50
+ `;
51
+ super(fullMessage);
52
+ this.name = 'GaodeMapError';
53
+ this.type = details.type;
54
+ this.solution = details.solution;
55
+ this.docUrl = details.docUrl;
56
+ this.originalError = details.originalError;
57
+ }
58
+ }
59
+ /**
60
+ * 错误处理器类
61
+ */
62
+ export class ErrorHandler {
63
+ static docBaseUrl = 'https://TomWq.github.io/expo-gaode-map';
64
+ /**
65
+ * SDK 未初始化错误
66
+ */
67
+ static sdkNotInitialized() {
68
+ return new GaodeMapError({
69
+ type: ErrorType.SDK_NOT_INITIALIZED,
70
+ message: '高德地图 SDK 尚未初始化',
71
+ solution: `请在使用地图功能前先调用 initSDK():
72
+
73
+ import {ExpoGaodeMapModule} from 'expo-gaode-map-navigation';
74
+
75
+ useEffect(() => {
76
+ // 在组件挂载时初始化
77
+ ExpoGaodeMapModule.initSDK({
78
+ androidKey: 'your-android-key',
79
+ iosKey: 'your-ios-key',
80
+ });
81
+ }, []);
82
+
83
+ ⚠️ 常见原因:
84
+ 1. 忘记调用 initSDK() 就使用了定位或地图功能
85
+ 2. initSDK() 调用时机过晚(应在 useEffect 中尽早调用)
86
+ 3. 使用 Config Plugin 但未重新构建原生代码`,
87
+ docUrl: `${this.docBaseUrl}/guide/initialization.html`,
88
+ });
89
+ }
90
+ /**
91
+ * 隐私协议未确认错误
92
+ */
93
+ static privacyNotAgreed(scene) {
94
+ const sceneText = scene === 'map' ? '渲染 MapView' : '初始化 SDK';
95
+ return new GaodeMapError({
96
+ type: ErrorType.PRIVACY_NOT_AGREED,
97
+ message: `调用高德地图前未完成隐私合规确认:${sceneText}`,
98
+ solution: `请在调用任何高德地图 SDK 接口前,先明确完成隐私告知与同意:
99
+
100
+ import {ExpoGaodeMapModule} from 'expo-gaode-map-navigation';
101
+
102
+ // 应用启动后,先展示你自己的隐私弹窗
103
+ ExpoGaodeMapModule.setPrivacyConfig({
104
+ hasShow: true,
105
+ hasContainsPrivacy: true,
106
+ hasAgree: true,
107
+ });
108
+
109
+ // 然后再初始化 SDK / 渲染地图
110
+ ExpoGaodeMapModule.initSDK({
111
+ androidKey: 'your-android-key',
112
+ iosKey: 'your-ios-key',
113
+ });
114
+
115
+ ⚠️ 升级注意:
116
+ 1. 不能只 import 包后直接渲染 MapView
117
+ 2. Android 若未先设置隐私,原生 SDK 可能直接报 555570
118
+ 3. 推荐在应用首次启动时先弹出隐私协议,同意后再进入地图页面`,
119
+ docUrl: `${this.docBaseUrl}/guide/initialization.html`,
120
+ });
121
+ }
122
+ /**
123
+ * API Key 配置错误
124
+ */
125
+ static invalidApiKey(platform) {
126
+ const platformText = {
127
+ android: 'Android',
128
+ ios: 'iOS',
129
+ both: 'Android 和 iOS',
130
+ }[platform];
131
+ return new GaodeMapError({
132
+ type: ErrorType.INVALID_API_KEY,
133
+ message: `${platformText} API Key 配置错误或未配置`,
134
+ solution: `⚠️ API Key 与 Bundle ID 不匹配是最常见的原因!
135
+
136
+ 请检查以下步骤:
137
+
138
+ 1️⃣ 确认 API Key 的配置:
139
+ • 访问高德开放平台:https://lbs.amap.com/
140
+ • 检查您的应用配置中的 Bundle ID 是否与当前项目一致
141
+ • iOS Bundle ID:在 Xcode → Target → General → Bundle Identifier 查看
142
+ • Android 包名:在 android/app/build.gradle → applicationId 查看
143
+
144
+ 2️⃣ 重新创建正确的 API Key(如果 Bundle ID 不同):
145
+ • 在高德开放平台创建新应用
146
+ • 填写正确的 Bundle ID(iOS)或包名(Android)
147
+ • 获取新的 API Key
148
+
149
+ 3️⃣ 配置 API Key(推荐使用 Config Plugin):
150
+
151
+ 在 app.json 中配置:
152
+ {
153
+ "expo": {
154
+ "plugins": [
155
+ [
156
+ "expo-gaode-map-navigation",
157
+ {
158
+ "androidKey": "your-android-key",
159
+ "iosKey": "your-ios-key"
160
+ }
161
+ ]
162
+ ]
163
+ }
164
+ }
165
+
166
+ 然后重新构建:
167
+ npx expo prebuild --clean
168
+ npx expo run:${platform === 'ios' ? 'ios' : 'android'}
169
+
170
+ 4️⃣ 或在代码中配置:
171
+ ExpoGaodeMapModule.initSDK({
172
+ androidKey: 'your-android-key',
173
+ iosKey: 'your-ios-key',
174
+ });`,
175
+ docUrl: `${this.docBaseUrl}/guide/initialization.html`,
176
+ });
177
+ }
178
+ /**
179
+ * 权限未授予错误
180
+ */
181
+ static permissionDenied(permissionType) {
182
+ return new GaodeMapError({
183
+ type: ErrorType.PERMISSION_DENIED,
184
+ message: '定位权限未授予,无法使用定位功能',
185
+ solution: `请按以下步骤授予权限:
186
+
187
+ 1️⃣ 请求权限:
188
+ import {ExpoGaodeMapModule} from 'expo-gaode-map-navigation';
189
+
190
+ const checkPermission = async () => {
191
+ // 检查权限状态
192
+ const status = await ExpoGaodeMapModule.checkLocationPermission();
193
+
194
+ if (!status.granted) {
195
+ // 请求权限
196
+ const result = await ExpoGaodeMapModule.requestLocationPermission();
197
+
198
+ if (!result.granted) {
199
+ // 用户拒绝授权,引导用户去设置
200
+ Alert.alert(
201
+ '需要定位权限',
202
+ '请在设置中开启定位权限以使用地图功能',
203
+ [
204
+ { text: '取消', style: 'cancel' },
205
+ { text: '去设置', onPress: () => Linking.openSettings() }
206
+ ]
207
+ );
208
+ }
209
+ }
210
+ };
211
+
212
+ 2️⃣ iOS 配置(在 app.json 中):
213
+ {
214
+ "expo": {
215
+ "ios": {
216
+ "infoPlist": {
217
+ "NSLocationWhenInUseUsageDescription": "需要获取您的位置信息以显示地图",
218
+ "NSLocationAlwaysAndWhenInUseUsageDescription": "需要获取您的位置信息"
219
+ }
220
+ }
221
+ }
222
+ }
223
+
224
+ 3️⃣ Android 配置(Config Plugin 会自动添加):
225
+ 使用 expo-gaode-map-navigation 的 Config Plugin 会自动添加必要的权限声明`,
226
+ docUrl: `${this.docBaseUrl}/guide/getting-started.html#权限配置`,
227
+ });
228
+ }
229
+ /**
230
+ * 定位失败错误
231
+ */
232
+ static locationFailed(reason) {
233
+ return new GaodeMapError({
234
+ type: ErrorType.LOCATION_FAILED,
235
+ message: `定位失败${reason ? `:${reason}` : ''}`,
236
+ solution: `⚠️ 最常见原因:API Key 与 Bundle ID 不匹配!
237
+
238
+ 请按以下顺序排查:
239
+
240
+ 1️⃣ 检查 API Key 配置(最常见问题):
241
+ • 访问高德开放平台:https://lbs.amap.com/
242
+ • 确认您的应用的 Bundle ID 与当前项目一致
243
+ • iOS Bundle ID:在 Xcode → Target → General → Bundle Identifier
244
+ • Android 包名:在 android/app/build.gradle → applicationId
245
+
246
+ 如果 Bundle ID 不同,必须在高德平台重新创建应用并获取新 Key
247
+
248
+ 2️⃣ 检查设备 GPS 和网络:
249
+ • 确认设备 GPS 已开启
250
+ • 检查网络连接是否正常
251
+ • 尝试在室外空旷处测试
252
+
253
+ 3️⃣ 检查定位权限:
254
+ • iOS:设置 → 隐私 → 定位服务 → 允许应用访问
255
+ • Android:设置 → 应用 → 权限管理 → 位置信息
256
+
257
+ 4️⃣ 配置定位参数(如果 API Key 正确但定位仍失败):
258
+ ExpoGaodeMapModule.setLocationTimeout(30); // 增加超时时间
259
+ ExpoGaodeMapModule.setInterval(2000); // 设置定位间隔
260
+
261
+ // Android 特有配置
262
+ ExpoGaodeMapModule.setLocationMode(2); // 高精度模式
263
+ ExpoGaodeMapModule.setGpsFirst(true); // GPS 优先
264
+
265
+ // iOS 特有配置
266
+ ExpoGaodeMapModule.setDesiredAccuracy(0); // 最佳精度`,
267
+ docUrl: `${this.docBaseUrl}/api/location.html`,
268
+ });
269
+ }
270
+ /**
271
+ * 原生模块不可用错误
272
+ */
273
+ static nativeModuleUnavailable() {
274
+ return new GaodeMapError({
275
+ type: ErrorType.NATIVE_MODULE_UNAVAILABLE,
276
+ message: 'expo-gaode-map-navigation 原生模块不可用',
277
+ solution: `请检查以下步骤:
278
+
279
+ 1️⃣ 确认已正确安装:
280
+ npm install expo-gaode-map-navigation
281
+ # 或
282
+ bun install expo-gaode-map-navigation
283
+
284
+ 2️⃣ 重新构建原生代码:
285
+ npx expo prebuild --clean
286
+ npx expo run:android
287
+ npx expo run:ios
288
+
289
+ 3️⃣ 检查 Expo 版本兼容性:
290
+ • expo-gaode-map-navigation 需要 Expo SDK 49+
291
+ • 不支持 Expo Go,必须使用 Development Build
292
+
293
+ 4️⃣ 检查是否与其他包冲突:
294
+ • 不能同时安装 expo-gaode-map 和 expo-gaode-map-navigation
295
+ • 两个包选择其一使用
296
+
297
+ 5️⃣ 清理缓存后重试:
298
+ cd android && ./gradlew clean && cd ..
299
+ cd ios && pod deintegrate && pod install && cd ..`,
300
+ docUrl: `${this.docBaseUrl}/guide/getting-started.html`,
301
+ });
302
+ }
303
+ /**
304
+ * 地图视图未初始化错误
305
+ */
306
+ static mapViewNotInitialized(methodName) {
307
+ return new GaodeMapError({
308
+ type: ErrorType.MAP_VIEW_NOT_INITIALIZED,
309
+ message: `无法调用 ${methodName}:地图视图尚未初始化`,
310
+ solution: `请确保:
311
+
312
+ 1️⃣ MapView 已经渲染完成
313
+ 2️⃣ 使用 ref 获取地图实例后再调用方法
314
+
315
+ 正确用法:
316
+ import { MapView, MapViewRef } from 'expo-gaode-map-navigation';
317
+
318
+ const App = () => {
319
+ const mapRef = useRef<MapViewRef>(null);
320
+
321
+ // ❌ 错误:在渲染前调用
322
+ // mapRef.current?.moveCamera(...);
323
+
324
+ // ✅ 正确:等待地图加载完成
325
+ const handleMapReady = () => {
326
+ mapRef.current?.moveCamera({
327
+ target: { latitude: 39.9, longitude: 116.4 },
328
+ zoom: 15,
329
+ });
330
+ };
331
+
332
+ return (
333
+ <MapView
334
+ ref={mapRef}
335
+ onMapReady={handleMapReady}
336
+ />
337
+ );
338
+ };`,
339
+ docUrl: `${this.docBaseUrl}/api/mapview.html`,
340
+ });
341
+ }
342
+ /**
343
+ * 参数错误
344
+ */
345
+ static invalidParameter(paramName, expected, received) {
346
+ return new GaodeMapError({
347
+ type: ErrorType.INVALID_PARAMETER,
348
+ message: `参数 "${paramName}" 类型错误`,
349
+ solution: `期望类型:${expected}
350
+ 实际接收:${typeof received} (${JSON.stringify(received)})
351
+
352
+ 请检查传入的参数是否符合要求。
353
+
354
+ 💡 提示:
355
+ • 使用 TypeScript 可以在编译时发现类型错误
356
+ • 参考 API 文档了解正确的参数类型`,
357
+ docUrl: `${this.docBaseUrl}/api/`,
358
+ });
359
+ }
360
+ /**
361
+ * 网络错误
362
+ */
363
+ static networkError(originalError) {
364
+ return new GaodeMapError({
365
+ type: ErrorType.NETWORK_ERROR,
366
+ message: '网络请求失败',
367
+ solution: `请检查:
368
+
369
+ 1️⃣ 网络连接是否正常
370
+ 2️⃣ API Key 是否有效
371
+ 3️⃣ 是否超出配额限制
372
+
373
+ 💡 如果问题持续,请:
374
+ • 检查高德开放平台控制台
375
+ • 查看 API 调用量和配额
376
+ • 确认 Key 的服务是否已开通`,
377
+ docUrl: `${this.docBaseUrl}/guide/troubleshooting.html`,
378
+ originalError,
379
+ });
380
+ }
381
+ /**
382
+ * 包装原生错误,提供更友好的提示
383
+ */
384
+ static wrapNativeError(error, context) {
385
+ const errorMessage = error instanceof Error ? error.message : String(error);
386
+ const scene = context.includes('MapView') || context.includes('渲染') ? 'map' : 'sdk';
387
+ if (errorMessage.includes('PRIVACY_NOT_AGREED') ||
388
+ errorMessage.includes('隐私协议未完成确认') ||
389
+ errorMessage.includes('隐私合规校验失败') ||
390
+ errorMessage.includes('555570') ||
391
+ errorMessage.includes('确保调用SDK任何接口前先调用更新隐私合规')) {
392
+ return this.privacyNotAgreed(scene);
393
+ }
394
+ // SDK 未初始化相关错误
395
+ if (errorMessage.includes('not initialized') ||
396
+ errorMessage.includes('未初始化') ||
397
+ errorMessage.includes('SDK未设置')) {
398
+ return this.sdkNotInitialized();
399
+ }
400
+ // API Key 相关错误
401
+ if (errorMessage.includes('key') ||
402
+ errorMessage.includes('invalid') ||
403
+ errorMessage.includes('鉴权失败')) {
404
+ return this.invalidApiKey('both');
405
+ }
406
+ // 权限相关错误
407
+ if (errorMessage.includes('permission') ||
408
+ errorMessage.includes('权限')) {
409
+ return this.permissionDenied('location');
410
+ }
411
+ // 定位相关错误
412
+ if (errorMessage.includes('location') ||
413
+ errorMessage.includes('定位')) {
414
+ return this.locationFailed(errorMessage);
415
+ }
416
+ // 通用错误
417
+ return new GaodeMapError({
418
+ type: ErrorType.INVALID_PARAMETER,
419
+ message: `${context} 失败`,
420
+ solution: `原始错误信息:${errorMessage}
421
+
422
+ 如果问题持续,请:
423
+ 1. 查看完整的错误堆栈
424
+ 2. 检查 API 调用参数
425
+ 3. 提交 Issue:https://github.com/TomWq/expo-gaode-map/issues`,
426
+ originalError: error instanceof Error ? error : undefined,
427
+ });
428
+ }
429
+ }
430
+ /**
431
+ * 错误日志工具
432
+ */
433
+ export class ErrorLogger {
434
+ // 兼容不同环境:Bun/Jest/Node
435
+ static isEnabled = typeof __DEV__ !== 'undefined' ? __DEV__ : true;
436
+ /**
437
+ * 启用/禁用错误日志
438
+ */
439
+ static setEnabled(enabled) {
440
+ this.isEnabled = enabled;
441
+ }
442
+ /**
443
+ * 记录错误
444
+ */
445
+ static log(error) {
446
+ if (!this.isEnabled)
447
+ return;
448
+ console.error(error.message);
449
+ if (error.originalError) {
450
+ console.error('原始错误:', error.originalError);
451
+ }
452
+ }
453
+ /**
454
+ * 记录警告
455
+ */
456
+ static warn(message, details) {
457
+ if (!this.isEnabled)
458
+ return;
459
+ console.warn(`⚠️ expo-gaode-map-navigation: ${message}`, details || '');
460
+ }
461
+ /**
462
+ * 记录调试信息
463
+ */
464
+ static info(message, details) {
465
+ if (!this.isEnabled)
466
+ return;
467
+ console.info(`expo-gaode-map-navigation: ${message}`, details || '');
468
+ }
469
+ }
470
+ //# sourceMappingURL=ErrorHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorHandler.js","sourceRoot":"","sources":["../../../../src/map/utils/ErrorHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,CAAN,IAAY,SAmBX;AAnBD,WAAY,SAAS;IACnB,eAAe;IACf,wDAA2C,CAAA;IAC3C,cAAc;IACd,sDAAyC,CAAA;IACzC,mBAAmB;IACnB,gDAAmC,CAAA;IACnC,YAAY;IACZ,oDAAuC,CAAA;IACvC,WAAW;IACX,gDAAmC,CAAA;IACnC,cAAc;IACd,oEAAuD,CAAA;IACvD,eAAe;IACf,kEAAqD,CAAA;IACrD,WAAW;IACX,oDAAuC,CAAA;IACvC,WAAW;IACX,4CAA+B,CAAA;AACjC,CAAC,EAnBW,SAAS,KAAT,SAAS,QAmBpB;AAkBD;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,IAAI,CAAY;IAChB,QAAQ,CAAS;IACjB,MAAM,CAAU;IAChB,aAAa,CAAS;IAEtB,YAAY,OAAqB;QAC/B,MAAM,WAAW,GAAG;;eAET,OAAO,CAAC,IAAI;;;;KAItB,OAAO,CAAC,OAAO;;;KAGf,OAAO,CAAC,QAAQ;;EAEnB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE;CACzD,CAAC;QACE,KAAK,CAAC,WAAW,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAC7C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,YAAY;IACf,MAAM,CAAC,UAAU,GAAG,wCAAwC,CAAC;IAErE;;OAEG;IACH,MAAM,CAAC,iBAAiB;QACtB,OAAO,IAAI,aAAa,CAAC;YACvB,IAAI,EAAE,SAAS,CAAC,mBAAmB;YACnC,OAAO,EAAE,gBAAgB;YACzB,QAAQ,EAAE;;;;;;;;;;;;;;;+BAee;YACzB,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,4BAA4B;SACvD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAoB;QAC1C,MAAM,SAAS,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7D,OAAO,IAAI,aAAa,CAAC;YACvB,IAAI,EAAE,SAAS,CAAC,kBAAkB;YAClC,OAAO,EAAE,oBAAoB,SAAS,EAAE;YACxC,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;gCAoBgB;YAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,4BAA4B;SACvD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,QAAoC;QACvD,MAAM,YAAY,GAAG;YACnB,OAAO,EAAE,SAAS;YAClB,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,eAAe;SACtB,CAAC,QAAQ,CAAC,CAAC;QAEZ,OAAO,IAAI,aAAa,CAAC;YACvB,IAAI,EAAE,SAAS,CAAC,eAAe;YAC/B,OAAO,EAAE,GAAG,YAAY,mBAAmB;YAC3C,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAkCD,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;;;;;;IAMjD;YACE,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,4BAA4B;SACvD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,cAA0B;QAChD,OAAO,IAAI,aAAa,CAAC;YACvB,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,OAAO,EAAE,kBAAkB;YAC3B,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0DAwC0C;YACpD,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,kCAAkC;SAC7D,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,MAAe;QACnC,OAAO,IAAI,aAAa,CAAC;YACvB,IAAI,EAAE,SAAS,CAAC,eAAe;YAC/B,OAAO,EAAE,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5C,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kDA8BkC;YAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,oBAAoB;SAC/C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,uBAAuB;QAC5B,OAAO,IAAI,aAAa,CAAC;YACvB,IAAI,EAAE,SAAS,CAAC,yBAAyB;YACzC,OAAO,EAAE,mCAAmC;YAC5C,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;kDAsBkC;YAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,6BAA6B;SACxD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,UAAkB;QAC7C,OAAO,IAAI,aAAa,CAAC;YACvB,IAAI,EAAE,SAAS,CAAC,wBAAwB;YACxC,OAAO,EAAE,QAAQ,UAAU,YAAY;YACvC,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4Bb;YACG,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,mBAAmB;SAC9C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,SAAiB,EAAE,QAAgB,EAAE,QAAiB;QAC5E,OAAO,IAAI,aAAa,CAAC;YACvB,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,OAAO,EAAE,OAAO,SAAS,QAAQ;YACjC,QAAQ,EAAE,QAAQ,QAAQ;OACzB,OAAO,QAAQ,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;;;;;;qBAM9B;YACf,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,OAAO;SAClC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,aAAqB;QACvC,OAAO,IAAI,aAAa,CAAC;YACvB,IAAI,EAAE,SAAS,CAAC,aAAa;YAC7B,OAAO,EAAE,QAAQ;YACjB,QAAQ,EAAE;;;;;;;;;kBASE;YACZ,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,6BAA6B;YACvD,aAAa;SACd,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,KAAc,EAAE,OAAe;QACpD,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAEpF,IACE,YAAY,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAC3C,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;YAClC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;YACjC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC/B,YAAY,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAC9C,CAAC;YACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;QAED,eAAe;QACf,IACE,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YACxC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC7B,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC/B,CAAC;YACD,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAClC,CAAC;QAED,eAAe;QACf,IACE,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC5B,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;YAChC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAC7B,CAAC;YACD,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,SAAS;QACT,IACE,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC;YACnC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC3B,CAAC;YACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC3C,CAAC;QAED,SAAS;QACT,IACE,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;YACjC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC3B,CAAC;YACD,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO;QACP,OAAO,IAAI,aAAa,CAAC;YACvB,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,OAAO,EAAE,GAAG,OAAO,KAAK;YACxB,QAAQ,EAAE,UAAU,YAAY;;;;;2DAKqB;YACrD,aAAa,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SAC1D,CAAC,CAAC;IACL,CAAC;;AAGH;;GAEG;AACH,MAAM,OAAO,WAAW;IACtB,uBAAuB;IACf,MAAM,CAAC,SAAS,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAE3E;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,OAAgB;QAChC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,KAAoB;QAC7B,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE7B,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAe,EAAE,OAAiB;QAC5C,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE5B,OAAO,CAAC,IAAI,CAAC,kCAAkC,OAAO,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAe,EAAE,OAAiB;QAC5C,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE5B,OAAO,CAAC,IAAI,CAAC,8BAA8B,OAAO,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC","sourcesContent":["/**\n * 高德地图错误处理工具\n * 提供友好的错误提示和解决方案指引\n */\n\n/**\n * 错误类型枚举\n */\nexport enum ErrorType {\n /** SDK 未初始化 */\n SDK_NOT_INITIALIZED = 'SDK_NOT_INITIALIZED',\n /** 隐私协议未确认 */\n PRIVACY_NOT_AGREED = 'PRIVACY_NOT_AGREED',\n /** API Key 配置错误 */\n INVALID_API_KEY = 'INVALID_API_KEY',\n /** 权限未授予 */\n PERMISSION_DENIED = 'PERMISSION_DENIED',\n /** 定位失败 */\n LOCATION_FAILED = 'LOCATION_FAILED',\n /** 原生模块不可用 */\n NATIVE_MODULE_UNAVAILABLE = 'NATIVE_MODULE_UNAVAILABLE',\n /** 地图视图未初始化 */\n MAP_VIEW_NOT_INITIALIZED = 'MAP_VIEW_NOT_INITIALIZED',\n /** 参数错误 */\n INVALID_PARAMETER = 'INVALID_PARAMETER',\n /** 网络错误 */\n NETWORK_ERROR = 'NETWORK_ERROR',\n}\n\n/**\n * 错误详情接口\n */\nexport interface ErrorDetails {\n /** 错误类型 */\n type: ErrorType;\n /** 错误消息 */\n message: string;\n /** 解决方案 */\n solution: string;\n /** 文档链接 */\n docUrl?: string;\n /** 原始错误 */\n originalError?: Error;\n}\n\n/**\n * 自定义错误类\n */\nexport class GaodeMapError extends Error {\n type: ErrorType;\n solution: string;\n docUrl?: string;\n originalError?: Error;\n\n constructor(details: ErrorDetails) {\n const fullMessage = `\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n🗺️ 高德地图错误 [${details.type}]\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n❌ 错误信息:\n ${details.message}\n\n💡 解决方案:\n ${details.solution}\n\n${details.docUrl ? `📖 详细文档:\\n ${details.docUrl}\\n` : ''}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;\n super(fullMessage);\n this.name = 'GaodeMapError';\n this.type = details.type;\n this.solution = details.solution;\n this.docUrl = details.docUrl;\n this.originalError = details.originalError;\n }\n}\n\n/**\n * 错误处理器类\n */\nexport class ErrorHandler {\n private static docBaseUrl = 'https://TomWq.github.io/expo-gaode-map';\n\n /**\n * SDK 未初始化错误\n */\n static sdkNotInitialized(): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.SDK_NOT_INITIALIZED,\n message: '高德地图 SDK 尚未初始化',\n solution: `请在使用地图功能前先调用 initSDK():\n\nimport {ExpoGaodeMapModule} from 'expo-gaode-map-navigation';\n\nuseEffect(() => {\n // 在组件挂载时初始化\n ExpoGaodeMapModule.initSDK({\n androidKey: 'your-android-key',\n iosKey: 'your-ios-key',\n });\n}, []);\n\n⚠️ 常见原因:\n1. 忘记调用 initSDK() 就使用了定位或地图功能\n2. initSDK() 调用时机过晚(应在 useEffect 中尽早调用)\n3. 使用 Config Plugin 但未重新构建原生代码`,\n docUrl: `${this.docBaseUrl}/guide/initialization.html`,\n });\n }\n\n /**\n * 隐私协议未确认错误\n */\n static privacyNotAgreed(scene: 'map' | 'sdk'): GaodeMapError {\n const sceneText = scene === 'map' ? '渲染 MapView' : '初始化 SDK';\n return new GaodeMapError({\n type: ErrorType.PRIVACY_NOT_AGREED,\n message: `调用高德地图前未完成隐私合规确认:${sceneText}`,\n solution: `请在调用任何高德地图 SDK 接口前,先明确完成隐私告知与同意:\n\nimport {ExpoGaodeMapModule} from 'expo-gaode-map-navigation';\n\n// 应用启动后,先展示你自己的隐私弹窗\nExpoGaodeMapModule.setPrivacyConfig({\n hasShow: true,\n hasContainsPrivacy: true,\n hasAgree: true,\n});\n\n// 然后再初始化 SDK / 渲染地图\nExpoGaodeMapModule.initSDK({\n androidKey: 'your-android-key',\n iosKey: 'your-ios-key',\n});\n\n⚠️ 升级注意:\n1. 不能只 import 包后直接渲染 MapView\n2. Android 若未先设置隐私,原生 SDK 可能直接报 555570\n3. 推荐在应用首次启动时先弹出隐私协议,同意后再进入地图页面`,\n docUrl: `${this.docBaseUrl}/guide/initialization.html`,\n });\n }\n\n /**\n * API Key 配置错误\n */\n static invalidApiKey(platform: 'android' | 'ios' | 'both'): GaodeMapError {\n const platformText = {\n android: 'Android',\n ios: 'iOS',\n both: 'Android 和 iOS',\n }[platform];\n\n return new GaodeMapError({\n type: ErrorType.INVALID_API_KEY,\n message: `${platformText} API Key 配置错误或未配置`,\n solution: `⚠️ API Key 与 Bundle ID 不匹配是最常见的原因!\n\n请检查以下步骤:\n\n1️⃣ 确认 API Key 的配置:\n • 访问高德开放平台:https://lbs.amap.com/\n • 检查您的应用配置中的 Bundle ID 是否与当前项目一致\n • iOS Bundle ID:在 Xcode → Target → General → Bundle Identifier 查看\n • Android 包名:在 android/app/build.gradle → applicationId 查看\n\n2️⃣ 重新创建正确的 API Key(如果 Bundle ID 不同):\n • 在高德开放平台创建新应用\n • 填写正确的 Bundle ID(iOS)或包名(Android)\n • 获取新的 API Key\n\n3️⃣ 配置 API Key(推荐使用 Config Plugin):\n\n在 app.json 中配置:\n{\n \"expo\": {\n \"plugins\": [\n [\n \"expo-gaode-map-navigation\",\n {\n \"androidKey\": \"your-android-key\",\n \"iosKey\": \"your-ios-key\"\n }\n ]\n ]\n }\n}\n\n然后重新构建:\nnpx expo prebuild --clean\nnpx expo run:${platform === 'ios' ? 'ios' : 'android'}\n\n4️⃣ 或在代码中配置:\nExpoGaodeMapModule.initSDK({\n androidKey: 'your-android-key',\n iosKey: 'your-ios-key',\n});`,\n docUrl: `${this.docBaseUrl}/guide/initialization.html`,\n });\n }\n\n /**\n * 权限未授予错误\n */\n static permissionDenied(permissionType: 'location'): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.PERMISSION_DENIED,\n message: '定位权限未授予,无法使用定位功能',\n solution: `请按以下步骤授予权限:\n\n1️⃣ 请求权限:\nimport {ExpoGaodeMapModule} from 'expo-gaode-map-navigation';\n\nconst checkPermission = async () => {\n // 检查权限状态\n const status = await ExpoGaodeMapModule.checkLocationPermission();\n \n if (!status.granted) {\n // 请求权限\n const result = await ExpoGaodeMapModule.requestLocationPermission();\n \n if (!result.granted) {\n // 用户拒绝授权,引导用户去设置\n Alert.alert(\n '需要定位权限',\n '请在设置中开启定位权限以使用地图功能',\n [\n { text: '取消', style: 'cancel' },\n { text: '去设置', onPress: () => Linking.openSettings() }\n ]\n );\n }\n }\n};\n\n2️⃣ iOS 配置(在 app.json 中):\n{\n \"expo\": {\n \"ios\": {\n \"infoPlist\": {\n \"NSLocationWhenInUseUsageDescription\": \"需要获取您的位置信息以显示地图\",\n \"NSLocationAlwaysAndWhenInUseUsageDescription\": \"需要获取您的位置信息\"\n }\n }\n }\n}\n\n3️⃣ Android 配置(Config Plugin 会自动添加):\n使用 expo-gaode-map-navigation 的 Config Plugin 会自动添加必要的权限声明`,\n docUrl: `${this.docBaseUrl}/guide/getting-started.html#权限配置`,\n });\n }\n\n /**\n * 定位失败错误\n */\n static locationFailed(reason?: string): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.LOCATION_FAILED,\n message: `定位失败${reason ? `:${reason}` : ''}`,\n solution: `⚠️ 最常见原因:API Key 与 Bundle ID 不匹配!\n\n请按以下顺序排查:\n\n1️⃣ 检查 API Key 配置(最常见问题):\n • 访问高德开放平台:https://lbs.amap.com/\n • 确认您的应用的 Bundle ID 与当前项目一致\n • iOS Bundle ID:在 Xcode → Target → General → Bundle Identifier\n • Android 包名:在 android/app/build.gradle → applicationId\n \n 如果 Bundle ID 不同,必须在高德平台重新创建应用并获取新 Key\n\n2️⃣ 检查设备 GPS 和网络:\n • 确认设备 GPS 已开启\n • 检查网络连接是否正常\n • 尝试在室外空旷处测试\n\n3️⃣ 检查定位权限:\n • iOS:设置 → 隐私 → 定位服务 → 允许应用访问\n • Android:设置 → 应用 → 权限管理 → 位置信息\n\n4️⃣ 配置定位参数(如果 API Key 正确但定位仍失败):\nExpoGaodeMapModule.setLocationTimeout(30); // 增加超时时间\nExpoGaodeMapModule.setInterval(2000); // 设置定位间隔\n\n// Android 特有配置\nExpoGaodeMapModule.setLocationMode(2); // 高精度模式\nExpoGaodeMapModule.setGpsFirst(true); // GPS 优先\n\n// iOS 特有配置\nExpoGaodeMapModule.setDesiredAccuracy(0); // 最佳精度`,\n docUrl: `${this.docBaseUrl}/api/location.html`,\n });\n }\n\n /**\n * 原生模块不可用错误\n */\n static nativeModuleUnavailable(): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.NATIVE_MODULE_UNAVAILABLE,\n message: 'expo-gaode-map-navigation 原生模块不可用',\n solution: `请检查以下步骤:\n\n1️⃣ 确认已正确安装:\nnpm install expo-gaode-map-navigation\n# 或\nbun install expo-gaode-map-navigation\n\n2️⃣ 重新构建原生代码:\nnpx expo prebuild --clean\nnpx expo run:android\nnpx expo run:ios\n\n3️⃣ 检查 Expo 版本兼容性:\n• expo-gaode-map-navigation 需要 Expo SDK 49+\n• 不支持 Expo Go,必须使用 Development Build\n\n4️⃣ 检查是否与其他包冲突:\n• 不能同时安装 expo-gaode-map 和 expo-gaode-map-navigation\n• 两个包选择其一使用\n\n5️⃣ 清理缓存后重试:\ncd android && ./gradlew clean && cd ..\ncd ios && pod deintegrate && pod install && cd ..`,\n docUrl: `${this.docBaseUrl}/guide/getting-started.html`,\n });\n }\n\n /**\n * 地图视图未初始化错误\n */\n static mapViewNotInitialized(methodName: string): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.MAP_VIEW_NOT_INITIALIZED,\n message: `无法调用 ${methodName}:地图视图尚未初始化`,\n solution: `请确保:\n\n1️⃣ MapView 已经渲染完成\n2️⃣ 使用 ref 获取地图实例后再调用方法\n\n正确用法:\nimport { MapView, MapViewRef } from 'expo-gaode-map-navigation';\n\nconst App = () => {\n const mapRef = useRef<MapViewRef>(null);\n \n // ❌ 错误:在渲染前调用\n // mapRef.current?.moveCamera(...);\n \n // ✅ 正确:等待地图加载完成\n const handleMapReady = () => {\n mapRef.current?.moveCamera({\n target: { latitude: 39.9, longitude: 116.4 },\n zoom: 15,\n });\n };\n \n return (\n <MapView\n ref={mapRef}\n onMapReady={handleMapReady}\n />\n );\n};`,\n docUrl: `${this.docBaseUrl}/api/mapview.html`,\n });\n }\n\n /**\n * 参数错误\n */\n static invalidParameter(paramName: string, expected: string, received: unknown): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.INVALID_PARAMETER,\n message: `参数 \"${paramName}\" 类型错误`,\n solution: `期望类型:${expected}\n实际接收:${typeof received} (${JSON.stringify(received)})\n\n请检查传入的参数是否符合要求。\n\n💡 提示:\n• 使用 TypeScript 可以在编译时发现类型错误\n• 参考 API 文档了解正确的参数类型`,\n docUrl: `${this.docBaseUrl}/api/`,\n });\n }\n\n /**\n * 网络错误\n */\n static networkError(originalError?: Error): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.NETWORK_ERROR,\n message: '网络请求失败',\n solution: `请检查:\n\n1️⃣ 网络连接是否正常\n2️⃣ API Key 是否有效\n3️⃣ 是否超出配额限制\n\n💡 如果问题持续,请:\n• 检查高德开放平台控制台\n• 查看 API 调用量和配额\n• 确认 Key 的服务是否已开通`,\n docUrl: `${this.docBaseUrl}/guide/troubleshooting.html`,\n originalError,\n });\n }\n\n /**\n * 包装原生错误,提供更友好的提示\n */\n static wrapNativeError(error: unknown, context: string): GaodeMapError {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const scene = context.includes('MapView') || context.includes('渲染') ? 'map' : 'sdk';\n\n if (\n errorMessage.includes('PRIVACY_NOT_AGREED') ||\n errorMessage.includes('隐私协议未完成确认') ||\n errorMessage.includes('隐私合规校验失败') ||\n errorMessage.includes('555570') ||\n errorMessage.includes('确保调用SDK任何接口前先调用更新隐私合规')\n ) {\n return this.privacyNotAgreed(scene);\n }\n \n // SDK 未初始化相关错误\n if (\n errorMessage.includes('not initialized') ||\n errorMessage.includes('未初始化') ||\n errorMessage.includes('SDK未设置')\n ) {\n return this.sdkNotInitialized();\n }\n \n // API Key 相关错误\n if (\n errorMessage.includes('key') ||\n errorMessage.includes('invalid') ||\n errorMessage.includes('鉴权失败')\n ) {\n return this.invalidApiKey('both');\n }\n \n // 权限相关错误\n if (\n errorMessage.includes('permission') ||\n errorMessage.includes('权限')\n ) {\n return this.permissionDenied('location');\n }\n \n // 定位相关错误\n if (\n errorMessage.includes('location') ||\n errorMessage.includes('定位')\n ) {\n return this.locationFailed(errorMessage);\n }\n \n // 通用错误\n return new GaodeMapError({\n type: ErrorType.INVALID_PARAMETER,\n message: `${context} 失败`,\n solution: `原始错误信息:${errorMessage}\n\n如果问题持续,请:\n1. 查看完整的错误堆栈\n2. 检查 API 调用参数\n3. 提交 Issue:https://github.com/TomWq/expo-gaode-map/issues`,\n originalError: error instanceof Error ? error : undefined,\n });\n }\n}\n\n/**\n * 错误日志工具\n */\nexport class ErrorLogger {\n // 兼容不同环境:Bun/Jest/Node\n private static isEnabled = typeof __DEV__ !== 'undefined' ? __DEV__ : true;\n\n /**\n * 启用/禁用错误日志\n */\n static setEnabled(enabled: boolean) {\n this.isEnabled = enabled;\n }\n\n /**\n * 记录错误\n */\n static log(error: GaodeMapError) {\n if (!this.isEnabled) return;\n\n console.error(error.message);\n \n if (error.originalError) {\n console.error('原始错误:', error.originalError);\n }\n }\n\n /**\n * 记录警告\n */\n static warn(message: string, details?: unknown) {\n if (!this.isEnabled) return;\n \n console.warn(`⚠️ expo-gaode-map-navigation: ${message}`, details || '');\n }\n\n /**\n * 记录调试信息\n */\n static info(message: string, details?: unknown) {\n if (!this.isEnabled) return;\n\n console.info(`expo-gaode-map-navigation: ${message}`, details || '');\n }\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import { LatLng, LatLngPoint } from '../types/common.types';
2
+ /**
3
+ * 将坐标点归一化为对象格式
4
+ * 支持 [longitude, latitude] 数组或 { latitude, longitude } 对象
5
+ * 注意:数组格式遵循 GeoJSON 标准,即 [经度, 纬度]
6
+ *
7
+ * @param point 坐标点
8
+ * @returns { latitude, longitude } 对象
9
+ */
10
+ export declare function normalizeLatLng(point: LatLngPoint): LatLng;
11
+ /**
12
+ * 将坐标点数组归一化为对象数组
13
+ * 支持一维数组 [p1, p2, ...] 或二维嵌套数组 [[p1, p2, ...], [p3, p4, ...]]
14
+ *
15
+ * @param points 坐标点数组或嵌套数组
16
+ * @returns 归一化后的坐标数组
17
+ */
18
+ export declare function normalizeLatLngList(points: LatLngPoint[]): LatLng[];
19
+ export declare function normalizeLatLngList(points: LatLngPoint[][]): LatLng[][];
20
+ export declare function normalizeLatLngList(points: LatLngPoint[] | LatLngPoint[][]): LatLng[] | LatLng[][];
21
+ //# sourceMappingURL=GeoUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeoUtils.d.ts","sourceRoot":"","sources":["../../../../src/map/utils/GeoUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAO5D;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CA2B1D;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"}
@@ -0,0 +1,78 @@
1
+ import { LatLng, LatLngPoint } from '../types/common.types';
2
+ /**
3
+ * 将坐标点归一化为对象格式
4
+ * 支持 [longitude, latitude] 数组或 { latitude, longitude } 对象
5
+ * 注意:数组格式遵循 GeoJSON 标准,即 [经度, 纬度]
6
+ *
7
+ * @param point 坐标点
8
+ * @returns { latitude, longitude } 对象
9
+ */
10
+ export function normalizeLatLng(point) {
11
+ if (Array.isArray(point)) {
12
+ let longitude = point[0];
13
+ let latitude = point[1];
14
+ // 智能纠错:如果纬度超出范围 [-90, 90] 且交换后在范围内,则认为是用户传反了
15
+ if (Math.abs(latitude) > 90 && Math.abs(longitude) <= 90) {
16
+ console.warn(`[expo-gaode-map] 检测到坐标数组格式可能为 [latitude, longitude] (${point}),已自动纠正为 [longitude, latitude]。建议显式使用 [经度, 纬度] 格式以遵循 GeoJSON 标准。`);
17
+ return {
18
+ latitude: longitude,
19
+ longitude: latitude
20
+ };
21
+ }
22
+ return {
23
+ longitude,
24
+ latitude,
25
+ };
26
+ }
27
+ // 对象格式:强制转换为数字,防止传入 string 类型导致原生层 Crash
28
+ const normalizedPoint = point;
29
+ return {
30
+ latitude: Number(normalizedPoint.latitude),
31
+ longitude: Number(normalizedPoint.longitude),
32
+ };
33
+ }
34
+ export function normalizeLatLngList(points) {
35
+ if (!points || points.length === 0)
36
+ return [];
37
+ // 检查是否为嵌套数组 (检查第一项是否也是数组或对象,且不符合 LatLngPoint 的基本判断)
38
+ // 如果第一项是数组且长度 > 2,或者第一项的第一个元素也是数组/对象,则认为是嵌套数组
39
+ const firstItem = points[0];
40
+ if (Array.isArray(firstItem)) {
41
+ // 如果第一项是 [number, number],则这可能是一个一维坐标点数组 (LatLngPoint[])
42
+ // 除非所有元素都是数组且至少有一个子数组长度不等于2,或者我们明确知道这是嵌套的
43
+ // 为了支持 Polygon 的嵌套格式,我们需要递归处理
44
+ // 启发式判断:如果第一项是数组且它的第一个元素也是数组或对象,那么它一定是嵌套的
45
+ if (Array.isArray(firstItem[0]) || (typeof firstItem[0] === 'object' && firstItem[0] !== null && 'latitude' in firstItem[0])) {
46
+ return points.map(ring => ring.map(normalizeLatLng));
47
+ }
48
+ // 另一种情况:用户传入的是 [[lng, lat], [lng, lat]],这既可以看作 LatLngPoint[],
49
+ // 也可以看作 LatLngPoint[][] (只有一个外轮廓)。
50
+ // 在 Polygon 组件中,我们希望统一处理。
51
+ // 如果是 Polygon 传入的,我们希望保留嵌套结构。
52
+ // 但 normalizeLatLngList 是通用的。
53
+ // 改进逻辑:如果 data[0] 是一个点,我们把它当作一维数组处理。
54
+ // 如果 data[0] 不是一个点(即它是点的集合),我们当作二维处理。
55
+ if (isPoint(firstItem)) {
56
+ return points.map(normalizeLatLng);
57
+ }
58
+ else {
59
+ return points.map(ring => ring.map(normalizeLatLng));
60
+ }
61
+ }
62
+ return points.map(normalizeLatLng);
63
+ }
64
+ /**
65
+ * 判断一个对象是否为坐标点 (LatLngPoint)
66
+ */
67
+ function isPoint(item) {
68
+ if (!item || typeof item !== 'object')
69
+ return false;
70
+ // { latitude, longitude } 格式
71
+ if ('latitude' in item && 'longitude' in item)
72
+ return true;
73
+ // [longitude, latitude] 格式
74
+ if (Array.isArray(item) && item.length >= 2 && typeof item[0] === 'number' && typeof item[1] === 'number')
75
+ return true;
76
+ return false;
77
+ }
78
+ //# sourceMappingURL=GeoUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeoUtils.js","sourceRoot":"","sources":["../../../../src/map/utils/GeoUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { 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 let longitude = point[0];\n let latitude = 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 const normalizedPoint = point as LatLngLike;\n return {\n latitude: Number(normalizedPoint.latitude),\n longitude: Number(normalizedPoint.longitude),\n };\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"]}