我在Swift开发的iOS应用程序中使用谷歌地图和群集。在谷歌地图上有一些具有相同纬度和经度的标记。当用户放大到群集中只有两个位置的点并且在显示标记时稍微缩放一点时,这些标记会出现闪烁(闪烁)并且它们彼此快速叠加(一个在另一个上)。
如何在用户放大时完成,并且群集中只有两个标记具有相同的地址和位置,以便不将它们从群集中分割为标记,以便它们保持群集状态?有没有办法从群集中获取标记谢谢您的答案。
答案 0 :(得分:10)
我遇到了同样的问题,为了克服闪光效应,它给出了相似的纬度和经度值的微小变化。
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!)
答案 1 :(得分:2)
我最近遇到过同一纬度和经度的多重事件。我认为在纬度和经度上改变次要是另一种选择,但如果您正在制作一个非常具体的基于位置的应用程序,这可能会违反您的商业模式。
一种解决方案是使用类似视图的标注,您可以在点击标记时列出多个事件。保留标记的自定义图像,右上角有一些徽章编号(最好),点击标记后会显示标注。
您可以参考屏幕截图。
如果这个地方有多个事件发生这种情况。您可以只显示任何一个发生,然后点击标记,您可以显示其他事件的标注。您可以使用tableView或其他东西进行标注。
希望你有所了解。
答案 2 :(得分:2)
很抱歉参加聚会迟到,但: 从SDK版本1.4.0(2013年7月)开始,GMSOverlay(其中的GMSMarker子类)上有一个名为“ zIndex”的属性。
如文档所述:
较高的zIndex值叠加层将绘制在较低的zIndex顶部 值图块的图层和叠加层。
相等的值导致未定义的绘制顺序。
闪烁可能是因为两个标记的zIndex == 0
无论如何,这对我有用。
答案 3 :(得分:1)
Google Maps iOS SDK的已知行为
如果您正在创建自定义标记并使用iconView属性更改图标的图像,则如果坐标完全相同,则会产生闪烁效果。这是谷歌地图iOS SDK的已知问题。请尝试使用默认标记& #39;而是查看问题是否仍然存在。
答案 4 :(得分:0)
下面的延伸的一个CLLocationCoordinate2D夫特4溶液基于Arpit耆那答案:
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)
}
}
`