expo-gaode-map-navigation 2.0.12-next.0 → 2.0.13

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 (238) hide show
  1. package/README.md +296 -7
  2. package/android/build.gradle +12 -4
  3. package/android/src/main/AndroidManifest.xml +10 -1
  4. package/android/src/main/cpp/cluster_jni.cpp +56 -0
  5. package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapModule.kt +49 -8
  6. package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapOfflineModule.kt +83 -15
  7. package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapView.kt +13 -3
  8. package/android/src/main/java/expo/modules/gaodemap/map/managers/UIManager.kt +36 -39
  9. package/android/src/main/java/expo/modules/gaodemap/map/modules/SDKInitializer.kt +23 -17
  10. package/android/src/main/java/expo/modules/gaodemap/map/overlays/ClusterView.kt +5 -2
  11. package/android/src/main/java/expo/modules/gaodemap/map/overlays/HeatMapView.kt +122 -10
  12. package/android/src/main/java/expo/modules/gaodemap/map/overlays/HeatMapViewModule.kt +2 -2
  13. package/android/src/main/java/expo/modules/gaodemap/map/overlays/MarkerView.kt +37 -25
  14. package/android/src/main/java/expo/modules/gaodemap/map/overlays/MarkerViewModule.kt +6 -6
  15. package/android/src/main/java/expo/modules/gaodemap/map/search/ExpoGaodeMapSearchModule.kt +751 -0
  16. package/android/src/main/java/expo/modules/gaodemap/map/utils/GeometryUtils.kt +103 -0
  17. package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNaviView.kt +1408 -394
  18. package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNaviViewModule.kt +121 -1
  19. package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNavigationModule.kt +14 -28
  20. package/android/src/main/java/expo/modules/gaodemap/navigation/listeners/IndependentRouteListener.kt +28 -3
  21. package/android/src/main/java/expo/modules/gaodemap/navigation/listeners/RouteCalculateListener.kt +2 -2
  22. package/android/src/main/java/expo/modules/gaodemap/navigation/managers/IndependentRouteManager.kt +114 -15
  23. package/android/src/main/java/expo/modules/gaodemap/navigation/routes/drive/DriveTruckRouteCalculator.kt +24 -35
  24. package/android/src/main/java/expo/modules/gaodemap/navigation/services/IndependentRouteService.kt +50 -36
  25. package/android/src/main/java/expo/modules/gaodemap/navigation/services/NavigationForegroundService.kt +661 -0
  26. package/android/src/main/java/expo/modules/gaodemap/navigation/utils/Converters.kt +21 -12
  27. package/android/src/main/res/drawable/ic_nav_notification_small.xml +10 -0
  28. package/android/src/main/res/drawable/landback_0.png +0 -0
  29. package/android/src/main/res/drawable/landback_1.png +0 -0
  30. package/android/src/main/res/drawable/landback_2.png +0 -0
  31. package/android/src/main/res/drawable/landback_3.png +0 -0
  32. package/android/src/main/res/drawable/landback_4.png +0 -0
  33. package/android/src/main/res/drawable/landback_5.png +0 -0
  34. package/android/src/main/res/drawable/landback_6.png +0 -0
  35. package/android/src/main/res/drawable/landback_7.png +0 -0
  36. package/android/src/main/res/drawable/landback_8.png +0 -0
  37. package/android/src/main/res/drawable/landback_9.png +0 -0
  38. package/android/src/main/res/drawable/landback_a.png +0 -0
  39. package/android/src/main/res/drawable/landback_b.png +0 -0
  40. package/android/src/main/res/drawable/landback_c.png +0 -0
  41. package/android/src/main/res/drawable/landback_d.png +0 -0
  42. package/android/src/main/res/drawable/landback_e.png +0 -0
  43. package/android/src/main/res/drawable/landback_f.png +0 -0
  44. package/android/src/main/res/drawable/landback_g.png +0 -0
  45. package/android/src/main/res/drawable/landback_h.png +0 -0
  46. package/android/src/main/res/drawable/landback_i.png +0 -0
  47. package/android/src/main/res/drawable/landback_j.png +0 -0
  48. package/android/src/main/res/drawable/landback_k.png +0 -0
  49. package/android/src/main/res/drawable/landback_l.png +0 -0
  50. package/android/src/main/res/drawable/landfront_0.png +0 -0
  51. package/android/src/main/res/drawable/landfront_00.png +0 -0
  52. package/android/src/main/res/drawable/landfront_1.png +0 -0
  53. package/android/src/main/res/drawable/landfront_11.png +0 -0
  54. package/android/src/main/res/drawable/landfront_20.png +0 -0
  55. package/android/src/main/res/drawable/landfront_21.png +0 -0
  56. package/android/src/main/res/drawable/landfront_22.png +0 -0
  57. package/android/src/main/res/drawable/landfront_3.png +0 -0
  58. package/android/src/main/res/drawable/landfront_33.png +0 -0
  59. package/android/src/main/res/drawable/landfront_40.png +0 -0
  60. package/android/src/main/res/drawable/landfront_43.png +0 -0
  61. package/android/src/main/res/drawable/landfront_44.png +0 -0
  62. package/android/src/main/res/drawable/landfront_5.png +0 -0
  63. package/android/src/main/res/drawable/landfront_55.png +0 -0
  64. package/android/src/main/res/drawable/landfront_61.png +0 -0
  65. package/android/src/main/res/drawable/landfront_63.png +0 -0
  66. package/android/src/main/res/drawable/landfront_66.png +0 -0
  67. package/android/src/main/res/drawable/landfront_70.png +0 -0
  68. package/android/src/main/res/drawable/landfront_71.png +0 -0
  69. package/android/src/main/res/drawable/landfront_73.png +0 -0
  70. package/android/src/main/res/drawable/landfront_77.png +0 -0
  71. package/android/src/main/res/drawable/landfront_8.png +0 -0
  72. package/android/src/main/res/drawable/landfront_88.png +0 -0
  73. package/android/src/main/res/drawable/landfront_90.png +0 -0
  74. package/android/src/main/res/drawable/landfront_95.png +0 -0
  75. package/android/src/main/res/drawable/landfront_99.png +0 -0
  76. package/android/src/main/res/drawable/landfront_a0.png +0 -0
  77. package/android/src/main/res/drawable/landfront_a8.png +0 -0
  78. package/android/src/main/res/drawable/landfront_aa.png +0 -0
  79. package/android/src/main/res/drawable/landfront_b1.png +0 -0
  80. package/android/src/main/res/drawable/landfront_b5.png +0 -0
  81. package/android/src/main/res/drawable/landfront_bb.png +0 -0
  82. package/android/src/main/res/drawable/landfront_c3.png +0 -0
  83. package/android/src/main/res/drawable/landfront_c8.png +0 -0
  84. package/android/src/main/res/drawable/landfront_cc.png +0 -0
  85. package/android/src/main/res/drawable/landfront_d.png +0 -0
  86. package/android/src/main/res/drawable/landfront_dd.png +0 -0
  87. package/android/src/main/res/drawable/landfront_e1.png +0 -0
  88. package/android/src/main/res/drawable/landfront_e5.png +0 -0
  89. package/android/src/main/res/drawable/landfront_ee.png +0 -0
  90. package/android/src/main/res/drawable/landfront_f0.png +0 -0
  91. package/android/src/main/res/drawable/landfront_f1.png +0 -0
  92. package/android/src/main/res/drawable/landfront_f5.png +0 -0
  93. package/android/src/main/res/drawable/landfront_ff.png +0 -0
  94. package/android/src/main/res/drawable/landfront_g3.png +0 -0
  95. package/android/src/main/res/drawable/landfront_g5.png +0 -0
  96. package/android/src/main/res/drawable/landfront_gg.png +0 -0
  97. package/android/src/main/res/drawable/landfront_h1.png +0 -0
  98. package/android/src/main/res/drawable/landfront_h3.png +0 -0
  99. package/android/src/main/res/drawable/landfront_h5.png +0 -0
  100. package/android/src/main/res/drawable/landfront_hh.png +0 -0
  101. package/android/src/main/res/drawable/landfront_i0.png +0 -0
  102. package/android/src/main/res/drawable/landfront_i3.png +0 -0
  103. package/android/src/main/res/drawable/landfront_i5.png +0 -0
  104. package/android/src/main/res/drawable/landfront_ii.png +0 -0
  105. package/android/src/main/res/drawable/landfront_j1.png +0 -0
  106. package/android/src/main/res/drawable/landfront_j8.png +0 -0
  107. package/android/src/main/res/drawable/landfront_jj.png +0 -0
  108. package/android/src/main/res/drawable/landfront_kk.png +0 -0
  109. package/android/src/main/res/drawable/landfront_ll.png +0 -0
  110. package/android/src/main/res/drawable/nav_notification_brand_icon.xml +16 -0
  111. package/android/src/main/res/drawable/navi_arrow_leftline.png +0 -0
  112. package/android/src/main/res/drawable/navi_lane_shape_bg_center.xml +5 -0
  113. package/android/src/main/res/drawable/navi_lane_shape_bg_left.xml +8 -0
  114. package/android/src/main/res/drawable/navi_lane_shape_bg_over.xml +6 -0
  115. package/android/src/main/res/drawable/navi_lane_shape_bg_right.xml +8 -0
  116. package/android/src/main/res/drawable-nodpi/nav_tracker_car.png +0 -0
  117. package/build/ExpoGaodeMapNaviView.d.ts +16 -0
  118. package/build/ExpoGaodeMapNaviView.d.ts.map +1 -1
  119. package/build/ExpoGaodeMapNaviView.js +74 -1
  120. package/build/ExpoGaodeMapNaviView.js.map +1 -1
  121. package/build/index.d.ts +56 -8
  122. package/build/index.d.ts.map +1 -1
  123. package/build/index.js +452 -10
  124. package/build/index.js.map +1 -1
  125. package/build/map/ExpoGaodeMapModule.d.ts +15 -13
  126. package/build/map/ExpoGaodeMapModule.d.ts.map +1 -1
  127. package/build/map/ExpoGaodeMapModule.js +31 -39
  128. package/build/map/ExpoGaodeMapModule.js.map +1 -1
  129. package/build/map/ExpoGaodeMapOfflineModule.d.ts +5 -0
  130. package/build/map/ExpoGaodeMapOfflineModule.d.ts.map +1 -1
  131. package/build/map/ExpoGaodeMapOfflineModule.js.map +1 -1
  132. package/build/map/ExpoGaodeMapView.d.ts +3 -4
  133. package/build/map/ExpoGaodeMapView.d.ts.map +1 -1
  134. package/build/map/ExpoGaodeMapView.js +28 -25
  135. package/build/map/ExpoGaodeMapView.js.map +1 -1
  136. package/build/map/components/overlays/Circle.d.ts.map +1 -1
  137. package/build/map/components/overlays/Circle.js +1 -30
  138. package/build/map/components/overlays/Circle.js.map +1 -1
  139. package/build/map/components/overlays/Cluster.d.ts.map +1 -1
  140. package/build/map/components/overlays/Cluster.js +1 -42
  141. package/build/map/components/overlays/Cluster.js.map +1 -1
  142. package/build/map/components/overlays/HeatMap.d.ts.map +1 -1
  143. package/build/map/components/overlays/HeatMap.js +21 -21
  144. package/build/map/components/overlays/HeatMap.js.map +1 -1
  145. package/build/map/components/overlays/Marker.d.ts.map +1 -1
  146. package/build/map/components/overlays/Marker.js +76 -80
  147. package/build/map/components/overlays/Marker.js.map +1 -1
  148. package/build/map/components/overlays/Polygon.d.ts.map +1 -1
  149. package/build/map/components/overlays/Polygon.js +1 -25
  150. package/build/map/components/overlays/Polygon.js.map +1 -1
  151. package/build/map/components/overlays/Polyline.d.ts.map +1 -1
  152. package/build/map/components/overlays/Polyline.js +1 -31
  153. package/build/map/components/overlays/Polyline.js.map +1 -1
  154. package/build/map/index.d.ts +9 -2
  155. package/build/map/index.d.ts.map +1 -1
  156. package/build/map/index.js +9 -2
  157. package/build/map/index.js.map +1 -1
  158. package/build/map/search/ExpoGaodeMapSearch.types.d.ts +340 -0
  159. package/build/map/search/ExpoGaodeMapSearch.types.d.ts.map +1 -0
  160. package/build/map/search/ExpoGaodeMapSearch.types.js +19 -0
  161. package/build/map/search/ExpoGaodeMapSearch.types.js.map +1 -0
  162. package/build/map/search/ExpoGaodeMapSearchModule.d.ts +74 -0
  163. package/build/map/search/ExpoGaodeMapSearchModule.d.ts.map +1 -0
  164. package/build/map/search/ExpoGaodeMapSearchModule.js +47 -0
  165. package/build/map/search/ExpoGaodeMapSearchModule.js.map +1 -0
  166. package/build/map/search/index.d.ts +156 -0
  167. package/build/map/search/index.d.ts.map +1 -0
  168. package/build/map/search/index.js +171 -0
  169. package/build/map/search/index.js.map +1 -0
  170. package/build/map/types/index.d.ts +2 -2
  171. package/build/map/types/index.d.ts.map +1 -1
  172. package/build/map/types/index.js.map +1 -1
  173. package/build/map/types/map-view.types.d.ts +4 -2
  174. package/build/map/types/map-view.types.d.ts.map +1 -1
  175. package/build/map/types/map-view.types.js.map +1 -1
  176. package/build/map/types/native-module.types.d.ts +11 -12
  177. package/build/map/types/native-module.types.d.ts.map +1 -1
  178. package/build/map/types/native-module.types.js.map +1 -1
  179. package/build/map/types/overlays.types.d.ts +9 -14
  180. package/build/map/types/overlays.types.d.ts.map +1 -1
  181. package/build/map/types/overlays.types.js.map +1 -1
  182. package/build/map/types/route-playback.types.d.ts +16 -0
  183. package/build/map/types/route-playback.types.d.ts.map +1 -1
  184. package/build/map/types/route-playback.types.js.map +1 -1
  185. package/build/map/utils/ErrorHandler.js +11 -11
  186. package/build/map/utils/ErrorHandler.js.map +1 -1
  187. package/build/map/utils/OfflineMapManager.d.ts +4 -0
  188. package/build/map/utils/OfflineMapManager.d.ts.map +1 -1
  189. package/build/map/utils/OfflineMapManager.js +6 -0
  190. package/build/map/utils/OfflineMapManager.js.map +1 -1
  191. package/build/types/coordinates.types.d.ts +3 -0
  192. package/build/types/coordinates.types.d.ts.map +1 -1
  193. package/build/types/coordinates.types.js.map +1 -1
  194. package/build/types/independent.types.d.ts +111 -12
  195. package/build/types/independent.types.d.ts.map +1 -1
  196. package/build/types/independent.types.js.map +1 -1
  197. package/build/types/native-module.types.d.ts +1 -1
  198. package/build/types/native-module.types.js.map +1 -1
  199. package/build/types/naviview.types.d.ts +304 -14
  200. package/build/types/naviview.types.d.ts.map +1 -1
  201. package/build/types/naviview.types.js.map +1 -1
  202. package/build/types/route.types.d.ts +12 -2
  203. package/build/types/route.types.d.ts.map +1 -1
  204. package/build/types/route.types.js.map +1 -1
  205. package/expo-module.config.json +4 -2
  206. package/ios/ExpoGaodeMapNaviView.swift +2331 -201
  207. package/ios/ExpoGaodeMapNaviViewModule.swift +109 -1
  208. package/ios/ExpoGaodeMapNavigation.podspec +2 -1
  209. package/ios/ExpoGaodeMapNavigationModule.swift +7 -5
  210. package/ios/managers/IndependentRouteManager.swift +90 -26
  211. package/ios/map/ExpoGaodeMapModule.swift +72 -21
  212. package/ios/map/ExpoGaodeMapOfflineModule.swift +61 -0
  213. package/ios/map/ExpoGaodeMapSearchModule.swift +773 -0
  214. package/ios/map/ExpoGaodeMapView.swift +23 -5
  215. package/ios/map/GaodeMapPrivacyManager.swift +26 -18
  216. package/ios/map/cpp/GeometryEngine.cpp +112 -0
  217. package/ios/map/cpp/GeometryEngine.hpp +21 -0
  218. package/ios/map/modules/LocationManager.swift +37 -5
  219. package/ios/map/overlays/MarkerView.swift +11 -11
  220. package/ios/map/overlays/MarkerViewModule.swift +4 -4
  221. package/ios/map/overlays/PolylineView.swift +6 -12
  222. package/ios/map/utils/ClusterNative.h +8 -0
  223. package/ios/map/utils/ClusterNative.mm +27 -0
  224. package/ios/map/utils/PermissionManager.swift +115 -6
  225. package/ios/routes/drive/DriveTruckRouteCalculator.swift +165 -77
  226. package/ios/routes/walkride/WalkRideRouteCalculator.swift +127 -1
  227. package/ios/services/IndependentRouteService.swift +198 -39
  228. package/ios/services/NavigationLiveActivityAttributes.swift +48 -0
  229. package/ios/services/NavigationLiveActivityManager.swift +359 -0
  230. package/package.json +22 -7
  231. package/plugin/build/withGaodeMap.d.ts +8 -0
  232. package/plugin/build/withGaodeMap.js +60 -4
  233. package/scripts/check-expo-modules.js +68 -0
  234. package/shared/cpp/GeometryEngine.cpp +112 -0
  235. package/shared/cpp/GeometryEngine.hpp +21 -0
  236. package/widget-template/README.md +46 -0
  237. package/widget-template/ios/NavigationLiveActivityWidget.swift +367 -0
  238. package/android/src/main/java/expo/modules/gaodemap/navigation/managers/RouteCalculator.kt +0 -173
package/build/index.d.ts CHANGED
@@ -1,8 +1,19 @@
1
1
  import ExpoGaodeMapNavigationModule from './ExpoGaodeMapNavigationModule';
2
+ import { ExpoGaodeMapNaviView, type ExpoGaodeMapNaviViewRef } from './ExpoGaodeMapNaviView';
2
3
  export * from './map';
3
4
  import { RouteType, DriveStrategy, WalkStrategy, RideStrategy, TruckSize, TravelStrategy, type TransitRouteOptions } from './types';
4
- import type { NaviPoint, RouteOptions, DriveRouteOptions, WalkRouteOptions, RideRouteOptions, EBikeRouteOptions, TransitRouteOptions as TransitRouteOptionsType, TruckRouteOptions, OfficialNaviPageOptions, RouteResult, DriveRouteResult, IndependentRouteResult, IndependentDriveRouteOptions, IndependentTruckRouteOptions, IndependentWalkRouteOptions, IndependentRideRouteOptions, SelectIndependentRouteOptions, StartNaviWithIndependentPathOptions, ClearIndependentRouteOptions, MotorcycleRouteOptions, IndependentMotorcycleRouteOptions } from './types';
5
- export { ExpoGaodeMapNaviView, type ExpoGaodeMapNaviViewRef, ExpoGaodeMapNaviView as NaviView, type ExpoGaodeMapNaviViewRef as NaviViewRef } from './ExpoGaodeMapNaviView';
5
+ import type { NaviPoint, RouteOptions, DriveRouteOptions, WalkRouteOptions, RideRouteOptions, EBikeRouteOptions, TransitRouteOptions as TransitRouteOptionsType, TruckRouteOptions, OfficialNaviPageOptions, RouteResult, DriveRouteResult, IndependentRouteResult, IndependentDriveRouteOptions, IndependentTruckRouteOptions, IndependentWalkRouteOptions, IndependentRideRouteOptions, SelectIndependentRouteOptions, StartNaviWithIndependentPathOptions, ClearIndependentRouteOptions, MotorcycleRouteOptions, IndependentMotorcycleRouteOptions, BuildAnchorWaypointsOptions, FollowWebPlannedRouteOptions, FollowWebPlannedRouteResult, FollowWebPlannedRouteCandidate, WebPlannedRoute, NaviInfoUpdateEvent, NaviLaneInfoEvent, NaviTrafficStatusesEvent, NaviVisualStateEvent, ExpoGaodeMapNaviViewProps } from './types';
6
+ export declare function buildAnchorWaypointsFromWebRoute(options: BuildAnchorWaypointsOptions): NaviPoint[];
7
+ export declare function followWebPlannedRoute(options: FollowWebPlannedRouteOptions): Promise<FollowWebPlannedRouteResult>;
8
+ export { ExpoGaodeMapNaviView, type ExpoGaodeMapNaviViewRef };
9
+ /**
10
+ * @deprecated 请使用 `ExpoGaodeMapNaviView`
11
+ */
12
+ export declare const NaviView: import("react").ForwardRefExoticComponent<ExpoGaodeMapNaviViewProps & import("react").RefAttributes<ExpoGaodeMapNaviViewRef>>;
13
+ /**
14
+ * @deprecated 请使用 `ExpoGaodeMapNaviViewRef`
15
+ */
16
+ export type NaviViewRef = ExpoGaodeMapNaviViewRef;
6
17
  /**
7
18
  * 初始化导航模块(可选)
8
19
  */
@@ -19,7 +30,7 @@ export declare function calculateRoute(options: RouteOptions): Promise<RouteResu
19
30
  /**
20
31
  * 驾车路径规划
21
32
  */
22
- export declare const calculateDriveRoute: (options: DriveRouteOptions) => Promise<DriveRouteResult>;
33
+ export declare function calculateDriveRoute(options: DriveRouteOptions): Promise<DriveRouteResult>;
23
34
  /**
24
35
  * 步行路径规划
25
36
  */
@@ -45,22 +56,54 @@ export declare const calculateMotorcycleRoute: (options: MotorcycleRouteOptions)
45
56
  */
46
57
  export declare function calculateTransitRoute(options: TransitRouteOptions): Promise<DriveRouteResult>;
47
58
  /**
48
- * 独立路径规划(不会影响当前导航;适合路线预览/行前选路)
49
- */
59
+ * 独立驾车路径规划
60
+ *
61
+ * - 只负责生成独立路径组,不会自动开始导航
62
+ * - 适合路线预览、行前选路、自定义路线选择页
63
+ * - 后续可配合 selectIndependentRoute / startNaviWithIndependentPath 使用
64
+ */
50
65
  export declare const independentDriveRoute: (options: IndependentDriveRouteOptions) => Promise<IndependentRouteResult>;
66
+ /**
67
+ * 独立货车路径规划
68
+ *
69
+ * - 只负责生成独立路径组,不会自动开始导航
70
+ * - 适合路线预览、行前选路
71
+ */
51
72
  export declare const independentTruckRoute: (options: IndependentTruckRouteOptions) => Promise<IndependentRouteResult>;
73
+ /**
74
+ * 独立步行路径规划
75
+ *
76
+ * - 只负责生成独立路径组,不会自动开始导航
77
+ * - 适合路线预览、行前选路
78
+ */
52
79
  export declare const independentWalkRoute: (options: IndependentWalkRouteOptions) => Promise<IndependentRouteResult>;
80
+ /**
81
+ * 独立骑行路径规划
82
+ *
83
+ * - 只负责生成独立路径组,不会自动开始导航
84
+ * - 适合路线预览、行前选路
85
+ */
53
86
  export declare const independentRideRoute: (options: IndependentRideRouteOptions) => Promise<IndependentRouteResult>;
54
87
  /**
55
- * 独立摩托车路径规划(不干扰当前导航)
88
+ * 独立摩托车路径规划
89
+ *
90
+ * - 只负责生成独立路径组,不会自动开始导航
91
+ * - 适合路线预览、行前选路
56
92
  */
57
93
  export declare const independentMotorcycleRoute: (options: IndependentMotorcycleRouteOptions) => Promise<IndependentRouteResult>;
58
94
  /**
59
95
  * 独立路径组:选主路线
96
+ *
97
+ * - 仅切换 token 对应路径组里的当前主路线
98
+ * - 本身不会开始导航
60
99
  */
61
100
  export declare const selectIndependentRoute: (options: SelectIndependentRouteOptions) => Promise<boolean>;
62
101
  /**
63
102
  * 独立路径组:使用指定路线启动导航
103
+ *
104
+ * - 这是模块级启动入口,不依赖 ExpoGaodeMapNaviView ref
105
+ * - 适合工具函数、流程封装、非嵌入式页面场景
106
+ * - 若你已经持有嵌入式导航视图 ref,更适合调用 ref.startNavigationWithIndependentPath(...)
64
107
  */
65
108
  export declare const startNaviWithIndependentPath: (options: StartNaviWithIndependentPathOptions) => Promise<boolean>;
66
109
  /**
@@ -69,21 +112,26 @@ export declare const startNaviWithIndependentPath: (options: StartNaviWithIndepe
69
112
  export declare const openOfficialNaviPage: (options: OfficialNaviPageOptions) => Promise<boolean>;
70
113
  /**
71
114
  * 独立路径组:清理
115
+ *
116
+ * - 释放 independentXXXRoute 生成的 token 对应缓存
117
+ * - 当页面只保留路线预览、不再需要后续选路/导航时,建议主动清理
72
118
  */
73
119
  export declare const clearIndependentRoute: (options: ClearIndependentRouteOptions) => Promise<boolean>;
74
- export type { NaviPoint, RouteOptions, DriveRouteOptions, WalkRouteOptions, RideRouteOptions, EBikeRouteOptions, TransitRouteOptionsType as TransitRouteOptions, TruckRouteOptions, RouteResult, DriveRouteResult, IndependentRouteResult, IndependentDriveRouteOptions, IndependentTruckRouteOptions, IndependentWalkRouteOptions, IndependentRideRouteOptions, SelectIndependentRouteOptions, StartNaviWithIndependentPathOptions, OfficialNaviPageOptions, ClearIndependentRouteOptions, MotorcycleRouteOptions, IndependentMotorcycleRouteOptions, };
120
+ export type { NaviPoint, RouteOptions, DriveRouteOptions, WalkRouteOptions, RideRouteOptions, EBikeRouteOptions, TransitRouteOptionsType as TransitRouteOptions, TruckRouteOptions, RouteResult, DriveRouteResult, IndependentRouteResult, IndependentDriveRouteOptions, IndependentTruckRouteOptions, IndependentWalkRouteOptions, IndependentRideRouteOptions, SelectIndependentRouteOptions, StartNaviWithIndependentPathOptions, OfficialNaviPageOptions, ClearIndependentRouteOptions, MotorcycleRouteOptions, IndependentMotorcycleRouteOptions, BuildAnchorWaypointsOptions, FollowWebPlannedRouteOptions, FollowWebPlannedRouteResult, FollowWebPlannedRouteCandidate, WebPlannedRoute, NaviInfoUpdateEvent, NaviLaneInfoEvent, NaviTrafficStatusesEvent, NaviVisualStateEvent, ExpoGaodeMapNaviViewProps, };
75
121
  export { RouteType, DriveStrategy, WalkStrategy, RideStrategy, TruckSize, TravelStrategy, };
76
122
  declare const _default: {
77
123
  initNavigation: () => void;
78
124
  destroyAllCalculators: () => void;
79
125
  calculateRoute: typeof calculateRoute;
80
- calculateDriveRoute: (options: DriveRouteOptions) => Promise<DriveRouteResult>;
126
+ calculateDriveRoute: typeof calculateDriveRoute;
81
127
  calculateWalkRoute: (options: WalkRouteOptions) => Promise<RouteResult>;
82
128
  calculateRideRoute: (options: RideRouteOptions) => Promise<RouteResult>;
83
129
  calculateEBikeRoute: (options: EBikeRouteOptions) => Promise<RouteResult>;
84
130
  calculateTransitRoute: typeof calculateTransitRoute;
85
131
  calculateTruckRoute: (options: TruckRouteOptions) => Promise<DriveRouteResult>;
86
132
  calculateMotorcycleRoute: (options: MotorcycleRouteOptions) => Promise<DriveRouteResult>;
133
+ buildAnchorWaypointsFromWebRoute: typeof buildAnchorWaypointsFromWebRoute;
134
+ followWebPlannedRoute: typeof followWebPlannedRoute;
87
135
  independentDriveRoute: (options: IndependentDriveRouteOptions) => Promise<IndependentRouteResult>;
88
136
  independentTruckRoute: (options: IndependentTruckRouteOptions) => Promise<IndependentRouteResult>;
89
137
  independentWalkRoute: (options: IndependentWalkRouteOptions) => Promise<IndependentRouteResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,4BAA4B,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EACL,oBAAoB,EACpB,KAAK,uBAAuB,EAC7B,MAAM,wBAAwB,CAAC;AAGhC,cAAc,OAAO,CAAC;AACtB,OAAO,EACL,SAAS,EACT,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,cAAc,EACd,KAAK,mBAAmB,EACzB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,IAAI,uBAAuB,EAC9C,iBAAiB,EACjB,uBAAuB,EACvB,WAAW,EACX,gBAAgB,EAChB,sBAAsB,EACtB,4BAA4B,EAC5B,4BAA4B,EAC5B,2BAA2B,EAC3B,2BAA2B,EAC3B,6BAA6B,EAC7B,mCAAmC,EACnC,4BAA4B,EAC5B,sBAAsB,EACtB,iCAAiC,EACjC,2BAA2B,EAC3B,4BAA4B,EAC5B,2BAA2B,EAC3B,8BAA8B,EAC9B,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,EACpB,yBAAyB,EACxB,MAAM,SAAS,CAAC;AAsJnB,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,2BAA2B,GACnC,SAAS,EAAE,CAqCb;AA8PD,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAwHtC;AAwED,OAAO,EAAE,oBAAoB,EAAE,KAAK,uBAAuB,EAAE,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,QAAQ,+HAAuB,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,uBAAuB,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,cAAc,YAAsD,CAAC;AAElF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,YAA6D,CAAC;AAEhG;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,WAAW,GAAG,gBAAgB,CAAC,CA6BzC;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAW3B;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,gBAAgB,yBACF,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,gBAAgB,yBACF,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,iBAAiB,yBACH,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,iBAAiB,8BACH,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,wBAAwB,GAAI,SAAS,sBAAsB,8BACR,CAAC;AAEjE;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiBnG;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAAI,SAAS,4BAA4B,oCACd,CAAC;AAC9D;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAI,SAAS,4BAA4B,oCACd,CAAC;AAC9D;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAAI,SAAS,2BAA2B,oCACb,CAAC;AAE7D;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAAI,SAAS,2BAA2B,oCACb,CAAC;AAE7D;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,GAAI,SAAS,iCAAiC,oCACnB,CAAC;AAEnE;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GAAI,SAAS,6BAA6B,qBACf,CAAC;AAE/D;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,GAAI,SAAS,mCAAmC,qBACrB,CAAC;AAErE;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAI,SAAS,uBAAuB,qBACT,CAAC;AAE7D;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAI,SAAS,4BAA4B,qBACd,CAAC;AAG9D,YAAY,EACV,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,IAAI,mBAAmB,EAC9C,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,sBAAsB,EACtB,4BAA4B,EAC5B,4BAA4B,EAC5B,2BAA2B,EAC3B,2BAA2B,EAC3B,6BAA6B,EAC7B,mCAAmC,EACnC,uBAAuB,EACvB,4BAA4B,EAC5B,sBAAsB,EACtB,iCAAiC,EACjC,2BAA2B,EAC3B,4BAA4B,EAC5B,2BAA2B,EAC3B,8BAA8B,EAC9B,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,EACpB,yBAAyB,GAC1B,CAAC;AAEF,OAAO,EACL,SAAS,EACT,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,cAAc,GACf,CAAC;;;;;;kCAzK0C,gBAAgB;kCAMhB,gBAAgB;mCAMf,iBAAiB;;mCAMjB,iBAAiB;wCAMZ,sBAAsB;;;qCAgCzB,4BAA4B;qCAQ5B,4BAA4B;oCAQ7B,2BAA2B;oCAS3B,2BAA2B;0CASrB,iCAAiC;sCASrC,6BAA6B;4CAUvB,mCAAmC;oCAM3C,uBAAuB;qCAStB,4BAA4B;;AAgD3E,wBA6BE;AAEF,OAAO,EACL,4BAA4B,GAC7B,CAAA"}
package/build/index.js CHANGED
@@ -1,4 +1,6 @@
1
1
  import ExpoGaodeMapNavigationModule from './ExpoGaodeMapNavigationModule';
2
+ import { ExpoGaodeMapModule } from './map';
3
+ import { ExpoGaodeMapNaviView, } from './ExpoGaodeMapNaviView';
2
4
  // 重新导出地图模块的所有内容
3
5
  export * from './map';
4
6
  import { RouteType, DriveStrategy, WalkStrategy, RideStrategy, TruckSize, TravelStrategy, } from './types';
@@ -22,7 +24,136 @@ function parsePolyline(polyline) {
22
24
  })
23
25
  .filter((point) => point !== null);
24
26
  }
25
- async function loadWebApiTransitFallback() {
27
+ function dedupeAdjacentPoints(points) {
28
+ return points.filter((point, index) => {
29
+ if (index === 0) {
30
+ return true;
31
+ }
32
+ const previous = points[index - 1];
33
+ return (previous.latitude !== point.latitude ||
34
+ previous.longitude !== point.longitude);
35
+ });
36
+ }
37
+ function haversineDistance(pointA, pointB) {
38
+ const toRadians = (degrees) => (degrees * Math.PI) / 180;
39
+ const earthRadiusMeters = 6371000;
40
+ const latitudeDelta = toRadians(pointB.latitude - pointA.latitude);
41
+ const longitudeDelta = toRadians(pointB.longitude - pointA.longitude);
42
+ const latitudeA = toRadians(pointA.latitude);
43
+ const latitudeB = toRadians(pointB.latitude);
44
+ const a = Math.sin(latitudeDelta / 2) ** 2 +
45
+ Math.cos(latitudeA) * Math.cos(latitudeB) * Math.sin(longitudeDelta / 2) ** 2;
46
+ return 2 * earthRadiusMeters * Math.asin(Math.sqrt(a));
47
+ }
48
+ function distanceBetweenCoordinatesSafe(pointA, pointB) {
49
+ try {
50
+ return ExpoGaodeMapModule.distanceBetweenCoordinates(pointA, pointB);
51
+ }
52
+ catch {
53
+ return haversineDistance(pointA, pointB);
54
+ }
55
+ }
56
+ function calculatePathLengthSafe(points) {
57
+ try {
58
+ return ExpoGaodeMapModule.calculatePathLength(points);
59
+ }
60
+ catch {
61
+ let total = 0;
62
+ for (let index = 1; index < points.length; index += 1) {
63
+ total += distanceBetweenCoordinatesSafe(points[index - 1], points[index]);
64
+ }
65
+ return total;
66
+ }
67
+ }
68
+ function simplifyPolylineSafe(points, tolerance) {
69
+ if (points.length <= 2) {
70
+ return points;
71
+ }
72
+ try {
73
+ const simplified = ExpoGaodeMapModule.simplifyPolyline(points, tolerance);
74
+ return simplified.length >= 2 ? simplified : points;
75
+ }
76
+ catch {
77
+ return points;
78
+ }
79
+ }
80
+ function getDistanceToPathSafe(path, target) {
81
+ if (path.length === 0) {
82
+ return Number.POSITIVE_INFINITY;
83
+ }
84
+ try {
85
+ const nearest = ExpoGaodeMapModule.getNearestPointOnPath(path, target);
86
+ if (nearest) {
87
+ return nearest.distanceMeters;
88
+ }
89
+ }
90
+ catch {
91
+ // ignore and fallback to point-to-point scan
92
+ }
93
+ return path.reduce((minimum, point) => {
94
+ const distance = distanceBetweenCoordinatesSafe(point, target);
95
+ return distance < minimum ? distance : minimum;
96
+ }, Number.POSITIVE_INFINITY);
97
+ }
98
+ function samplePolyline(points, targetSamples = 36) {
99
+ if (points.length <= targetSamples) {
100
+ return points;
101
+ }
102
+ const step = Math.max(1, Math.floor(points.length / targetSamples));
103
+ const samples = points.filter((_, index) => index % step === 0);
104
+ const lastPoint = points[points.length - 1];
105
+ const lastSample = samples[samples.length - 1];
106
+ if (!lastSample ||
107
+ lastSample.latitude !== lastPoint.latitude ||
108
+ lastSample.longitude !== lastPoint.longitude) {
109
+ samples.push(lastPoint);
110
+ }
111
+ return samples;
112
+ }
113
+ function selectEvenlySpacedPoints(points, count) {
114
+ if (count <= 0 || points.length <= count) {
115
+ return points;
116
+ }
117
+ return Array.from({ length: count }, (_, index) => {
118
+ const rawIndex = Math.round(((index + 1) * (points.length + 1)) / (count + 1)) - 1;
119
+ const boundedIndex = Math.min(points.length - 1, Math.max(0, rawIndex));
120
+ return points[boundedIndex];
121
+ });
122
+ }
123
+ function normalizeWebRoutePolyline(webRoute) {
124
+ const directPolyline = dedupeAdjacentPoints(webRoute.polyline ?? []);
125
+ if (directPolyline.length > 1) {
126
+ return directPolyline;
127
+ }
128
+ const stepPolyline = dedupeAdjacentPoints((webRoute.steps ?? []).flatMap((step) => step.polyline ?? []));
129
+ return stepPolyline;
130
+ }
131
+ export function buildAnchorWaypointsFromWebRoute(options) {
132
+ const { webRoute, maxViaPoints = 8, simplifyTolerance = 80, minSpacingMeters = 800, } = options;
133
+ const polyline = normalizeWebRoutePolyline(webRoute);
134
+ if (polyline.length <= 2) {
135
+ return [];
136
+ }
137
+ const simplified = dedupeAdjacentPoints(simplifyPolylineSafe(polyline, simplifyTolerance));
138
+ const candidatePoints = simplified.length > 2 ? simplified : polyline;
139
+ const interiorPoints = candidatePoints.slice(1, -1);
140
+ const spacedPoints = [];
141
+ let previousPoint = polyline[0];
142
+ for (const point of interiorPoints) {
143
+ if (distanceBetweenCoordinatesSafe(previousPoint, point) < minSpacingMeters) {
144
+ continue;
145
+ }
146
+ spacedPoints.push(point);
147
+ previousPoint = point;
148
+ }
149
+ const waypoints = spacedPoints.length > 0
150
+ ? spacedPoints
151
+ : candidatePoints.length > 2
152
+ ? [candidatePoints[Math.floor(candidatePoints.length / 2)]]
153
+ : [];
154
+ return dedupeAdjacentPoints(selectEvenlySpacedPoints(waypoints, maxViaPoints));
155
+ }
156
+ async function loadWebApiFallback(feature) {
26
157
  try {
27
158
  // eslint-disable-next-line @typescript-eslint/no-var-requires
28
159
  const webApi = require('expo-gaode-map-web-api');
@@ -32,9 +163,270 @@ async function loadWebApiTransitFallback() {
32
163
  return webApi;
33
164
  }
34
165
  catch {
35
- throw new Error('公交路径规划依赖 expo-gaode-map-web-api。请安装该包,并在 ExpoGaodeMapModule.initSDK 中提供 webKey。');
166
+ throw new Error(`${feature}依赖 expo-gaode-map-web-api。请安装该包,并在 ExpoGaodeMapModule.initSDK 中提供 webKey。`);
167
+ }
168
+ }
169
+ function normalizeAvoidPolygons(polygons) {
170
+ if (!polygons?.length) {
171
+ return undefined;
172
+ }
173
+ const normalized = polygons
174
+ .map((polygon) => polygon
175
+ .map((point) => `${point.longitude},${point.latitude}`)
176
+ .join(';'))
177
+ .filter(Boolean)
178
+ .join('|');
179
+ return normalized || undefined;
180
+ }
181
+ function normalizeDrivingStrategy(strategy) {
182
+ // 导航 SDK 与 Web API 的策略枚举不完全一致。
183
+ // 这里做“尽量等价”的映射,主要用于带规避参数时的路线预览。
184
+ switch (strategy) {
185
+ case DriveStrategy.FASTEST:
186
+ return 38;
187
+ case DriveStrategy.FEE_FIRST:
188
+ return 1;
189
+ case DriveStrategy.SHORTEST:
190
+ return 2;
191
+ case DriveStrategy.NO_EXPRESSWAYS:
192
+ return 37;
193
+ case DriveStrategy.AVOID_CONGESTION:
194
+ return 33;
195
+ case DriveStrategy.NO_HIGHWAY:
196
+ return 35;
197
+ case DriveStrategy.NO_HIGHWAY_AVOID_CONGESTION:
198
+ return 40;
199
+ case DriveStrategy.AVOID_COST_CONGESTION:
200
+ case DriveStrategy.AVOID_CONGESTION_COST:
201
+ return 41;
202
+ case DriveStrategy.NO_HIGHWAY_AVOID_COST_CONGESTION:
203
+ return 43;
204
+ default:
205
+ return undefined;
36
206
  }
37
207
  }
208
+ function normalizeDrivingRouteResult(options, result) {
209
+ const paths = result?.route?.paths ?? [];
210
+ const routes = paths.map((path, index) => {
211
+ const segments = (path?.steps ?? []).map((step) => ({
212
+ instruction: step?.instruction ?? '',
213
+ orientation: step?.orientation,
214
+ road: step?.road_name,
215
+ distance: Number(step?.step_distance ?? 0),
216
+ duration: Number(step?.cost?.duration ?? 0),
217
+ polyline: parsePolyline(step?.polyline),
218
+ assistantAction: step?.assistant_action,
219
+ tollDistance: step?.cost?.toll_distance ? Number(step.cost.toll_distance) : undefined,
220
+ tollCost: step?.cost?.tolls ? Number(step.cost.tolls) : undefined,
221
+ }));
222
+ const restrictionCode = path?.restriction != null ? Number(path.restriction) : undefined;
223
+ return {
224
+ id: index,
225
+ start: options.from,
226
+ end: options.to,
227
+ distance: Number(path?.distance ?? 0),
228
+ duration: Number(path?.cost?.duration ?? path?.duration ?? 0),
229
+ segments,
230
+ polyline: segments.flatMap((segment) => segment.polyline),
231
+ tollDistance: path?.cost?.toll_distance ? Number(path.cost.toll_distance) : undefined,
232
+ tollCost: path?.cost?.tolls ? Number(path.cost.tolls) : undefined,
233
+ trafficLightCount: path?.cost?.traffic_lights ? Number(path.cost.traffic_lights) : undefined,
234
+ restrictionCode,
235
+ restrictionInfo: restrictionCode === 0
236
+ ? '限行已规避或未限行'
237
+ : restrictionCode === 1
238
+ ? '限行无法规避'
239
+ : undefined,
240
+ strategy: options.strategy,
241
+ };
242
+ });
243
+ return {
244
+ count: Number(result?.count ?? routes.length),
245
+ mainPathIndex: 0,
246
+ routeIds: routes.map((route) => route.id),
247
+ routes,
248
+ taxiCost: result?.route?.taxi_cost ? Number(result.route.taxi_cost) : undefined,
249
+ };
250
+ }
251
+ function shouldUseAvoidPreviewFallback(options) {
252
+ return Boolean(options.avoidRoad?.trim() || options.avoidPolygons?.length);
253
+ }
254
+ function extractRoutePolyline(route) {
255
+ if (Array.isArray(route.polyline) && route.polyline.length > 0) {
256
+ return route.polyline;
257
+ }
258
+ const segments = Array.isArray(route.segments) ? route.segments : [];
259
+ if (segments.length > 0) {
260
+ return dedupeAdjacentPoints(segments.flatMap((segment) => segment.polyline ?? []));
261
+ }
262
+ const steps = Array.isArray(route.steps) ? route.steps : [];
263
+ if (steps.length > 0) {
264
+ return dedupeAdjacentPoints(steps.flatMap((step) => step.polyline ?? []));
265
+ }
266
+ return [];
267
+ }
268
+ function resolveIndependentRouteId(result, route, routeIndex) {
269
+ if (typeof route.id === 'number') {
270
+ return route.id;
271
+ }
272
+ if (typeof route.routeId === 'number') {
273
+ return route.routeId;
274
+ }
275
+ return result.routeIds?.[routeIndex];
276
+ }
277
+ function scoreIndependentRouteAgainstWebPolyline(result, route, routeIndex, webPolyline, anchorWaypoints, thresholdMeters) {
278
+ const nativePolyline = extractRoutePolyline(route);
279
+ if (nativePolyline.length === 0 || webPolyline.length === 0) {
280
+ return null;
281
+ }
282
+ const sampledNativePoints = samplePolyline(nativePolyline);
283
+ const pointDistances = sampledNativePoints.map((point) => getDistanceToPathSafe(webPolyline, point));
284
+ const averageDeviationMeters = pointDistances.reduce((total, distance) => total + distance, 0) / pointDistances.length;
285
+ const maxDeviationMeters = Math.max(...pointDistances);
286
+ const missedAnchorCount = anchorWaypoints.reduce((count, point) => (getDistanceToPathSafe(nativePolyline, point) > thresholdMeters ? count + 1 : count), 0);
287
+ return {
288
+ routeId: resolveIndependentRouteId(result, route, routeIndex),
289
+ routeIndex,
290
+ averageDeviationMeters,
291
+ maxDeviationMeters,
292
+ missedAnchorCount,
293
+ score: averageDeviationMeters +
294
+ maxDeviationMeters * 0.35 +
295
+ missedAnchorCount * thresholdMeters * 0.5,
296
+ };
297
+ }
298
+ function evaluateIndependentResultAgainstWebRoute(independentResult, webPolyline, anchorWaypoints, maxDeviationMeters) {
299
+ const candidateMatches = independentResult.routes
300
+ .map((route, routeIndex) => scoreIndependentRouteAgainstWebPolyline(independentResult, route, routeIndex, webPolyline, anchorWaypoints, maxDeviationMeters))
301
+ .filter((candidate) => candidate !== null)
302
+ .sort((routeA, routeB) => routeA.score - routeB.score);
303
+ const bestMatch = candidateMatches[0];
304
+ const selectedRoute = bestMatch
305
+ ? independentResult.routes[bestMatch.routeIndex]
306
+ : undefined;
307
+ const nativePolyline = selectedRoute ? extractRoutePolyline(selectedRoute) : [];
308
+ let mode = 'preview_only';
309
+ let reason = '未找到足够接近 Web 规划线的原生路线';
310
+ if (bestMatch) {
311
+ if (bestMatch.averageDeviationMeters <= maxDeviationMeters / 2 &&
312
+ bestMatch.maxDeviationMeters <= maxDeviationMeters &&
313
+ bestMatch.missedAnchorCount === 0) {
314
+ mode = 'matched';
315
+ reason = '原生路线与 Web 规划线高度接近,可直接按近似结果导航';
316
+ }
317
+ else if (bestMatch.averageDeviationMeters <= maxDeviationMeters &&
318
+ bestMatch.maxDeviationMeters <= maxDeviationMeters * 2) {
319
+ mode = 'approximate';
320
+ reason = '原生路线与 Web 规划线接近,但仍存在可见偏差';
321
+ }
322
+ }
323
+ return {
324
+ candidateMatches,
325
+ bestMatch,
326
+ selectedRoute,
327
+ nativePolyline,
328
+ mode,
329
+ reason,
330
+ };
331
+ }
332
+ export async function followWebPlannedRoute(options) {
333
+ const { from, to, webRoute, strategy, carNumber, restriction, maxDeviationMeters = 120, startNavigation = false, naviType = 0, } = options;
334
+ const webPolyline = normalizeWebRoutePolyline(webRoute);
335
+ if (webPolyline.length < 2) {
336
+ throw new Error('webRoute.polyline 至少需要 2 个点');
337
+ }
338
+ const anchorWaypoints = buildAnchorWaypointsFromWebRoute(options);
339
+ const anchoredIndependentResult = await independentDriveRoute({
340
+ from,
341
+ to,
342
+ strategy,
343
+ carNumber,
344
+ restriction,
345
+ waypoints: anchorWaypoints,
346
+ });
347
+ let independentResult = anchoredIndependentResult;
348
+ let evaluation = evaluateIndependentResultAgainstWebRoute(anchoredIndependentResult, webPolyline, anchorWaypoints, maxDeviationMeters);
349
+ let navigationUsesAnchorWaypoints = anchorWaypoints.length > 0;
350
+ if (evaluation.bestMatch && evaluation.mode !== 'preview_only' && anchorWaypoints.length > 0) {
351
+ try {
352
+ const directIndependentResult = await independentDriveRoute({
353
+ from,
354
+ to,
355
+ strategy,
356
+ carNumber,
357
+ restriction,
358
+ });
359
+ const directEvaluation = evaluateIndependentResultAgainstWebRoute(directIndependentResult, webPolyline, [], maxDeviationMeters);
360
+ const anchoredBest = evaluation.bestMatch;
361
+ const directBest = directEvaluation.bestMatch;
362
+ const canSwitchToDirectNavigation = Boolean(directBest) &&
363
+ directEvaluation.mode !== 'preview_only' &&
364
+ directBest.averageDeviationMeters <= Math.max(anchoredBest.averageDeviationMeters + 45, anchoredBest.averageDeviationMeters * 1.45) &&
365
+ directBest.maxDeviationMeters <= Math.max(anchoredBest.maxDeviationMeters + 90, anchoredBest.maxDeviationMeters * 1.45);
366
+ if (canSwitchToDirectNavigation) {
367
+ ExpoGaodeMapNavigationModule.clearIndependentRoute({
368
+ token: anchoredIndependentResult.token,
369
+ }).catch(() => { });
370
+ independentResult = directIndependentResult;
371
+ evaluation = directEvaluation;
372
+ navigationUsesAnchorWaypoints = false;
373
+ evaluation.reason =
374
+ directEvaluation.mode === 'matched'
375
+ ? '已切换为无途经点导航结果,且与 Web 规划线高度接近'
376
+ : '已切换为无途经点导航结果,但与 Web 规划线仍存在轻微偏差';
377
+ }
378
+ else {
379
+ ExpoGaodeMapNavigationModule.clearIndependentRoute({
380
+ token: directIndependentResult.token,
381
+ }).catch(() => { });
382
+ evaluation.reason = `${evaluation.reason};最终导航仍需依赖锚点途经点逼近 Web 线路`;
383
+ }
384
+ }
385
+ catch {
386
+ evaluation.reason = `${evaluation.reason};无途经点重算失败,最终导航仍需依赖锚点途经点`;
387
+ }
388
+ }
389
+ let navigationStarted = false;
390
+ if (startNavigation && evaluation.bestMatch && evaluation.mode !== 'preview_only') {
391
+ navigationStarted = await startNaviWithIndependentPath({
392
+ token: independentResult.token,
393
+ naviType,
394
+ routeId: evaluation.bestMatch.routeId,
395
+ routeIndex: evaluation.bestMatch.routeId == null ? evaluation.bestMatch.routeIndex : undefined,
396
+ });
397
+ }
398
+ return {
399
+ mode: evaluation.mode,
400
+ token: independentResult.token,
401
+ anchorWaypoints,
402
+ webDistance: calculatePathLengthSafe(webPolyline),
403
+ nativeDistance: evaluation.nativePolyline.length > 1
404
+ ? calculatePathLengthSafe(evaluation.nativePolyline)
405
+ : undefined,
406
+ selectedRouteId: evaluation.bestMatch?.routeId,
407
+ selectedRouteIndex: evaluation.bestMatch?.routeIndex,
408
+ averageDeviationMeters: evaluation.bestMatch?.averageDeviationMeters,
409
+ maxDeviationMeters: evaluation.bestMatch?.maxDeviationMeters,
410
+ navigationStarted,
411
+ navigationUsesAnchorWaypoints,
412
+ independentResult,
413
+ candidateMatches: evaluation.candidateMatches,
414
+ reason: evaluation.reason,
415
+ };
416
+ }
417
+ async function calculateDriveRouteWithAvoidPreview(options) {
418
+ const { GaodeWebAPI } = await loadWebApiFallback('规避路线预览');
419
+ const api = new GaodeWebAPI();
420
+ const result = await api.route.driving(`${options.from.longitude},${options.from.latitude}`, `${options.to.longitude},${options.to.latitude}`, {
421
+ strategy: normalizeDrivingStrategy(options.strategy),
422
+ waypoints: options.waypoints?.map((point) => `${point.longitude},${point.latitude}`),
423
+ avoidpolygons: normalizeAvoidPolygons(options.avoidPolygons),
424
+ avoidroad: options.avoidRoad?.trim() || undefined,
425
+ plate: options.carNumber,
426
+ show_fields: 'cost,navi,polyline',
427
+ });
428
+ return normalizeDrivingRouteResult(options, result);
429
+ }
38
430
  function normalizeTransitRouteResult(options, result) {
39
431
  // 导航包内部仍保持独立实现;
40
432
  // 这里只是在“公交无法由导航 SDK 直算”时,把 Web API 结果映射成现有 RouteResult 形状。
@@ -70,9 +462,11 @@ function isMotorcycleRouteOptions(options) {
70
462
  return 'motorcycleCC' in options;
71
463
  }
72
464
  // 导出官方导航界面组件
73
- export { ExpoGaodeMapNaviView,
74
- // 兼容旧版本名称
75
- ExpoGaodeMapNaviView as NaviView } from './ExpoGaodeMapNaviView';
465
+ export { ExpoGaodeMapNaviView };
466
+ /**
467
+ * @deprecated 请使用 `ExpoGaodeMapNaviView`
468
+ */
469
+ export const NaviView = ExpoGaodeMapNaviView;
76
470
  /**
77
471
  * 初始化导航模块(可选)
78
472
  */
@@ -114,7 +508,18 @@ export async function calculateRoute(options) {
114
508
  /**
115
509
  * 驾车路径规划
116
510
  */
117
- export const calculateDriveRoute = (options) => ExpoGaodeMapNavigationModule.calculateDriveRoute(options);
511
+ export async function calculateDriveRoute(options) {
512
+ if (shouldUseAvoidPreviewFallback(options)) {
513
+ try {
514
+ return await calculateDriveRouteWithAvoidPreview(options);
515
+ }
516
+ catch {
517
+ // 若未安装 Web API 包,则保持现有原生逻辑不变。
518
+ // 这样不会破坏当前依赖 Android 反射重载的项目。
519
+ }
520
+ }
521
+ return ExpoGaodeMapNavigationModule.calculateDriveRoute(options);
522
+ }
118
523
  /**
119
524
  * 步行路径规划
120
525
  */
@@ -140,7 +545,7 @@ export const calculateMotorcycleRoute = (options) => ExpoGaodeMapNavigationModul
140
545
  */
141
546
  export async function calculateTransitRoute(options) {
142
547
  // 运行时按需加载,避免把 navigation 包和 web-api 包在构建期强绑定。
143
- const { GaodeWebAPI, TransitStrategy } = await loadWebApiTransitFallback();
548
+ const { GaodeWebAPI, TransitStrategy } = await loadWebApiFallback('公交路径规划');
144
549
  const api = new GaodeWebAPI();
145
550
  const result = await api.route.transit(`${options.from.longitude},${options.from.latitude}`, `${options.to.longitude},${options.to.latitude}`, options.city1, options.city2, {
146
551
  strategy: options.strategy ?? TransitStrategy.RECOMMENDED,
@@ -150,22 +555,54 @@ export async function calculateTransitRoute(options) {
150
555
  return normalizeTransitRouteResult(options, result);
151
556
  }
152
557
  /**
153
- * 独立路径规划(不会影响当前导航;适合路线预览/行前选路)
154
- */
558
+ * 独立驾车路径规划
559
+ *
560
+ * - 只负责生成独立路径组,不会自动开始导航
561
+ * - 适合路线预览、行前选路、自定义路线选择页
562
+ * - 后续可配合 selectIndependentRoute / startNaviWithIndependentPath 使用
563
+ */
155
564
  export const independentDriveRoute = (options) => ExpoGaodeMapNavigationModule.independentDriveRoute(options);
565
+ /**
566
+ * 独立货车路径规划
567
+ *
568
+ * - 只负责生成独立路径组,不会自动开始导航
569
+ * - 适合路线预览、行前选路
570
+ */
156
571
  export const independentTruckRoute = (options) => ExpoGaodeMapNavigationModule.independentTruckRoute(options);
572
+ /**
573
+ * 独立步行路径规划
574
+ *
575
+ * - 只负责生成独立路径组,不会自动开始导航
576
+ * - 适合路线预览、行前选路
577
+ */
157
578
  export const independentWalkRoute = (options) => ExpoGaodeMapNavigationModule.independentWalkRoute(options);
579
+ /**
580
+ * 独立骑行路径规划
581
+ *
582
+ * - 只负责生成独立路径组,不会自动开始导航
583
+ * - 适合路线预览、行前选路
584
+ */
158
585
  export const independentRideRoute = (options) => ExpoGaodeMapNavigationModule.independentRideRoute(options);
159
586
  /**
160
- * 独立摩托车路径规划(不干扰当前导航)
587
+ * 独立摩托车路径规划
588
+ *
589
+ * - 只负责生成独立路径组,不会自动开始导航
590
+ * - 适合路线预览、行前选路
161
591
  */
162
592
  export const independentMotorcycleRoute = (options) => ExpoGaodeMapNavigationModule.independentMotorcycleRoute(options);
163
593
  /**
164
594
  * 独立路径组:选主路线
595
+ *
596
+ * - 仅切换 token 对应路径组里的当前主路线
597
+ * - 本身不会开始导航
165
598
  */
166
599
  export const selectIndependentRoute = (options) => ExpoGaodeMapNavigationModule.selectIndependentRoute(options);
167
600
  /**
168
601
  * 独立路径组:使用指定路线启动导航
602
+ *
603
+ * - 这是模块级启动入口,不依赖 ExpoGaodeMapNaviView ref
604
+ * - 适合工具函数、流程封装、非嵌入式页面场景
605
+ * - 若你已经持有嵌入式导航视图 ref,更适合调用 ref.startNavigationWithIndependentPath(...)
169
606
  */
170
607
  export const startNaviWithIndependentPath = (options) => ExpoGaodeMapNavigationModule.startNaviWithIndependentPath(options);
171
608
  /**
@@ -174,6 +611,9 @@ export const startNaviWithIndependentPath = (options) => ExpoGaodeMapNavigationM
174
611
  export const openOfficialNaviPage = (options) => ExpoGaodeMapNavigationModule.openOfficialNaviPage(options);
175
612
  /**
176
613
  * 独立路径组:清理
614
+ *
615
+ * - 释放 independentXXXRoute 生成的 token 对应缓存
616
+ * - 当页面只保留路线预览、不再需要后续选路/导航时,建议主动清理
177
617
  */
178
618
  export const clearIndependentRoute = (options) => ExpoGaodeMapNavigationModule.clearIndependentRoute(options);
179
619
  export { RouteType, DriveStrategy, WalkStrategy, RideStrategy, TruckSize, TravelStrategy, };
@@ -191,6 +631,8 @@ export default {
191
631
  calculateTransitRoute,
192
632
  calculateTruckRoute,
193
633
  calculateMotorcycleRoute,
634
+ buildAnchorWaypointsFromWebRoute,
635
+ followWebPlannedRoute,
194
636
  // 独立路径规划
195
637
  independentDriveRoute,
196
638
  independentTruckRoute,