如何在 SwiftUI 中集群 Google 地图标记?

问题描述 投票:0回答:0

如何在 SwiftUI 中聚类 Google 地图标记? 我尝试了一些代码,但是它不起作用。

func makeUIView(context: Context) -> GMSMapView {
let camera = GMSCameraPosition.camera(withLatitude: 37.7749, longitude: -122.4194, zoom: 12.0)
let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)

        // Set up the cluster manager with the supplied icon generator and renderer.
        let iconGenerator = GMUDefaultClusterIconGenerator()
        let algorithm = GMUNonHierarchicalDistanceBasedAlgorithm()
        let renderer = GMUDefaultClusterRenderer(mapView: mapView, clusterIconGenerator: iconGenerator)
        let clusterManager = GMUClusterManager(map: mapView, algorithm: algorithm, renderer: renderer)
        
        // Register self to listen to GMSMapViewDelegate events.
        mapView.delegate = context.coordinator
        clusterManager.setDelegate(nil, mapDelegate: mapView.delegate)
        mapView.settings.compassButton = true
        mapView.settings.myLocationButton = true
        generateClusterItems(clusterManager: clusterManager, mapView: mapView)
        clusterManager.cluster()
        return mapView
       }

    private func generateClusterItems(clusterManager: GMUClusterManager, mapView: GMSMapView) {
        let extent = 0.2
        for index in 1...4 {
            let lat = 34.442083 + extent * randomScale()
            let lng = 129.152915 + extent * randomScale()
            let name = "Item \(index)"
            let item =  POIItem(position: CLLocationCoordinate2DMake(lat, lng), name: name)
            if (clusterManager == nil) {
                print("cluster add - nil generate")
            } else {
                print("cluster not null")

            let pos = CLLocationCoordinate2D(latitude: lat, longitude: lng)
            let marker = GMSMarker(position: pos)
            marker.map = mapView
            clusterManager.add(marker)

            }
        }
        clusterManager.cluster()
    }
    
    private func randomScale() -> Double {
        return Double(arc4random()) / Double(UINT32_MAX) * 2.0 - 1.0
    }
    
    func updateUIView(_ view: GMSMapView, context: Context) {
        // No-op
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator()
    }
    
    class Coordinator: NSObject, GMSMapViewDelegate, GMUClusterManagerDelegate {
        func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {
            if let item = marker.userData as? POIItem {
                print("Did tap marker for cluster item \(item.name)")
            } else {
                print("Did tap a normal marker")
            }
            return false
        }
    }
}

我期待那组标记会聚集在一起。看到一些针对 UIKit 的解决方案 (https://github.com/googlemaps/google-maps-ios-utils/tree/master/samples/SwiftDemoApp),但我需要 SwiftUI。 我是 Swift 和 iOS 开发的新手。

ios google-maps swiftui google-maps-markers mobile-development
© www.soinside.com 2019 - 2024. All rights reserved.