| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- //
- // MapViewModel.swift
- // Runner
- //
- // Created by Groot on 2025/5/7.
- //
- import Flutter
- import Foundation
- import MapKit
- import CoreLocation
- import SwiftUI
- import Combine
- private let coordinates: [CLLocationCoordinate2D] = [
- CLLocationCoordinate2D(latitude: 39.90333, longitude: 116.39167), // 北京
- CLLocationCoordinate2D(latitude: 31.23170, longitude: 121.47264), // 上海
- CLLocationCoordinate2D(latitude: 22.54554, longitude: 114.05786), // 深圳
- CLLocationCoordinate2D(latitude: 23.12911, longitude: 113.26437), // 广州
- CLLocationCoordinate2D(latitude: 30.59276, longitude: 114.30525), // 武汉
- ]
- class MapViewModel: NSObject, ObservableObject, MapCapability {
- var paramsDecodeError: FlutterError? = FlutterError(code: "InvalidArguments", message: "Invalid arguments", details: nil)
- var methodChannel: FlutterMethodChannel?
- @Published var currentRegion: MKCoordinateRegion?
-
- // 记录用户位置
- @Published var userLocation: CLLocationCoordinate2D?
- // 地图Marker
- @Published var markers: [ATMapMarker] = []
-
- // 地图Polyline
- @Published var polylines: [ATMapPolyline] = []
- // 处理地图移动
- func handleMapMoveCamera(args: [String: Any]?, result: @escaping FlutterResult) {
- guard let args = args, let cameraPosition = ATMapCameraPosition.fromJson(json: args) else {
- result(paramsDecodeError)
- return
- }
-
- let center = CLLocationCoordinate2D(latitude: cameraPosition.latitude, longitude: cameraPosition.longitude)
- let span = MKCoordinateSpan(latitudeDelta: cameraPosition.zoom, longitudeDelta: cameraPosition.zoom)
-
- currentRegion = MKCoordinateRegion(center: center, span: span)
- result(nil)
- }
- // 处理地图添加Marker
- func handleMapAddMarker(args: [String: Any]?, result: @escaping FlutterResult) {
- guard let args = args, let marker = ATMapMarker.fromJson(json: args) else {
- result(paramsDecodeError)
- return
- }
- // 检查是否已存在相同ID的标记,如果有则先移除
- if let index = markers.firstIndex(where: { $0.id == marker.id }) {
- markers.remove(at: index)
- }
-
- markers.append(marker)
- result(nil)
- }
- // 处理地图清除Marker
- func handleMapClearMarkers(result: @escaping FlutterResult) {
- markers = []
- result(nil)
- }
- // 处理地图替换所有Marker
- func handleMapReplaceAllMarkers(args: [String: Any]?, result: @escaping FlutterResult) {
- defer {
- result(nil)
- }
- guard let args = args, let markers = args["markers"] as? [[String: Any]] else {
- result(paramsDecodeError)
- return
- }
- let mapMarkers = markers.compactMap({ ATMapMarker.fromJson(json: $0) })
- self.markers = mapMarkers
- }
- // 处理Marker点击事件
- func handleMarkerTap(marker: inout ATMapMarker) {
- toggleMarkerSelected(marker: &marker)
- methodChannel?.invokeMethod(ChannelMethods.methodMarkerOnTap.rawValue, arguments: marker.toJson())
- }
- // 处理地图添加Polyline
- func handleMapAddPolyline(args: [String: Any]?, result: @escaping FlutterResult) {
- guard let args = args, let pointsArray = args["points"] as? [[String: Any]] else {
- result(paramsDecodeError)
- return
- }
- let coordinates = pointsArray.compactMap({ CLLocationCoordinate2D.fromJson(json: $0) })
- let polyline = ATMapPolyline(points: coordinates)
- polylines.append(polyline)
- result(nil)
- }
- }
- // Propertie Action
- extension MapViewModel {
- func toggleMarkerSelected(marker: inout ATMapMarker) {
- marker.isSelected = !marker.isSelected
- }
- }
|