MapAmapViewAndDataExchange.swift 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. //
  2. // MapAmapViewAndDataExchange.swift
  3. // map_amap_ios
  4. //
  5. // Created by 诺诺诺的言 on 2025/7/22.
  6. //
  7. import Foundation
  8. import SwiftUI
  9. import Combine
  10. import MapKit
  11. import CoreLocation
  12. import Flutter
  13. import MAMapKit
  14. @available(iOS 13.0, *)
  15. class MapAmapViewAndDataExchange: NSObject, ObservableObject, MapCapability {
  16. var paramsDecodeError: FlutterError? = FlutterError(code: "InvalidArguments", message: "Invalid arguments", details: nil)
  17. var methodChannel: FlutterMethodChannel?
  18. @Published var currentRegion: MACoordinateRegion?
  19. // 地图Marker
  20. @Published var markers: [ATMapMarker] = []
  21. // 地图Polyline
  22. @Published var polylines: [ATMapPolyline] = []
  23. //移动至多个点的位置,并提供设置padding距离
  24. @Published var suitableLocation: [ATMapPolyline] = []
  25. ///禁用或开启地图所有交互
  26. @Published var interactionEnabled : String = ""
  27. /// 显示或隐藏地图logo
  28. @Published var logoVisible : String = ""
  29. // 处理地图移动
  30. func handleMapMoveCamera(args: [String: Any]?, result: @escaping FlutterResult) {
  31. guard let args = args, let cameraPosition = ATMapCameraPosition.fromJson(json: args) else {
  32. result(paramsDecodeError)
  33. return
  34. }
  35. let center = CLLocationCoordinate2D(latitude: cameraPosition.latitude, longitude: cameraPosition.longitude)
  36. let zoome = cameraPosition.zoom / 10000
  37. let span = MACoordinateSpanMake(zoome, zoome)//MKCoordinateSpan(latitudeDelta: zoome, longitudeDelta: zoome)
  38. currentRegion = MACoordinateRegion(center: center, span: span);//MKCoordinateRegion(center: center, span: span)
  39. result(nil)
  40. }
  41. // 处理地图添加Marker
  42. func handleMapAddMarker(args: [[String: Any]]?, result: @escaping FlutterResult) {
  43. guard let args = args, let newMarkers = [ATMapMarker].fromJson(json: args) else {
  44. result(paramsDecodeError)
  45. return
  46. }
  47. var markerDict = Dictionary(uniqueKeysWithValues: self.markers.map { ($0.id, $0) })
  48. for marker in newMarkers {
  49. if marker.id.isEmpty {
  50. marker.id = "mine"
  51. }
  52. markerDict[marker.id] = marker
  53. }
  54. DispatchQueue.main.async{
  55. self.markers = Array(markerDict.values)
  56. }
  57. result(nil)
  58. }
  59. // 处理地图清除Marker
  60. func handleMapClearMarkers(result: @escaping FlutterResult) {
  61. DispatchQueue.main.async{
  62. self.markers = []
  63. self.polylines = []
  64. }
  65. self.markers = []
  66. result(nil)
  67. }
  68. //处理地图所有plolines
  69. func handleMapClearAllPolyline(result: @escaping FlutterResult) {
  70. DispatchQueue.main.async{
  71. self.polylines = []
  72. }
  73. result(nil)
  74. }
  75. // 处理地图替换所有Marker
  76. func handleMapReplaceAllMarkers(args: [[String: Any]]?, result: @escaping FlutterResult) {
  77. defer {
  78. result(nil)
  79. }
  80. guard let args = args, let markers = [ATMapMarker].fromJson(json: args) else {
  81. result(paramsDecodeError)
  82. return
  83. }
  84. DispatchQueue.main.async{
  85. self.markers = markers
  86. }
  87. }
  88. // 处理Marker点击事件
  89. func handleMarkerTap(marker: inout ATMapMarker) {
  90. toggleMarkerSelected(marker: &marker)
  91. methodChannel?.invokeMethod(MapAmapDetailOpetation.methodMarkerOnTap.rawValue, arguments: marker.toJson())
  92. }
  93. // 处理地图添加Polyline
  94. func handleMapAddPolyline(args: [String: Any]?, result: @escaping FlutterResult) {
  95. guard let args = args, let polyline = ATMapPolyline.fromJson(json: args) else {
  96. result(paramsDecodeError)
  97. return
  98. }
  99. DispatchQueue.main.async{
  100. self.polylines.append(polyline)
  101. }
  102. result(nil)
  103. }
  104. ///处理移动至多个点的位置,并提供设置padding距离
  105. func handleMapMoveToSuitableLocation(args: [String : Any]?, result: @escaping FlutterResult) {
  106. guard let args = args, let polyline = ATMapPolyline.fromJson(json: args) else {
  107. result(paramsDecodeError);
  108. return;
  109. }
  110. DispatchQueue.main.async{
  111. self.suitableLocation.append(polyline)
  112. }
  113. result(nil);
  114. }
  115. ///清除指定标记物
  116. func handleMapRemovemarker(args: [String : Any]?, result: @escaping FlutterResult) {
  117. var fixArge : [String : Any] = args ?? [String : Any]()
  118. fixArge["id"] = "0"
  119. defer {
  120. result(nil)
  121. }
  122. guard let markerItem = ATMapMarker.fromJson(json: fixArge) else {
  123. result(paramsDecodeError)
  124. return
  125. }
  126. // 使用标识符找到要移除的标记物并从数组中删除
  127. DispatchQueue.main.async{
  128. if let index = self.markers.firstIndex(where: { $0.id == markerItem.markerId }) {
  129. self.markers.remove(at: index)
  130. }
  131. }
  132. }
  133. ///清除制定的线
  134. func handleMapRemovePolyline(args: [String : Any]?, result: @escaping FlutterResult) {
  135. guard let args = args, let polyline = ATMapPolyline.fromJson(json: args) else {
  136. result(paramsDecodeError)
  137. return
  138. }
  139. DispatchQueue.main.async {
  140. if let index = self.polylines.firstIndex(where: { $0.lineId == polyline.lineId }) {
  141. var changeArray : [ATMapPolyline] = []
  142. for itemPoly in self.polylines {
  143. changeArray.append(itemPoly)
  144. }
  145. changeArray.remove(at: index)
  146. self.polylines = changeArray
  147. //self.polylines.remove(at: index)
  148. }
  149. }
  150. result(nil)
  151. }
  152. ///禁用或开启地图所有交互
  153. func handleMapInteractionEnabled(args: [String: Any]?, result: @escaping FlutterResult) {
  154. if let enabled = args?["enabled"] {
  155. DispatchQueue.main.async{
  156. self.interactionEnabled = "\(enabled)";
  157. }
  158. }
  159. result(nil)
  160. }
  161. ///显示或隐藏地图logo
  162. func handleMapLogoVisible(args: [String : Any]?, result: @escaping FlutterResult) {
  163. if let visible = args?["visible"] {
  164. DispatchQueue.main.async{
  165. self.logoVisible = "\(visible)";
  166. }
  167. }
  168. result(nil)
  169. }
  170. }
  171. // Propertie Action
  172. @available(iOS 13.0, *)
  173. extension MapAmapViewAndDataExchange {
  174. func toggleMarkerSelected(marker: inout ATMapMarker) {
  175. marker.isSelected = !marker.isSelected
  176. }
  177. }