Jelajahi Sumber

add:添加iOS地图的移动至多个点的位置,并提供设置padding距离功能。

“HeShaoZe” 4 bulan lalu
induk
melakukan
fb8e6e7b82

+ 59 - 0
plugins/map_mapkit_ios/ios/Classes/MapView/Extension/MapKit+E.swift

@@ -65,4 +65,63 @@ extension MKMapView {
             completion(shot)
         }
     }
+    
+    ///移动至多个点的位置,并提供设置padding距离
+    func moveToSuitableLocation(points: [CLLocationCoordinate2D], padding: ATMapPadding? = nil) {
+        // 检查是否有足够的点
+        guard points.count > 0 else {
+            print("Error: No points provided to calculate suitable location")
+            return
+        }
+        
+        // 1. 计算所有点的边界
+        var minLat = points[0].latitude
+        var maxLat = points[0].latitude
+        var minLng = points[0].longitude
+        var maxLng = points[0].longitude
+        
+        for point in points {
+            minLat = min(minLat, point.latitude)
+            maxLat = max(maxLat, point.latitude)
+            minLng = min(minLng, point.longitude)
+            maxLng = max(maxLng, point.longitude)
+        }
+        
+        // 2. 创建包含所有点的区域
+        let centerLat = (minLat + maxLat) / 2
+        let centerLng = (minLng + maxLng) / 2
+        let center = CLLocationCoordinate2D(latitude: centerLat, longitude: centerLng)
+        
+        // 计算区域跨度,添加一些额外空间
+        let spanLat = (maxLat - minLat) * 1.1  // 增加10%的边距
+        let spanLng = (maxLng - minLng) * 1.1
+        
+        // 确保跨度不为0
+        let span = MKCoordinateSpan(
+            latitudeDelta: max(spanLat, 0.001),  // 设置最小跨度,避免点过于集中时视图缩放过度
+            longitudeDelta: max(spanLng, 0.001)
+        )
+        
+        // 3. 创建区域并应用padding
+        var region = MKCoordinateRegion(center: center, span: span)
+        
+        // 应用padding(如果有)
+        if let padding = padding {
+            // 计算padding对应的经纬度差值
+            let mapViewWidth = self.bounds.width
+            let mapViewHeight = self.bounds.height
+            
+            // 基于地图视图尺寸和padding计算经纬度调整量
+            let latPadding = span.latitudeDelta * (padding.top + padding.bottom) / mapViewHeight
+            let lngPadding = span.longitudeDelta * (padding.left + padding.right) / mapViewWidth
+            
+            // 调整区域跨度以应用padding
+            region.span.latitudeDelta += latPadding
+            region.span.longitudeDelta += lngPadding
+        }
+        
+        // 4. 设置地图区域
+        // 使用animate参数控制是否动画过渡
+        self.setRegion(self.regionThatFits(region), animated: true)
+    }
 }

+ 12 - 0
plugins/map_mapkit_ios/ios/Classes/MapView/MapViewController.swift

@@ -83,6 +83,18 @@ class MapViewController: UIViewController {
                 }
             }
             .store(in: &cancellables)
+        
+        //移动至多个点的位置,并提供设置padding距离
+        viewModel.$suitableLocation
+            .receive(on: DispatchQueue.main)
+            .sink{ [weak self] polylines in
+                if let padding = polylines.last?.mapPadding {
+                    if let atMapPoint : [CLLocationCoordinate2D] = polylines.last?.points {
+                        self?.mapView.moveToSuitableLocation(points: atMapPoint, padding: padding)
+                    }
+                }
+            }
+            .store(in: &cancellables)
     }
 }
 

+ 1 - 0
plugins/map_mapkit_ios/ios/Classes/MapView/Model/ChannelMethods.swift

@@ -16,6 +16,7 @@ enum ChannelMethods: String, CaseIterable {
     case methodMapMoveCamera = "map#moveCamera"
     case methodMapAnimateCamera = "map#animateCamera" 
     case methodMapClear = "map#clear"
+    case methodMapMoveToSuitableLocation = "map#moveToSuitableLocation"
     
     // 标记物相关方法名称
     case methodUpdateOrAddMarkers = "marker#updateOrAddMarkers"

+ 5 - 0
plugins/map_mapkit_ios/ios/Classes/MapView/Model/MapProtocol.swift

@@ -40,6 +40,9 @@ protocol MapCapability {
     func handleMarkerTap(marker: inout ATMapMarker)
 
     func handleMethodCall(_ call: FlutterMethodCall, result: @escaping FlutterResult)
+    
+    // 处理移动至多个点的位置,并提供设置padding距离
+    func handleMapMoveToSuitableLocation(args: [String: Any]?, result: @escaping FlutterResult)
 }
 
 extension MapCapability {
@@ -60,6 +63,8 @@ extension MapCapability {
             handleMapReplaceAllMarkers(args: call.arguments as? [[String: Any]], result: result)
         case .methodAddPolyline:
             handleMapAddPolyline(args: call.arguments as? [String: Any], result: result)
+        case .methodMapMoveToSuitableLocation:
+            handleMapMoveToSuitableLocation(args: call.arguments as? [String: Any], result: result)
         default:
             result(FlutterMethodNotImplemented)
         }

+ 1 - 0
plugins/map_mapkit_ios/ios/Classes/MapView/Model/MapViewChannelMethod.swift

@@ -17,6 +17,7 @@ enum MapViewChannelMethod: String, CaseIterable {
     case methodUpdateOrAddMarkers = "marker#updateOrAddMarkers"
     case methodReplaceAllMarkers = "marker#replaceAllMarkers"
     case methodMarkerOnTap = "marker#onTap"
+    case methodMapMoveToSuitableLocation = "map#moveToSuitableLocation"
     
     // 轨迹纠偏
     case methodQueryProcessedTrace = "trace#queryProcessedTrace"

+ 15 - 1
plugins/map_mapkit_ios/ios/Classes/MapView/ViewModel/MapViewModel.swift

@@ -26,6 +26,8 @@ class MapViewModel: NSObject, ObservableObject, MapCapability {
     // 地图Polyline
     @Published var polylines: [ATMapPolyline] = []
 
+    //移动至多个点的位置,并提供设置padding距离
+    @Published var suitableLocation: [ATMapPolyline] = []
 
     // 处理地图移动
     func handleMapMoveCamera(args: [String: Any]?, result: @escaping FlutterResult) {
@@ -94,7 +96,19 @@ class MapViewModel: NSObject, ObservableObject, MapCapability {
 
         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;
+        }
+        
+        suitableLocation.append(polyline)
+        print("argssfsfdsdfs--AK-\(args ?? [String: Any]())----\(suitableLocation)")
+        result(nil);
+    }
+}
 
 // Propertie Action
 extension MapViewModel {