使用集群自定义谷歌地图上的标记

Posted

技术标签:

【中文标题】使用集群自定义谷歌地图上的标记【英文标题】:Customize the marker on google map with clusters 【发布时间】:2017-05-09 09:00:55 【问题描述】:

我在我的应用程序中使用谷歌地图 SDK 并在选定的 let long 上绘制标记并在标记上进行分组我正在使用 GMUClusterManager 在标记上添加集群,但是我面临着更改标记图像的问题,如果我用 GMUClusterManager 绘制标记,则没有选项可以更改标记图像。因此,任何人都知道在用户放大地图时将所有标记分组或更改制造商图像的任何其他方式。

【问题讨论】:

【参考方案1】:

在创建 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【参考方案2】:

在 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
     

【讨论】:

以上是关于使用集群自定义谷歌地图上的标记的主要内容,如果未能解决你的问题,请参考以下文章

swift ios中的自定义谷歌地图标记图标图像

谷歌地图每次都无法在地图上放置一些标记

为当前位置自定义谷歌地图蓝点

如何自定义谷歌地图以接收特定位置的通知

谷歌地图在Chrome上缺少一排瓷砖

带有毕加索的谷歌地图集群项目标记图标