【问题标题】:How to handle more than one location on the same address and cluster them?如何处理同一地址上的多个位置并将它们聚集在一起?
【发布时间】:2017-12-26 04:36:13
【问题描述】:

我在用 Swift 开发的 iOS 应用程序中使用带有集群的谷歌地图。在谷歌地图上,有一些经纬度相同的标记。当用户放大到集群中只有两个位置的点并在显示标记时再放大一点时,这些标记会出现故障(闪烁)并且它们会迅速相互重叠(一个在另一个上)。

当用户放大时,我该如何完成,并且集群中只有两个具有相同地址和位置的标记,而不是将它们从集群中拆分为标记,以便它们保持集群状态?有没有办法从(在)集群中获取标记谢谢您的回答。

【问题讨论】:

    标签: ios swift google-maps google-maps-api-3


    【解决方案1】:

    Google Maps iOS SDK 的已知行为

    如果您正在创建自定义标记并使用 iconView 属性更改图标的图像,如果坐标完全相同,它将产生闪烁效果。这是 google maps iOS SDK 的已知问题。尝试使用默认标记相反,看看问题是否仍然存在。

    【讨论】:

    • 是的,我正在使用自定义标记,并且正在使用 iconView 属性。好的,那么问题就来了。谢谢你的回答。
    • 我有同样的情况,我已经处理好了。检查我的答案
    【解决方案2】:

    我遇到了同样的问题,为了克服闪烁效果,它对相似的纬度和经度值产生了非常小的变化。

    func checkIfMutlipleCoordinates(latitude : Float , longitude : Float) -> CLLocationCoordinate2D{
    
            var lat = latitude
            var lng = longitude
    
            // arrFilterData is array of model which is giving lat long
    
            let arrTemp = self.arrFilteredData.filter {
    
                return (((latitude == $0.latitute) && (longitude == $0.longitute)))
            }
    
            // arrTemp giving array of objects with similar lat long 
    
            if arrTemp.count > 1{
                // Core Logic giving minor variation to similar lat long
    
                let variation = (randomFloat(min: 0.0, max: 2.0) - 0.5) / 1500
                lat = lat + variation
                lng = lng + variation
            }
            let finalPos = CLLocationCoordinate2D(latitude: CLLocationDegrees(lat), longitude: CLLocationDegrees(lng))
            return  finalPos
        }
    
     func randomFloat(min: Float, max:Float) -> Float {
            return (Float(arc4random()) / 0xFFFFFFFF) * (max - min) + min
        }
    

    只要设置标记位置,只需调用checkIfMutlipleCoordinates

     let position = checkIfMutlipleCoordinates(latitude: yourlatitute!, longitude: yourlongitute!)
    

    【讨论】:

    • 我想到了这种方法,但是由于受功能限制,我无法更改位置。不错的方法。
    • 我们这里没有改变经纬度,只是为了在地图上显示标记提供了一个小的变化。实际数据,即位置将保持不变。我这样做只是为了克服闪烁效果。
    • 是的,我明白了\m/
    • 是的,这是一个很好的方法,但是无论缩放级别如何,我都需要将具有相同纬度和经度的位置显示为一个集群。而不是作为标记。
    • 您需要为此设计自定义布局。只需显示第一个或最后一个标记,点击即可显示集群
    【解决方案3】:

    我最近遇到了在同一纬度和经度上发生多次事件的问题。我认为更改经纬度是一种替代方法,但如果您正在制作一个非常具体的基于位置的应用程序,这可能会违反您的商业模式。

    一个解决方案是有一个类似标注的视图,当您点击标记时,您可以在其中列出您的多个事件。在右上角(最好)保留带有一些徽章编号的标记的自定义图像,并在点击标记时显示标注。

    你可以参考截图。

    如果这个地方发生了多次事件,就像这样。您可以只显示任何发生的事情,然后点击标记,您可以显示其他事件的标注。您可以使用 tableView 或其他东西进行标注。

    希望你有所了解。

    【讨论】:

    • 我已经这样做了,但是当地图放大时,标记仍然闪烁。
    • 即使你放大地图,标记也不会闪烁。你只需要添加一个并且只添加一个iconView 。
    【解决方案4】:

    很抱歉聚会迟到了,但是: 从 SDK 版本 1.4.0(2013 年 7 月)开始,GMSOverlay(哪些 GMSMarker 子类)上有一个名为“zIndex”的属性。

    如文档中所述:

    较高的 zIndex 值覆盖将绘制在较低的 zIndex 之上 值平铺层和叠加层。

    相等的值会导致未定义的绘制顺序。

    闪烁可能是因为两个标记的 zIndex == 0

    无论如何,这对我有用。

    【讨论】:

      【解决方案5】:

      这是一个基于 Arpit Jain 答案扩展 CLLocationCoordinate2D 的 Swift 4 解决方案:

      extension CLLocationCoordinate2D {
          mutating func variateForEqual(coordinates: [CLLocationCoordinate2D]) {
              var variatedLatitude = latitude
              var variatedLongitude = longitude
      
              let filteredPositions = coordinates.filter {
                  $0 == self
              }
      
              if filteredPositions.isNotEmpty {
                  let variation = Double.random(in: -0.01...0.01) / 1500
                  variatedLatitude = latitude + variation
                  variatedLongitude = longitude + variation
              }
      
              self = CLLocationCoordinate2D(latitude: variatedLatitude, longitude: variatedLongitude)
          }
      }
      `
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-17
        • 2018-11-09
        • 2021-10-03
        • 2021-10-31
        • 2022-01-06
        • 1970-01-01
        相关资源
        最近更新 更多