MapViewModel.swift 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. func handleMapMoveCamera(args: [String: Any]?, result: @escaping FlutterResult) {
  25. guard let args = args, let cameraPosition = ATMapCameraPosition.fromJson(json: args) else {
  26. result(paramsDecodeError)
  27. return
  28. }
  29. let center = CLLocationCoordinate2D(latitude: cameraPosition.latitude, longitude: cameraPosition.longitude)
  30. let zoome = cameraPosition.zoom / 10000
  31. let span = MKCoordinateSpan(latitudeDelta: zoome, longitudeDelta: zoome)
  32. currentRegion = MKCoordinateRegion(center: center, span: span)
  33. result(nil)
  34. }
  35. // 处理地图添加Marker
  36. func handleMapAddMarker(args: [[String: Any]]?, result: @escaping FlutterResult) {
  37. guard let args = args, let newMarkers = [ATMapMarker].fromJson(json: args) else {
  38. result(paramsDecodeError)
  39. return
  40. }
  41. var markerDict = Dictionary(uniqueKeysWithValues: self.markers.map { ($0.id, $0) })
  42. for marker in newMarkers {
  43. markerDict[marker.id] = marker
  44. }
  45. self.markers = Array(markerDict.values)
  46. result(nil)
  47. }
  48. // 处理地图清除Marker
  49. func handleMapClearMarkers(result: @escaping FlutterResult) {
  50. markers = []
  51. result(nil)
  52. }
  53. // 处理地图替换所有Marker
  54. func handleMapReplaceAllMarkers(args: [[String: Any]]?, result: @escaping FlutterResult) {
  55. defer {
  56. result(nil)
  57. }
  58. guard let args = args, let markers = [ATMapMarker].fromJson(json: args) else {
  59. result(paramsDecodeError)
  60. return
  61. }
  62. self.markers = markers
  63. }
  64. // 处理Marker点击事件
  65. func handleMarkerTap(marker: inout ATMapMarker) {
  66. toggleMarkerSelected(marker: &marker)
  67. methodChannel?.invokeMethod(MapViewChannelMethod.methodMarkerOnTap.rawValue, arguments: marker.toJson())
  68. }
  69. // 处理地图添加Polyline
  70. func handleMapAddPolyline(args: [String: Any]?, result: @escaping FlutterResult) {
  71. guard let args = args, let polyline = ATMapPolyline.fromJson(json: args) else {
  72. result(paramsDecodeError)
  73. return
  74. }
  75. polylines.append(polyline)
  76. result(nil)
  77. }
  78. ///处理移动至多个点的位置,并提供设置padding距离
  79. func handleMapMoveToSuitableLocation(args: [String : Any]?, result: @escaping FlutterResult) {
  80. guard let args = args, let polyline = ATMapPolyline.fromJson(json: args) else {
  81. result(paramsDecodeError);
  82. return;
  83. }
  84. suitableLocation.append(polyline)
  85. print("argssfsfdsdfs--AK-\(args ?? [String: Any]())----\(suitableLocation)")
  86. result(nil);
  87. }
  88. }
  89. // Propertie Action
  90. extension MapViewModel {
  91. func toggleMarkerSelected(marker: inout ATMapMarker) {
  92. marker.isSelected = !marker.isSelected
  93. }
  94. }