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.
- package/README.md +296 -7
- package/android/build.gradle +12 -4
- package/android/src/main/AndroidManifest.xml +10 -1
- package/android/src/main/cpp/cluster_jni.cpp +56 -0
- package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapModule.kt +49 -8
- package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapOfflineModule.kt +83 -15
- package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapView.kt +13 -3
- package/android/src/main/java/expo/modules/gaodemap/map/managers/UIManager.kt +36 -39
- package/android/src/main/java/expo/modules/gaodemap/map/modules/SDKInitializer.kt +23 -17
- package/android/src/main/java/expo/modules/gaodemap/map/overlays/ClusterView.kt +5 -2
- package/android/src/main/java/expo/modules/gaodemap/map/overlays/HeatMapView.kt +122 -10
- package/android/src/main/java/expo/modules/gaodemap/map/overlays/HeatMapViewModule.kt +2 -2
- package/android/src/main/java/expo/modules/gaodemap/map/overlays/MarkerView.kt +37 -25
- package/android/src/main/java/expo/modules/gaodemap/map/overlays/MarkerViewModule.kt +6 -6
- package/android/src/main/java/expo/modules/gaodemap/map/search/ExpoGaodeMapSearchModule.kt +751 -0
- package/android/src/main/java/expo/modules/gaodemap/map/utils/GeometryUtils.kt +103 -0
- package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNaviView.kt +1408 -394
- package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNaviViewModule.kt +121 -1
- package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNavigationModule.kt +14 -28
- package/android/src/main/java/expo/modules/gaodemap/navigation/listeners/IndependentRouteListener.kt +28 -3
- package/android/src/main/java/expo/modules/gaodemap/navigation/listeners/RouteCalculateListener.kt +2 -2
- package/android/src/main/java/expo/modules/gaodemap/navigation/managers/IndependentRouteManager.kt +114 -15
- package/android/src/main/java/expo/modules/gaodemap/navigation/routes/drive/DriveTruckRouteCalculator.kt +24 -35
- package/android/src/main/java/expo/modules/gaodemap/navigation/services/IndependentRouteService.kt +50 -36
- package/android/src/main/java/expo/modules/gaodemap/navigation/services/NavigationForegroundService.kt +661 -0
- package/android/src/main/java/expo/modules/gaodemap/navigation/utils/Converters.kt +21 -12
- package/android/src/main/res/drawable/ic_nav_notification_small.xml +10 -0
- package/android/src/main/res/drawable/landback_0.png +0 -0
- package/android/src/main/res/drawable/landback_1.png +0 -0
- package/android/src/main/res/drawable/landback_2.png +0 -0
- package/android/src/main/res/drawable/landback_3.png +0 -0
- package/android/src/main/res/drawable/landback_4.png +0 -0
- package/android/src/main/res/drawable/landback_5.png +0 -0
- package/android/src/main/res/drawable/landback_6.png +0 -0
- package/android/src/main/res/drawable/landback_7.png +0 -0
- package/android/src/main/res/drawable/landback_8.png +0 -0
- package/android/src/main/res/drawable/landback_9.png +0 -0
- package/android/src/main/res/drawable/landback_a.png +0 -0
- package/android/src/main/res/drawable/landback_b.png +0 -0
- package/android/src/main/res/drawable/landback_c.png +0 -0
- package/android/src/main/res/drawable/landback_d.png +0 -0
- package/android/src/main/res/drawable/landback_e.png +0 -0
- package/android/src/main/res/drawable/landback_f.png +0 -0
- package/android/src/main/res/drawable/landback_g.png +0 -0
- package/android/src/main/res/drawable/landback_h.png +0 -0
- package/android/src/main/res/drawable/landback_i.png +0 -0
- package/android/src/main/res/drawable/landback_j.png +0 -0
- package/android/src/main/res/drawable/landback_k.png +0 -0
- package/android/src/main/res/drawable/landback_l.png +0 -0
- package/android/src/main/res/drawable/landfront_0.png +0 -0
- package/android/src/main/res/drawable/landfront_00.png +0 -0
- package/android/src/main/res/drawable/landfront_1.png +0 -0
- package/android/src/main/res/drawable/landfront_11.png +0 -0
- package/android/src/main/res/drawable/landfront_20.png +0 -0
- package/android/src/main/res/drawable/landfront_21.png +0 -0
- package/android/src/main/res/drawable/landfront_22.png +0 -0
- package/android/src/main/res/drawable/landfront_3.png +0 -0
- package/android/src/main/res/drawable/landfront_33.png +0 -0
- package/android/src/main/res/drawable/landfront_40.png +0 -0
- package/android/src/main/res/drawable/landfront_43.png +0 -0
- package/android/src/main/res/drawable/landfront_44.png +0 -0
- package/android/src/main/res/drawable/landfront_5.png +0 -0
- package/android/src/main/res/drawable/landfront_55.png +0 -0
- package/android/src/main/res/drawable/landfront_61.png +0 -0
- package/android/src/main/res/drawable/landfront_63.png +0 -0
- package/android/src/main/res/drawable/landfront_66.png +0 -0
- package/android/src/main/res/drawable/landfront_70.png +0 -0
- package/android/src/main/res/drawable/landfront_71.png +0 -0
- package/android/src/main/res/drawable/landfront_73.png +0 -0
- package/android/src/main/res/drawable/landfront_77.png +0 -0
- package/android/src/main/res/drawable/landfront_8.png +0 -0
- package/android/src/main/res/drawable/landfront_88.png +0 -0
- package/android/src/main/res/drawable/landfront_90.png +0 -0
- package/android/src/main/res/drawable/landfront_95.png +0 -0
- package/android/src/main/res/drawable/landfront_99.png +0 -0
- package/android/src/main/res/drawable/landfront_a0.png +0 -0
- package/android/src/main/res/drawable/landfront_a8.png +0 -0
- package/android/src/main/res/drawable/landfront_aa.png +0 -0
- package/android/src/main/res/drawable/landfront_b1.png +0 -0
- package/android/src/main/res/drawable/landfront_b5.png +0 -0
- package/android/src/main/res/drawable/landfront_bb.png +0 -0
- package/android/src/main/res/drawable/landfront_c3.png +0 -0
- package/android/src/main/res/drawable/landfront_c8.png +0 -0
- package/android/src/main/res/drawable/landfront_cc.png +0 -0
- package/android/src/main/res/drawable/landfront_d.png +0 -0
- package/android/src/main/res/drawable/landfront_dd.png +0 -0
- package/android/src/main/res/drawable/landfront_e1.png +0 -0
- package/android/src/main/res/drawable/landfront_e5.png +0 -0
- package/android/src/main/res/drawable/landfront_ee.png +0 -0
- package/android/src/main/res/drawable/landfront_f0.png +0 -0
- package/android/src/main/res/drawable/landfront_f1.png +0 -0
- package/android/src/main/res/drawable/landfront_f5.png +0 -0
- package/android/src/main/res/drawable/landfront_ff.png +0 -0
- package/android/src/main/res/drawable/landfront_g3.png +0 -0
- package/android/src/main/res/drawable/landfront_g5.png +0 -0
- package/android/src/main/res/drawable/landfront_gg.png +0 -0
- package/android/src/main/res/drawable/landfront_h1.png +0 -0
- package/android/src/main/res/drawable/landfront_h3.png +0 -0
- package/android/src/main/res/drawable/landfront_h5.png +0 -0
- package/android/src/main/res/drawable/landfront_hh.png +0 -0
- package/android/src/main/res/drawable/landfront_i0.png +0 -0
- package/android/src/main/res/drawable/landfront_i3.png +0 -0
- package/android/src/main/res/drawable/landfront_i5.png +0 -0
- package/android/src/main/res/drawable/landfront_ii.png +0 -0
- package/android/src/main/res/drawable/landfront_j1.png +0 -0
- package/android/src/main/res/drawable/landfront_j8.png +0 -0
- package/android/src/main/res/drawable/landfront_jj.png +0 -0
- package/android/src/main/res/drawable/landfront_kk.png +0 -0
- package/android/src/main/res/drawable/landfront_ll.png +0 -0
- package/android/src/main/res/drawable/nav_notification_brand_icon.xml +16 -0
- package/android/src/main/res/drawable/navi_arrow_leftline.png +0 -0
- package/android/src/main/res/drawable/navi_lane_shape_bg_center.xml +5 -0
- package/android/src/main/res/drawable/navi_lane_shape_bg_left.xml +8 -0
- package/android/src/main/res/drawable/navi_lane_shape_bg_over.xml +6 -0
- package/android/src/main/res/drawable/navi_lane_shape_bg_right.xml +8 -0
- package/android/src/main/res/drawable-nodpi/nav_tracker_car.png +0 -0
- package/build/ExpoGaodeMapNaviView.d.ts +16 -0
- package/build/ExpoGaodeMapNaviView.d.ts.map +1 -1
- package/build/ExpoGaodeMapNaviView.js +74 -1
- package/build/ExpoGaodeMapNaviView.js.map +1 -1
- package/build/index.d.ts +56 -8
- package/build/index.d.ts.map +1 -1
- package/build/index.js +452 -10
- package/build/index.js.map +1 -1
- package/build/map/ExpoGaodeMapModule.d.ts +15 -13
- package/build/map/ExpoGaodeMapModule.d.ts.map +1 -1
- package/build/map/ExpoGaodeMapModule.js +31 -39
- package/build/map/ExpoGaodeMapModule.js.map +1 -1
- package/build/map/ExpoGaodeMapOfflineModule.d.ts +5 -0
- package/build/map/ExpoGaodeMapOfflineModule.d.ts.map +1 -1
- package/build/map/ExpoGaodeMapOfflineModule.js.map +1 -1
- package/build/map/ExpoGaodeMapView.d.ts +3 -4
- package/build/map/ExpoGaodeMapView.d.ts.map +1 -1
- package/build/map/ExpoGaodeMapView.js +28 -25
- package/build/map/ExpoGaodeMapView.js.map +1 -1
- package/build/map/components/overlays/Circle.d.ts.map +1 -1
- package/build/map/components/overlays/Circle.js +1 -30
- package/build/map/components/overlays/Circle.js.map +1 -1
- package/build/map/components/overlays/Cluster.d.ts.map +1 -1
- package/build/map/components/overlays/Cluster.js +1 -42
- package/build/map/components/overlays/Cluster.js.map +1 -1
- package/build/map/components/overlays/HeatMap.d.ts.map +1 -1
- package/build/map/components/overlays/HeatMap.js +21 -21
- package/build/map/components/overlays/HeatMap.js.map +1 -1
- package/build/map/components/overlays/Marker.d.ts.map +1 -1
- package/build/map/components/overlays/Marker.js +76 -80
- package/build/map/components/overlays/Marker.js.map +1 -1
- package/build/map/components/overlays/Polygon.d.ts.map +1 -1
- package/build/map/components/overlays/Polygon.js +1 -25
- package/build/map/components/overlays/Polygon.js.map +1 -1
- package/build/map/components/overlays/Polyline.d.ts.map +1 -1
- package/build/map/components/overlays/Polyline.js +1 -31
- package/build/map/components/overlays/Polyline.js.map +1 -1
- package/build/map/index.d.ts +9 -2
- package/build/map/index.d.ts.map +1 -1
- package/build/map/index.js +9 -2
- package/build/map/index.js.map +1 -1
- package/build/map/search/ExpoGaodeMapSearch.types.d.ts +340 -0
- package/build/map/search/ExpoGaodeMapSearch.types.d.ts.map +1 -0
- package/build/map/search/ExpoGaodeMapSearch.types.js +19 -0
- package/build/map/search/ExpoGaodeMapSearch.types.js.map +1 -0
- package/build/map/search/ExpoGaodeMapSearchModule.d.ts +74 -0
- package/build/map/search/ExpoGaodeMapSearchModule.d.ts.map +1 -0
- package/build/map/search/ExpoGaodeMapSearchModule.js +47 -0
- package/build/map/search/ExpoGaodeMapSearchModule.js.map +1 -0
- package/build/map/search/index.d.ts +156 -0
- package/build/map/search/index.d.ts.map +1 -0
- package/build/map/search/index.js +171 -0
- package/build/map/search/index.js.map +1 -0
- package/build/map/types/index.d.ts +2 -2
- package/build/map/types/index.d.ts.map +1 -1
- package/build/map/types/index.js.map +1 -1
- package/build/map/types/map-view.types.d.ts +4 -2
- package/build/map/types/map-view.types.d.ts.map +1 -1
- package/build/map/types/map-view.types.js.map +1 -1
- package/build/map/types/native-module.types.d.ts +11 -12
- package/build/map/types/native-module.types.d.ts.map +1 -1
- package/build/map/types/native-module.types.js.map +1 -1
- package/build/map/types/overlays.types.d.ts +9 -14
- package/build/map/types/overlays.types.d.ts.map +1 -1
- package/build/map/types/overlays.types.js.map +1 -1
- package/build/map/types/route-playback.types.d.ts +16 -0
- package/build/map/types/route-playback.types.d.ts.map +1 -1
- package/build/map/types/route-playback.types.js.map +1 -1
- package/build/map/utils/ErrorHandler.js +11 -11
- package/build/map/utils/ErrorHandler.js.map +1 -1
- package/build/map/utils/OfflineMapManager.d.ts +4 -0
- package/build/map/utils/OfflineMapManager.d.ts.map +1 -1
- package/build/map/utils/OfflineMapManager.js +6 -0
- package/build/map/utils/OfflineMapManager.js.map +1 -1
- package/build/types/coordinates.types.d.ts +3 -0
- package/build/types/coordinates.types.d.ts.map +1 -1
- package/build/types/coordinates.types.js.map +1 -1
- package/build/types/independent.types.d.ts +111 -12
- package/build/types/independent.types.d.ts.map +1 -1
- package/build/types/independent.types.js.map +1 -1
- package/build/types/native-module.types.d.ts +1 -1
- package/build/types/native-module.types.js.map +1 -1
- package/build/types/naviview.types.d.ts +304 -14
- package/build/types/naviview.types.d.ts.map +1 -1
- package/build/types/naviview.types.js.map +1 -1
- package/build/types/route.types.d.ts +12 -2
- package/build/types/route.types.d.ts.map +1 -1
- package/build/types/route.types.js.map +1 -1
- package/expo-module.config.json +4 -2
- package/ios/ExpoGaodeMapNaviView.swift +2331 -201
- package/ios/ExpoGaodeMapNaviViewModule.swift +109 -1
- package/ios/ExpoGaodeMapNavigation.podspec +2 -1
- package/ios/ExpoGaodeMapNavigationModule.swift +7 -5
- package/ios/managers/IndependentRouteManager.swift +90 -26
- package/ios/map/ExpoGaodeMapModule.swift +72 -21
- package/ios/map/ExpoGaodeMapOfflineModule.swift +61 -0
- package/ios/map/ExpoGaodeMapSearchModule.swift +773 -0
- package/ios/map/ExpoGaodeMapView.swift +23 -5
- package/ios/map/GaodeMapPrivacyManager.swift +26 -18
- package/ios/map/cpp/GeometryEngine.cpp +112 -0
- package/ios/map/cpp/GeometryEngine.hpp +21 -0
- package/ios/map/modules/LocationManager.swift +37 -5
- package/ios/map/overlays/MarkerView.swift +11 -11
- package/ios/map/overlays/MarkerViewModule.swift +4 -4
- package/ios/map/overlays/PolylineView.swift +6 -12
- package/ios/map/utils/ClusterNative.h +8 -0
- package/ios/map/utils/ClusterNative.mm +27 -0
- package/ios/map/utils/PermissionManager.swift +115 -6
- package/ios/routes/drive/DriveTruckRouteCalculator.swift +165 -77
- package/ios/routes/walkride/WalkRideRouteCalculator.swift +127 -1
- package/ios/services/IndependentRouteService.swift +198 -39
- package/ios/services/NavigationLiveActivityAttributes.swift +48 -0
- package/ios/services/NavigationLiveActivityManager.swift +359 -0
- package/package.json +22 -7
- package/plugin/build/withGaodeMap.d.ts +8 -0
- package/plugin/build/withGaodeMap.js +60 -4
- package/scripts/check-expo-modules.js +68 -0
- package/shared/cpp/GeometryEngine.cpp +112 -0
- package/shared/cpp/GeometryEngine.hpp +21 -0
- package/widget-template/README.md +46 -0
- package/widget-template/ios/NavigationLiveActivityWidget.swift +367 -0
- 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
|
|
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
|
|
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:
|
|
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>;
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,4BAA4B,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
|
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
|
|
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,
|