MapAmapViewAndDataExchange.swift 5.5 KB

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