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
|
@@ -36,11 +36,144 @@ class DriveTruckRouteCalculator: NSObject {
|
|
|
36
36
|
isInitialized = true
|
|
37
37
|
NSLog("DriveTruckRouteCalculator: AMapNaviDriveManager 初始化成功")
|
|
38
38
|
}
|
|
39
|
+
|
|
40
|
+
private func bindDriveManagerDelegate() {
|
|
41
|
+
driveManager = AMapNaviDriveManager.sharedInstance()
|
|
42
|
+
driveManager?.delegate = self
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
private func resolveScene(options: [String: Any]) -> String {
|
|
46
|
+
let carType = intValue(options["carType"]) ?? intValue(options["type"])
|
|
47
|
+
switch carType {
|
|
48
|
+
case 11:
|
|
49
|
+
return "motorcycle"
|
|
50
|
+
case 1, 3, 5:
|
|
51
|
+
return "truck"
|
|
52
|
+
default:
|
|
53
|
+
return "drive"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private func resolveDrivingStrategy(options: [String: Any]) -> AMapNaviDrivingStrategy {
|
|
58
|
+
let strategyValue: Int
|
|
59
|
+
if let rawStrategy = intValue(options["strategy"]) {
|
|
60
|
+
strategyValue = rawStrategy
|
|
61
|
+
} else {
|
|
62
|
+
strategyValue = Converters.convertDrivingPreferenceToStrategy(
|
|
63
|
+
multipleRoute: true,
|
|
64
|
+
avoidCongestion: boolValue(options["avoidCongestion"]) ?? false,
|
|
65
|
+
avoidHighway: boolValue(options["avoidHighway"]) ?? false,
|
|
66
|
+
avoidCost: boolValue(options["avoidCost"]) ?? false,
|
|
67
|
+
prioritiseHighway: boolValue(options["prioritiseHighway"]) ?? false
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
return AMapNaviDrivingStrategy(rawValue: strategyValue)
|
|
71
|
+
?? AMapNaviDrivingStrategy.drivingStrategyMultipleDefault
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
private func applyVehicleInfoIfNeeded(options: [String: Any]) {
|
|
75
|
+
let vehicleInfo = buildVehicleInfo(options: options)
|
|
76
|
+
_ = driveManager?.setVehicleInfo(vehicleInfo)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
private func buildVehicleInfo(options: [String: Any]) -> AMapNaviVehicleInfo? {
|
|
80
|
+
let vehicleInfo = AMapNaviVehicleInfo()
|
|
81
|
+
var hasAnyValue = false
|
|
82
|
+
|
|
83
|
+
if let vehicleId = nonEmptyString(options["carNumber"]) {
|
|
84
|
+
vehicleInfo.vehicleId = vehicleId
|
|
85
|
+
hasAnyValue = true
|
|
86
|
+
}
|
|
87
|
+
if let restriction = boolValue(options["restriction"]) {
|
|
88
|
+
vehicleInfo.isETARestriction = restriction
|
|
89
|
+
hasAnyValue = true
|
|
90
|
+
}
|
|
91
|
+
if let type = intValue(options["carType"]) ?? intValue(options["type"]) {
|
|
92
|
+
vehicleInfo.type = type
|
|
93
|
+
hasAnyValue = true
|
|
94
|
+
}
|
|
95
|
+
if let motorcycleCC = intValue(options["motorcycleCC"]) {
|
|
96
|
+
vehicleInfo.motorcycleCC = motorcycleCC
|
|
97
|
+
hasAnyValue = true
|
|
98
|
+
}
|
|
99
|
+
if let size = intValue(options["size"]) ?? intValue(options["vehicleSize"]) {
|
|
100
|
+
vehicleInfo.size = size
|
|
101
|
+
hasAnyValue = true
|
|
102
|
+
}
|
|
103
|
+
if let width = doubleValue(options["width"]) ?? doubleValue(options["vehicleWidth"]) {
|
|
104
|
+
vehicleInfo.width = width
|
|
105
|
+
hasAnyValue = true
|
|
106
|
+
}
|
|
107
|
+
if let height = doubleValue(options["height"]) ?? doubleValue(options["vehicleHeight"]) {
|
|
108
|
+
vehicleInfo.height = height
|
|
109
|
+
hasAnyValue = true
|
|
110
|
+
}
|
|
111
|
+
if let length = doubleValue(options["length"]) ?? doubleValue(options["vehicleLength"]) {
|
|
112
|
+
vehicleInfo.length = length
|
|
113
|
+
hasAnyValue = true
|
|
114
|
+
}
|
|
115
|
+
if let load = doubleValue(options["load"]) ?? doubleValue(options["vehicleLoad"]) {
|
|
116
|
+
vehicleInfo.load = load
|
|
117
|
+
hasAnyValue = true
|
|
118
|
+
}
|
|
119
|
+
if let weight = doubleValue(options["weight"]) ?? doubleValue(options["vehicleWeight"]) {
|
|
120
|
+
vehicleInfo.weight = weight
|
|
121
|
+
hasAnyValue = true
|
|
122
|
+
}
|
|
123
|
+
if let axisNums = intValue(options["axis"]) ?? intValue(options["axisNums"]) ?? intValue(options["vehicleAxis"]) {
|
|
124
|
+
vehicleInfo.axisNums = axisNums
|
|
125
|
+
hasAnyValue = true
|
|
126
|
+
}
|
|
127
|
+
if let isLoadIgnore = boolValue(options["isLoadIgnore"]) {
|
|
128
|
+
vehicleInfo.isLoadIgnore = isLoadIgnore
|
|
129
|
+
hasAnyValue = true
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return hasAnyValue ? vehicleInfo : nil
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
private func boolValue(_ raw: Any?) -> Bool? {
|
|
136
|
+
if let value = raw as? Bool { return value }
|
|
137
|
+
if let value = raw as? NSNumber { return value.boolValue }
|
|
138
|
+
if let value = raw as? String {
|
|
139
|
+
switch value.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() {
|
|
140
|
+
case "true", "1", "yes":
|
|
141
|
+
return true
|
|
142
|
+
case "false", "0", "no":
|
|
143
|
+
return false
|
|
144
|
+
default:
|
|
145
|
+
return nil
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return nil
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
private func intValue(_ raw: Any?) -> Int? {
|
|
152
|
+
if let value = raw as? Int { return value }
|
|
153
|
+
if let value = raw as? NSNumber { return value.intValue }
|
|
154
|
+
if let value = raw as? String { return Int(value) }
|
|
155
|
+
return nil
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
private func doubleValue(_ raw: Any?) -> Double? {
|
|
159
|
+
if let value = raw as? Double { return value }
|
|
160
|
+
if let value = raw as? Float { return Double(value) }
|
|
161
|
+
if let value = raw as? NSNumber { return value.doubleValue }
|
|
162
|
+
if let value = raw as? String { return Double(value) }
|
|
163
|
+
return nil
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
private func nonEmptyString(_ raw: Any?) -> String? {
|
|
167
|
+
guard let value = raw as? String else { return nil }
|
|
168
|
+
let trimmed = value.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
169
|
+
return trimmed.isEmpty ? nil : trimmed
|
|
170
|
+
}
|
|
39
171
|
|
|
40
172
|
// MARK: - 驾车路径规划
|
|
41
173
|
|
|
42
174
|
func calculateDriveRoute(options: [String: Any], promise: Promise) {
|
|
43
175
|
NSLog("DriveTruckRouteCalculator: 开始计算驾车路线")
|
|
176
|
+
bindDriveManagerDelegate()
|
|
44
177
|
|
|
45
178
|
// 防重复调用检查
|
|
46
179
|
if currentPromise != nil {
|
|
@@ -56,20 +189,19 @@ class DriveTruckRouteCalculator: NSObject {
|
|
|
56
189
|
}
|
|
57
190
|
|
|
58
191
|
// 解析途经点
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
192
|
+
let wayPoints = Converters.parseWaypoints(options["waypoints"] as? [[String: Any]])
|
|
193
|
+
let wayPOIInfos = Converters.parseNaviPOIInfos(options["waypoints"] as? [[String: Any]])
|
|
194
|
+
let wayPointPOIIds = (options["waypoints"] as? [[String: Any]])?.compactMap { point in
|
|
195
|
+
nonEmptyString(point["poiId"]) ?? nonEmptyString(point["mid"])
|
|
62
196
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
NSLog("DriveTruckRouteCalculator: 使用策略值: \(strategyValue), strategy: \(strategy.rawValue)")
|
|
70
|
-
|
|
71
|
-
scene = "drive"
|
|
197
|
+
|
|
198
|
+
let strategy = resolveDrivingStrategy(options: options)
|
|
199
|
+
|
|
200
|
+
NSLog("DriveTruckRouteCalculator: 使用策略值: \(strategy.rawValue), strategy: \(strategy.rawValue)")
|
|
201
|
+
|
|
202
|
+
scene = resolveScene(options: options)
|
|
72
203
|
currentPromise = promise
|
|
204
|
+
applyVehicleInfoIfNeeded(options: options)
|
|
73
205
|
|
|
74
206
|
var success = false
|
|
75
207
|
|
|
@@ -81,20 +213,14 @@ class DriveTruckRouteCalculator: NSObject {
|
|
|
81
213
|
success = driveManager?.calculateDriveRoute(
|
|
82
214
|
withStartPointPOIId: fromMid,
|
|
83
215
|
endPointPOIId: toMid,
|
|
84
|
-
wayPointsPOIId:
|
|
216
|
+
wayPointsPOIId: wayPointPOIIds,
|
|
85
217
|
drivingStrategy: strategy
|
|
86
218
|
) ?? false
|
|
87
219
|
} else if let fromInfo = Converters.parseNaviPOIInfo(from),
|
|
88
220
|
let toInfo = Converters.parseNaviPOIInfo(to) {
|
|
89
221
|
// 使用 POIInfo 算路(支持起点角度)
|
|
90
222
|
NSLog("DriveTruckRouteCalculator: 使用 POIInfo 算路")
|
|
91
|
-
|
|
92
|
-
// 解析途经点 POIInfo
|
|
93
|
-
var wayPOIInfos: [AMapNaviPOIInfo]? = nil
|
|
94
|
-
if let waypointsArray = options["waypoints"] as? [[String: Any]] {
|
|
95
|
-
wayPOIInfos = waypointsArray.compactMap { Converters.parseNaviPOIInfo($0) }
|
|
96
|
-
}
|
|
97
|
-
|
|
223
|
+
|
|
98
224
|
// 官方方法:calculateDriveRouteWithStart:end:wayPOIInfos:drivingStrategy:
|
|
99
225
|
success = driveManager?.calculateDriveRoute(
|
|
100
226
|
withStart: fromInfo,
|
|
@@ -138,62 +264,11 @@ class DriveTruckRouteCalculator: NSObject {
|
|
|
138
264
|
|
|
139
265
|
func calculateTruckRoute(options: [String: Any], promise: Promise) {
|
|
140
266
|
NSLog("DriveTruckRouteCalculator: 开始计算货车路线")
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
// 车牌号
|
|
146
|
-
if let vehicleId = options["carNumber"] as? String {
|
|
147
|
-
vehicleInfo.vehicleId = vehicleId
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// 车辆类型:1/3/5 为货车
|
|
151
|
-
vehicleInfo.type = 1
|
|
152
|
-
|
|
153
|
-
// 货车尺寸类型
|
|
154
|
-
if let size = options["size"] as? Int {
|
|
155
|
-
vehicleInfo.size = size
|
|
156
|
-
} else {
|
|
157
|
-
vehicleInfo.size = 4 // 默认
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// 货车宽度(米)
|
|
161
|
-
if let width = options["width"] as? Double {
|
|
162
|
-
vehicleInfo.width = width
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// 货车高度(米)
|
|
166
|
-
if let height = options["height"] as? Double {
|
|
167
|
-
vehicleInfo.height = height
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// 货车长度(米)
|
|
171
|
-
if let length = options["length"] as? Double {
|
|
172
|
-
vehicleInfo.length = length
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// 货车总重(吨)
|
|
176
|
-
if let load = options["load"] as? Double {
|
|
177
|
-
vehicleInfo.load = load
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// 货车核定载重(吨)
|
|
181
|
-
if let weight = options["weight"] as? Double {
|
|
182
|
-
vehicleInfo.weight = weight
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// 货车轴数
|
|
186
|
-
if let axisNums = options["axisNums"] as? Int {
|
|
187
|
-
vehicleInfo.axisNums = axisNums
|
|
267
|
+
var truckOptions = options
|
|
268
|
+
if truckOptions["carType"] == nil && truckOptions["type"] == nil {
|
|
269
|
+
truckOptions["carType"] = 1
|
|
188
270
|
}
|
|
189
|
-
|
|
190
|
-
// 设置车辆信息
|
|
191
|
-
driveManager?.setVehicleInfo(vehicleInfo)
|
|
192
|
-
|
|
193
|
-
scene = "truck"
|
|
194
|
-
|
|
195
|
-
// 复用驾车算路逻辑
|
|
196
|
-
calculateDriveRoute(options: options, promise: promise)
|
|
271
|
+
calculateDriveRoute(options: truckOptions, promise: promise)
|
|
197
272
|
}
|
|
198
273
|
|
|
199
274
|
func destroy() {
|
|
@@ -223,22 +298,24 @@ extension DriveTruckRouteCalculator: AMapNaviDriveManagerDelegate {
|
|
|
223
298
|
if let naviRoutes = driveManager.naviRoutes {
|
|
224
299
|
for (routeId, route) in naviRoutes {
|
|
225
300
|
routes.append([
|
|
301
|
+
"id": routeId,
|
|
226
302
|
"routeId": routeId,
|
|
227
303
|
"distance": route.routeLength,
|
|
228
304
|
"duration": route.routeTime,
|
|
229
305
|
"tollCost": route.routeTollCost,
|
|
230
|
-
"strategy":
|
|
306
|
+
"strategy": routeTitle(routeId: routeId as? Int ?? 0),
|
|
231
307
|
"polyline": extractCoordinates(from: route)
|
|
232
308
|
])
|
|
233
309
|
}
|
|
234
310
|
} else if let naviRoute = driveManager.naviRoute {
|
|
235
311
|
// 单路线
|
|
236
312
|
routes.append([
|
|
313
|
+
"id": 12,
|
|
237
314
|
"routeId": 12,
|
|
238
315
|
"distance": naviRoute.routeLength,
|
|
239
316
|
"duration": naviRoute.routeTime,
|
|
240
317
|
"tollCost": naviRoute.routeTollCost,
|
|
241
|
-
"strategy":
|
|
318
|
+
"strategy": routeTitle(routeId: 12),
|
|
242
319
|
"polyline": extractCoordinates(from: naviRoute)
|
|
243
320
|
])
|
|
244
321
|
}
|
|
@@ -269,6 +346,17 @@ extension DriveTruckRouteCalculator: AMapNaviDriveManagerDelegate {
|
|
|
269
346
|
default: return "路线\(routeId - 11)"
|
|
270
347
|
}
|
|
271
348
|
}
|
|
349
|
+
|
|
350
|
+
private func routeTitle(routeId: Int) -> String {
|
|
351
|
+
switch scene {
|
|
352
|
+
case "truck":
|
|
353
|
+
return "货车路线"
|
|
354
|
+
case "motorcycle":
|
|
355
|
+
return "摩托车路线"
|
|
356
|
+
default:
|
|
357
|
+
return getStrategyName(routeId: routeId)
|
|
358
|
+
}
|
|
359
|
+
}
|
|
272
360
|
|
|
273
361
|
/// 提取路线坐标点
|
|
274
362
|
private func extractCoordinates(from route: AMapNaviRoute) -> [[String: Double]] {
|
|
@@ -38,10 +38,84 @@ class WalkRideRouteCalculator: NSObject {
|
|
|
38
38
|
eleBikeDelegateHandler?.calculator = self
|
|
39
39
|
eleBikeManager?.delegate = eleBikeDelegateHandler
|
|
40
40
|
}
|
|
41
|
+
|
|
42
|
+
private func bindWalkManagerDelegate() {
|
|
43
|
+
walkManager = AMapNaviWalkManager.sharedInstance()
|
|
44
|
+
walkManager?.delegate = self
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private func bindRideManagerDelegate() {
|
|
48
|
+
rideManager = AMapNaviRideManager.sharedInstance()
|
|
49
|
+
rideManager?.delegate = self
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private func bindEleBikeManagerDelegate() {
|
|
53
|
+
eleBikeManager = AMapNaviEleBikeManager.sharedInstance()
|
|
54
|
+
if eleBikeDelegateHandler == nil {
|
|
55
|
+
eleBikeDelegateHandler = EleBikeDelegateHandler()
|
|
56
|
+
eleBikeDelegateHandler?.calculator = self
|
|
57
|
+
}
|
|
58
|
+
eleBikeManager?.delegate = eleBikeDelegateHandler
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
private func boolValue(_ raw: Any?) -> Bool? {
|
|
62
|
+
if let value = raw as? Bool { return value }
|
|
63
|
+
if let value = raw as? NSNumber { return value.boolValue }
|
|
64
|
+
if let value = raw as? String {
|
|
65
|
+
switch value.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() {
|
|
66
|
+
case "true", "1", "yes":
|
|
67
|
+
return true
|
|
68
|
+
case "false", "0", "no":
|
|
69
|
+
return false
|
|
70
|
+
default:
|
|
71
|
+
return nil
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return nil
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private func intValue(_ raw: Any?) -> Int? {
|
|
78
|
+
if let value = raw as? Int { return value }
|
|
79
|
+
if let value = raw as? NSNumber { return value.intValue }
|
|
80
|
+
if let value = raw as? String { return Int(value) }
|
|
81
|
+
return nil
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private func shouldUsePOICalculation(options: [String: Any]) -> Bool {
|
|
85
|
+
if boolValue(options["usePoi"]) == true {
|
|
86
|
+
return true
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
let pointDictionaries = [
|
|
90
|
+
options["from"] as? [String: Any],
|
|
91
|
+
options["to"] as? [String: Any]
|
|
92
|
+
]
|
|
93
|
+
|
|
94
|
+
return pointDictionaries.contains { point in
|
|
95
|
+
guard let point else {
|
|
96
|
+
return false
|
|
97
|
+
}
|
|
98
|
+
let name = (point["name"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
99
|
+
let poiId = (point["poiId"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
100
|
+
let mid = (point["mid"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
101
|
+
return !(name?.isEmpty ?? true) || !(poiId?.isEmpty ?? true) || !(mid?.isEmpty ?? true)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
private func resolveTravelStrategy(options: [String: Any]) -> AMapNaviTravelStrategy {
|
|
106
|
+
if let raw = intValue(options["travelStrategy"]) {
|
|
107
|
+
return raw == 1001 ? .multipleDefault : .singleDefault
|
|
108
|
+
}
|
|
109
|
+
if boolValue(options["multiple"]) == true {
|
|
110
|
+
return .multipleDefault
|
|
111
|
+
}
|
|
112
|
+
return .singleDefault
|
|
113
|
+
}
|
|
41
114
|
|
|
42
115
|
// MARK: - 步行路径规划
|
|
43
116
|
|
|
44
117
|
func calculateWalkRoute(options: [String: Any], promise: Promise) {
|
|
118
|
+
bindWalkManagerDelegate()
|
|
45
119
|
guard let from = options["from"] as? [String: Any],
|
|
46
120
|
let to = options["to"] as? [String: Any] else {
|
|
47
121
|
promise.reject("INVALID_PARAMS", "from and to are required")
|
|
@@ -76,6 +150,7 @@ class WalkRideRouteCalculator: NSObject {
|
|
|
76
150
|
/// 骑行路线规划(坐标方式)
|
|
77
151
|
/// 对应官方方法:calculateRideRouteWithStartPoint:endPoint:
|
|
78
152
|
func calculateRideRoute(options: [String: Any], promise: Promise) {
|
|
153
|
+
bindRideManagerDelegate()
|
|
79
154
|
guard let from = options["from"] as? [String: Any],
|
|
80
155
|
let to = options["to"] as? [String: Any] else {
|
|
81
156
|
promise.reject("INVALID_PARAMS", "from and to are required")
|
|
@@ -104,6 +179,7 @@ class WalkRideRouteCalculator: NSObject {
|
|
|
104
179
|
/// 骑行路线规划(POIInfo方式,推荐)
|
|
105
180
|
/// 对应官方方法:calculateRideRouteWithStartPOIInfo:endPOIInfo:strategy:
|
|
106
181
|
func calculateRideRouteWithPOI(options: [String: Any], promise: Promise) {
|
|
182
|
+
bindRideManagerDelegate()
|
|
107
183
|
guard let to = options["to"] as? [String: Any] else {
|
|
108
184
|
promise.reject("INVALID_PARAMS", "to is required")
|
|
109
185
|
return
|
|
@@ -138,6 +214,7 @@ class WalkRideRouteCalculator: NSObject {
|
|
|
138
214
|
/// 电动车路线规划(坐标方式)
|
|
139
215
|
/// 对应官方方法:calculateEleBikeRouteWithStartPoint:endPoint:
|
|
140
216
|
func calculateEleBikeRoute(options: [String: Any], promise: Promise) {
|
|
217
|
+
bindEleBikeManagerDelegate()
|
|
141
218
|
guard let from = options["from"] as? [String: Any],
|
|
142
219
|
let to = options["to"] as? [String: Any] else {
|
|
143
220
|
promise.reject("INVALID_PARAMS", "from and to are required")
|
|
@@ -166,6 +243,7 @@ class WalkRideRouteCalculator: NSObject {
|
|
|
166
243
|
/// 电动车路线规划(POIInfo方式,推荐)
|
|
167
244
|
/// 对应官方方法:calculateEleBikeRouteWithStartPOIInfo:endPOIInfo:strategy:
|
|
168
245
|
func calculateEleBikeRouteWithPOI(options: [String: Any], promise: Promise) {
|
|
246
|
+
bindEleBikeManagerDelegate()
|
|
169
247
|
guard let to = options["to"] as? [String: Any] else {
|
|
170
248
|
promise.reject("INVALID_PARAMS", "to is required")
|
|
171
249
|
return
|
|
@@ -184,7 +262,7 @@ class WalkRideRouteCalculator: NSObject {
|
|
|
184
262
|
promise.reject("INVALID_PARAMS", "Invalid end POI info")
|
|
185
263
|
return
|
|
186
264
|
}
|
|
187
|
-
let strategy =
|
|
265
|
+
let strategy = resolveTravelStrategy(options: options)
|
|
188
266
|
|
|
189
267
|
let success = eleBikeManager?.calculateEleBikeRoute(withStart: startPOIInfo, end: endPOIInfo, strategy: strategy) ?? false
|
|
190
268
|
|
|
@@ -193,6 +271,48 @@ class WalkRideRouteCalculator: NSObject {
|
|
|
193
271
|
promise.reject("CALCULATE_FAILED", "电动车路线规划启动失败")
|
|
194
272
|
}
|
|
195
273
|
}
|
|
274
|
+
|
|
275
|
+
func calculateResolvedEleBikeRoute(options: [String: Any], promise: Promise) {
|
|
276
|
+
if shouldUsePOICalculation(options: options) {
|
|
277
|
+
calculateEleBikeRouteWithPOI(options: options, promise: promise)
|
|
278
|
+
return
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
bindEleBikeManagerDelegate()
|
|
282
|
+
guard let to = options["to"] as? [String: Any] else {
|
|
283
|
+
promise.reject("INVALID_PARAMS", "to is required")
|
|
284
|
+
return
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
scene = "eleBike"
|
|
288
|
+
currentPromise = promise
|
|
289
|
+
|
|
290
|
+
if let from = options["from"] as? [String: Any] {
|
|
291
|
+
guard let start = Converters.parseNaviPoint(from),
|
|
292
|
+
let end = Converters.parseNaviPoint(to) else {
|
|
293
|
+
currentPromise = nil
|
|
294
|
+
promise.reject("INVALID_COORDS", "Invalid coordinates")
|
|
295
|
+
return
|
|
296
|
+
}
|
|
297
|
+
let success = eleBikeManager?.calculateEleBikeRoute(withStart: start, end: end) ?? false
|
|
298
|
+
if !success {
|
|
299
|
+
currentPromise = nil
|
|
300
|
+
promise.reject("CALCULATE_FAILED", "电动车路线规划启动失败")
|
|
301
|
+
}
|
|
302
|
+
return
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
guard let end = Converters.parseNaviPoint(to) else {
|
|
306
|
+
currentPromise = nil
|
|
307
|
+
promise.reject("INVALID_COORDS", "Invalid coordinates")
|
|
308
|
+
return
|
|
309
|
+
}
|
|
310
|
+
let success = eleBikeManager?.calculateEleBikeRoute(withEnd: end) ?? false
|
|
311
|
+
if !success {
|
|
312
|
+
currentPromise = nil
|
|
313
|
+
promise.reject("CALCULATE_FAILED", "电动车路线规划启动失败")
|
|
314
|
+
}
|
|
315
|
+
}
|
|
196
316
|
|
|
197
317
|
func destroy() {
|
|
198
318
|
walkManager?.delegate = nil
|
|
@@ -225,6 +345,7 @@ extension WalkRideRouteCalculator: AMapNaviWalkManagerDelegate {
|
|
|
225
345
|
NSLog("WalkRideRouteCalculator: 步行规划返回 \(naviRoutes.count) 条路线")
|
|
226
346
|
for (routeId, route) in naviRoutes {
|
|
227
347
|
routes.append([
|
|
348
|
+
"id": routeId,
|
|
228
349
|
"routeId": routeId,
|
|
229
350
|
"distance": route.routeLength,
|
|
230
351
|
"duration": route.routeTime,
|
|
@@ -236,6 +357,7 @@ extension WalkRideRouteCalculator: AMapNaviWalkManagerDelegate {
|
|
|
236
357
|
// 单路线
|
|
237
358
|
NSLog("WalkRideRouteCalculator: 步行规划返回单条路线")
|
|
238
359
|
routes.append([
|
|
360
|
+
"id": 12,
|
|
239
361
|
"routeId": 12,
|
|
240
362
|
"distance": naviRoute.routeLength,
|
|
241
363
|
"duration": naviRoute.routeTime,
|
|
@@ -274,6 +396,7 @@ extension WalkRideRouteCalculator: AMapNaviRideManagerDelegate {
|
|
|
274
396
|
NSLog("WalkRideRouteCalculator: 骑行规划返回 \(naviRoutes.count) 条路线")
|
|
275
397
|
for (routeId, route) in naviRoutes {
|
|
276
398
|
routes.append([
|
|
399
|
+
"id": routeId,
|
|
277
400
|
"routeId": routeId,
|
|
278
401
|
"distance": route.routeLength,
|
|
279
402
|
"duration": route.routeTime,
|
|
@@ -285,6 +408,7 @@ extension WalkRideRouteCalculator: AMapNaviRideManagerDelegate {
|
|
|
285
408
|
// 单路线
|
|
286
409
|
NSLog("WalkRideRouteCalculator: 骑行规划返回单条路线")
|
|
287
410
|
routes.append([
|
|
411
|
+
"id": 12,
|
|
288
412
|
"routeId": 12,
|
|
289
413
|
"distance": naviRoute.routeLength,
|
|
290
414
|
"duration": naviRoute.routeTime,
|
|
@@ -336,6 +460,7 @@ extension WalkRideRouteCalculator {
|
|
|
336
460
|
NSLog("WalkRideRouteCalculator: 电动车规划返回 \(naviRoutes.count) 条路线")
|
|
337
461
|
for (routeId, route) in naviRoutes {
|
|
338
462
|
routes.append([
|
|
463
|
+
"id": routeId,
|
|
339
464
|
"routeId": routeId,
|
|
340
465
|
"distance": route.routeLength,
|
|
341
466
|
"duration": route.routeTime,
|
|
@@ -347,6 +472,7 @@ extension WalkRideRouteCalculator {
|
|
|
347
472
|
// 单路线
|
|
348
473
|
NSLog("WalkRideRouteCalculator: 电动车规划返回单条路线")
|
|
349
474
|
routes.append([
|
|
475
|
+
"id": 12,
|
|
350
476
|
"routeId": 12,
|
|
351
477
|
"distance": naviRoute.routeLength,
|
|
352
478
|
"duration": naviRoute.routeTime,
|