MapViewModel.swift 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. private let coordinates: [CLLocationCoordinate2D] = [
  14. CLLocationCoordinate2D(latitude: 39.90333, longitude: 116.39167), // 北京
  15. CLLocationCoordinate2D(latitude: 31.23170, longitude: 121.47264), // 上海
  16. CLLocationCoordinate2D(latitude: 22.54554, longitude: 114.05786), // 深圳
  17. CLLocationCoordinate2D(latitude: 23.12911, longitude: 113.26437), // 广州
  18. CLLocationCoordinate2D(latitude: 30.59276, longitude: 114.30525), // 武汉
  19. ]
  20. class MapViewModel: NSObject, ObservableObject, MapCapability {
  21. var paramsDecodeError: FlutterError? = FlutterError(code: "InvalidArguments", message: "Invalid arguments", details: nil)
  22. var methodChannel: FlutterMethodChannel?
  23. @Published var currentRegion: MKCoordinateRegion?
  24. // 记录用户位置
  25. @Published var userLocation: CLLocationCoordinate2D?
  26. // 地图Marker
  27. @Published var markers: [ATMapMarker] = []
  28. // 地图Polyline
  29. @Published var polylines: [ATMapPolyline] = []
  30. // 处理地图移动
  31. func handleMapMoveCamera(args: [String: Any]?, result: @escaping FlutterResult) {
  32. guard let args = args, let cameraPosition = ATMapCameraPosition.fromJson(json: args) else {
  33. result(paramsDecodeError)
  34. return
  35. }
  36. let center = CLLocationCoordinate2D(latitude: cameraPosition.latitude, longitude: cameraPosition.longitude)
  37. let span = MKCoordinateSpan(latitudeDelta: cameraPosition.zoom, longitudeDelta: cameraPosition.zoom)
  38. currentRegion = 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 marker = ATMapMarker.fromJson(json: args) else {
  44. result(paramsDecodeError)
  45. return
  46. }
  47. // 检查是否已存在相同ID的标记,如果有则先移除
  48. if let index = markers.firstIndex(where: { $0.id == marker.id }) {
  49. markers.remove(at: index)
  50. }
  51. markers.append(marker)
  52. result(nil)
  53. }
  54. // 处理地图清除Marker
  55. func handleMapClearMarkers(result: @escaping FlutterResult) {
  56. markers = []
  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 = args["markers"] as? [[String: Any]] else {
  65. result(paramsDecodeError)
  66. return
  67. }
  68. let mapMarkers = markers.compactMap({ ATMapMarker.fromJson(json: $0) })
  69. self.markers = mapMarkers
  70. }
  71. // 处理Marker点击事件
  72. func handleMarkerTap(marker: inout ATMapMarker) {
  73. toggleMarkerSelected(marker: &marker)
  74. methodChannel?.invokeMethod(ChannelMethods.methodMarkerOnTap.rawValue, arguments: marker.toJson())
  75. }
  76. // 处理地图添加Polyline
  77. func handleMapAddPolyline(args: [String: Any]?, result: @escaping FlutterResult) {
  78. guard let args = args, let pointsArray = args["points"] as? [[String: Any]] else {
  79. result(paramsDecodeError)
  80. return
  81. }
  82. let coordinates = pointsArray.compactMap({ CLLocationCoordinate2D.fromJson(json: $0) })
  83. let polyline = ATMapPolyline(points: coordinates)
  84. polylines.append(polyline)
  85. result(nil)
  86. }
  87. }
  88. // Propertie Action
  89. extension MapViewModel {
  90. func toggleMarkerSelected(marker: inout ATMapMarker) {
  91. marker.isSelected = !marker.isSelected
  92. }
  93. }