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
@@ -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
- var wayPoints: [AMapNaviPoint]? = nil
60
- if let waypointsArray = options["waypoints"] as? [[String: Any]] {
61
- wayPoints = waypointsArray.compactMap { Converters.parseNaviPoint($0) }
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
- // 解析策略 (0-20 对应 AMapNaviDrivingStrategy)
65
- // 10-20 是多路径策略,0-9 是单路径策略
66
- let strategyValue = (options["strategy"] as? Int) ?? 10 // 默认使用多路径策略
67
- let strategy: AMapNaviDrivingStrategy = AMapNaviDrivingStrategy(rawValue: strategyValue) ?? AMapNaviDrivingStrategy.drivingStrategyMultipleDefault
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: nil,
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
- let vehicleInfo = AMapNaviVehicleInfo()
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": scene == "truck" ? "货车路线" : getStrategyName(routeId: routeId as? Int ?? 0),
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": scene == "truck" ? "货车路线" : "推荐路线",
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 = AMapNaviTravelStrategy(rawValue: options["strategy"] as? Int ?? 0) ?? .multipleDefault
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,