MapViewModel.swift 5.4 KB

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