使用聚合功能自定义Google地图上的标记

3
我在我的应用程序中使用谷歌地图SDK,并在选定的经纬度上标记标记。为了在标记上添加群组,我使用GMUClusterManager,在标记上绘制标记。但是,我面临一个问题,那就是如果我使用GMUClusterManager绘制一个标记,那么没有更改标记图像的选项。因此,有没有人知道其他方法来使用户在缩放地图时将所有标记分组,或者更改制造商的图像。
2个回答

13

创建GMUDefaultClusterRenderer后,设置它的委托。我使用了我正在工作的视图控制器,然后实现了GMUClusterRendererDelegate

let iconGenerator = GMUDefaultClusterIconGenerator()
let algorithm = GMUNonHierarchicalDistanceBasedAlgorithm()
let renderer = GMUDefaultClusterRenderer(mapView: mapView, clusterIconGenerator: iconGenerator)
renderer.delegate = self
clusterManager = GMUClusterManager(map: mapView, algorithm: algorithm, renderer: renderer)

接下来,您需要实现从协议中的func renderer(_ renderer: GMUClusterRenderer, willRenderMarker marker: GMSMarker)方法。此方法使您可以访问标记和标记中包含的数据。 使用If let语句访问数据并为标记提供所需的iconView:if let markerData = marker.userData


太棒了!记得稍后将其标记为答案 @Chetansharma - DatForis

1

适用于Swift 5

class POIItem: NSObject, GMUClusterItem {
  var position: CLLocationCoordinate2D
  var name: String!
  var icon: UIImage

  init(position: CLLocationCoordinate2D, name: String, icon: UIImage) {
    self.position = position
    self.name = name
    self.icon = icon
  }
}

class PrincipalViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.google_map.clear()

        let iconGenerator = GMUDefaultClusterIconGenerator()
        let algorithm = GMUNonHierarchicalDistanceBasedAlgorithm()
        let renderer = GMUDefaultClusterRenderer(mapView: self.google_map, clusterIconGenerator: iconGenerator)
        renderer.delegate = self
        self.clusterManager = GMUClusterManager(map: self.google_map, algorithm: algorithm, renderer: renderer)
        self.clusterManager.setDelegate(self, mapDelegate: self)


        //insert your markers type POIItem
        //self.clusterManager.add(item)

        self.clusterManager.cluster()
    }

}

extension PrincipalViewController: GMUClusterRendererDelegate {
    func renderer(_ renderer: GMUClusterRenderer, markerFor object: Any) -> GMSMarker? {
        switch object {
        case let item as POIItem:

            let marker = GMSMarker()

            marker.position = item.position
            marker.icon = UIImage(named: "your_custom_marker")

            return marker
        case let staticCluster as GMUStaticCluster:

            let marker = GMSMarker()

            marker.position = staticCluster.position
            marker.icon = UIImage(named: "your_gruped_custom_marker")

            return marker
        default:
            return nil
        }
    }
}

extension PrincipalViewController: GMUClusterManagerDelegate {
    func clusterManager(_ clusterManager: GMUClusterManager, didTap clusterItem: GMUClusterItem) -> Bool {
        print("didTap clusterItem")
        return true
    }

    func clusterManager(_ clusterManager: GMUClusterManager, didTap cluster: GMUCluster) -> Bool {
        print("didTap cluster")
        return true
     }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接