| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- //
- // MapAmapViewAndDataExchange.swift
- // map_amap_ios
- //
- // Created by 诺诺诺的言 on 2025/7/22.
- //
- import Foundation
- import SwiftUI
- import Combine
- import MapKit
- import CoreLocation
- import Flutter
- import MAMapKit
- @available(iOS 13.0, *)
- class MapAmapViewAndDataExchange: NSObject, ObservableObject, MapCapability {
-
- var paramsDecodeError: FlutterError? = FlutterError(code: "InvalidArguments", message: "Invalid arguments", details: nil)
-
- var methodChannel: FlutterMethodChannel?
-
- @Published var currentRegion: MACoordinateRegion?
-
- // 地图Marker
- @Published var markers: [ATMapMarker] = []
-
- // 地图Polyline
- @Published var polylines: [ATMapPolyline] = []
-
- //移动至多个点的位置,并提供设置padding距离
- @Published var suitableLocation: [ATMapPolyline] = []
-
- ///禁用或开启地图所有交互
- @Published var interactionEnabled : String = ""
-
- /// 显示或隐藏地图logo
- @Published var logoVisible : String = ""
-
- // 处理地图移动
- 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 zoome = cameraPosition.zoom / 10000
- let span = MACoordinateSpanMake(zoome, zoome)//MKCoordinateSpan(latitudeDelta: zoome, longitudeDelta: zoome)
- currentRegion = MACoordinateRegion(center: center, span: span);//MKCoordinateRegion(center: center, span: span)
- result(nil)
- }
-
- // 处理地图添加Marker
- func handleMapAddMarker(args: [[String: Any]]?, result: @escaping FlutterResult) {
- guard let args = args, let newMarkers = [ATMapMarker].fromJson(json: args) else {
- result(paramsDecodeError)
- return
- }
-
- var markerDict = Dictionary(uniqueKeysWithValues: self.markers.map { ($0.id, $0) })
-
- for marker in newMarkers {
- if marker.id.isEmpty {
- marker.id = "mine"
- }
- markerDict[marker.id] = marker
- }
- DispatchQueue.main.async{
- self.markers = Array(markerDict.values)
- }
- result(nil)
- }
-
- // 处理地图清除Marker
- func handleMapClearMarkers(result: @escaping FlutterResult) {
- DispatchQueue.main.async{
- self.markers = []
- self.polylines = []
- }
- self.markers = []
- result(nil)
- }
-
- //处理地图所有plolines
- func handleMapClearAllPolyline(result: @escaping FlutterResult) {
- DispatchQueue.main.async{
- self.polylines = []
- }
- result(nil)
- }
-
- // 处理地图替换所有Marker
- func handleMapReplaceAllMarkers(args: [[String: Any]]?, result: @escaping FlutterResult) {
- defer {
- result(nil)
- }
- guard let args = args, let markers = [ATMapMarker].fromJson(json: args) else {
- result(paramsDecodeError)
- return
- }
- DispatchQueue.main.async{
- self.markers = markers
- }
- }
-
- // 处理Marker点击事件
- func handleMarkerTap(marker: inout ATMapMarker) {
- toggleMarkerSelected(marker: &marker)
- methodChannel?.invokeMethod(MapAmapDetailOpetation.methodMarkerOnTap.rawValue, arguments: marker.toJson())
- }
-
- // 处理地图添加Polyline
- func handleMapAddPolyline(args: [String: Any]?, result: @escaping FlutterResult) {
- guard let args = args, let polyline = ATMapPolyline.fromJson(json: args) else {
- result(paramsDecodeError)
- return
- }
-
- DispatchQueue.main.async{
- self.polylines.append(polyline)
- }
-
- result(nil)
- }
-
- ///处理移动至多个点的位置,并提供设置padding距离
- func handleMapMoveToSuitableLocation(args: [String : Any]?, result: @escaping FlutterResult) {
- guard let args = args, let polyline = ATMapPolyline.fromJson(json: args) else {
- result(paramsDecodeError);
- return;
- }
- DispatchQueue.main.async{
- self.suitableLocation.append(polyline)
- }
- result(nil);
- }
-
- ///清除指定标记物
- func handleMapRemovemarker(args: [String : Any]?, result: @escaping FlutterResult) {
- var fixArge : [String : Any] = args ?? [String : Any]()
- fixArge["id"] = "0"
- defer {
- result(nil)
- }
- guard let markerItem = ATMapMarker.fromJson(json: fixArge) else {
- result(paramsDecodeError)
- return
- }
- // 使用标识符找到要移除的标记物并从数组中删除
-
- DispatchQueue.main.async{
- if let index = self.markers.firstIndex(where: { $0.id == markerItem.markerId }) {
- self.markers.remove(at: index)
- }
- }
- }
-
- ///清除制定的线
- func handleMapRemovePolyline(args: [String : Any]?, result: @escaping FlutterResult) {
- guard let args = args, let polyline = ATMapPolyline.fromJson(json: args) else {
- result(paramsDecodeError)
- return
- }
- DispatchQueue.main.async {
- if let index = self.polylines.firstIndex(where: { $0.lineId == polyline.lineId }) {
- var changeArray : [ATMapPolyline] = []
- for itemPoly in self.polylines {
- changeArray.append(itemPoly)
- }
- changeArray.remove(at: index)
- self.polylines = changeArray
- //self.polylines.remove(at: index)
- }
- }
- result(nil)
- }
-
- ///禁用或开启地图所有交互
- func handleMapInteractionEnabled(args: [String: Any]?, result: @escaping FlutterResult) {
- if let enabled = args?["enabled"] {
- DispatchQueue.main.async{
- self.interactionEnabled = "\(enabled)";
- }
- }
- result(nil)
- }
-
- ///显示或隐藏地图logo
- func handleMapLogoVisible(args: [String : Any]?, result: @escaping FlutterResult) {
- if let visible = args?["visible"] {
- DispatchQueue.main.async{
- self.logoVisible = "\(visible)";
- }
- }
- result(nil)
- }
- }
- // Propertie Action
- @available(iOS 13.0, *)
- extension MapAmapViewAndDataExchange {
- func toggleMarkerSelected(marker: inout ATMapMarker) {
- marker.isSelected = !marker.isSelected
- }
- }
|