Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 仅堆叠具有相同位置的标记_Swift_Firebase_Google Cloud Firestore - Fatal编程技术网

Swift 仅堆叠具有相同位置的标记

Swift 仅堆叠具有相同位置的标记,swift,firebase,google-cloud-firestore,Swift,Firebase,Google Cloud Firestore,谷歌地图的聚类工具根据缩放级别对所有标记进行聚类 我试图(仅)将具有相同位置的标记堆叠在一起。 然后按segue键并将信息数组传递到tableview中。可能的解决方案是什么 最好的解决方案是在将重复坐标添加到地图之前将其合并到单个标记上吗?或者尝试以某种方式使用谷歌地图聚类工具 当前代码: 创建的数组 var events = [CreatedEvent]() 检索自定义标记(单个) 任何帮助都将不胜感激。只有当有多个标记时,聚类机制才有用,但这里只有一个标记。这是因为在同一位置添加多个标记

谷歌地图的聚类工具根据缩放级别对所有标记进行聚类

我试图(仅)将具有相同位置的标记堆叠在一起。 然后按segue键并将信息数组传递到tableview中。可能的解决方案是什么

最好的解决方案是在将重复坐标添加到地图之前将其合并到单个标记上吗?或者尝试以某种方式使用谷歌地图聚类工具

当前代码:

创建的数组

var events = [CreatedEvent]()
检索自定义标记(单个)


任何帮助都将不胜感激。

只有当有多个标记时,聚类机制才有用,但这里只有一个标记。这是因为在同一位置添加多个标记没有意义,因为这是浪费,如果标记可以点击,那么只有最后添加的标记可以产生动作

考虑保留标记索引,并依赖它而不是地图本身。始终将标记添加到索引中,但仅将它们添加到地图中没有标记的位置。然后,当点击一个标记时,转到索引,如果那里只有一个标记,则将用户推到该细节,如果那里有多个标记,则向用户显示这些标记的列表,供其选择。以下是您可以在操场上运行的内容(否则将
NSObject
更改为
GeoPoint
,使其成为适当的子类):


此机制还允许我们向地图添加不同的外观标记,以表示哪些标记表示堆叠标记,哪些不表示堆叠标记。

谢谢。我想这就是我要找的。我明天有时间就去试试。
weak var createdevent:CreatedEvent?

func createNewMarker(firebasePath: CollectionReference) {
        
        let Eventref = firebasePath
            Eventref.getDocuments() { (querySnapshot, err) in
                
                if err == nil && querySnapshot != nil {
                    var tempEvent = [CreatedEvent]()
                    if querySnapshot!.documents.count > 0 {
                        self.mapIsEmpty = false
                        for document in querySnapshot!.documents {
                            
                            let data = document.data()
                            let author = data["author"] as? [String:AnyObject]
                            let uid = author!["uid"] as? String
                            let username = author!["username"] as? String
                            let photoURL = author!["photoURL"] as? String
                            let url = URL(string:photoURL!)
                            let eventname = data["eventname"] as? String
                        
                            let userProfile = UserProfile(uid: uid!, username: username!, photoURL: url!)
                            let createdevent = CreatedEvent(eventid: document.documentID, author: userProfile, eventname: eventanme)
                            
                            let marker = GMSMarker()
                            self.createdevent = createdevent
                            
                            if let dict = UserDefaults.standard.object(forKey: "ImageCache") as? [String:String] {
                                if let path = dict[createdevent.eventphotoURL.absoluteString] {
                                    if let data = try? Data(contentsOf: URL(fileURLWithPath: path)) {

                                        let imageA1 = UIImage(data: data)
                                        let customMarker = CustomMarkerView(frame: CGRect(x: 0, y: 0, width: self.customMarkerWidth, height: self.customMarkerHeight), image: imageA1!)
                                        marker.iconView = customMarker
                                        marker.userData = createdevent
                                    
                                    }
                                }
                            }
   
                            marker.position = CLLocationCoordinate2D(latitude: eventlatitude, longitude: eventlongitude)
                            marker.map = self.myMapView
                            
                            tempEvent.append(createdevent)
                        }
                    }
                    else {
        
                        print("no data")
                    }
                    self.events = tempEvent
                }
        }
    }
/* A GeoPoint is an NSObject with 2 properties (lat and lon).
 We can subclass it to add an identifer which will give
 us a string key for our index (a concatenation of lat and lon). */
class GPoint: NSObject {
    let identifier: String
    let latitude: Double
    let longitude: Double
    
    init(latitude: Double, longitude: Double) {
        self.latitude = latitude
        self.longitude = longitude
        identifier = "\(latitude)\(longitude)"
    }
}

// This represents the marker that is added to the map
struct Marker {
    let identifier: String
    let geoPoint: GPoint
}

// This represents the marker index
var mapMarkers = [String: [Marker]]()

func addMarkerToMap(_ marker: Marker) {
    let geoId = marker.geoPoint.identifier // get the marker's “location”
    
    if mapMarkers.contains(where: { $0.key == geoId }) {
        print("add to index")
        mapMarkers[geoId]?.append(marker) // a marker exists here only add marker to index
    } else {
        print("add to map and index")
        mapMarkers[geoId] = [marker] // no marker here yet, add to map and index
    }
}

let marker1 = Marker(identifier: "abc123", geoPoint: GPoint(latitude: -118.1, longitude: 33.3))
let marker2 = Marker(identifier: "mno789", geoPoint: GPoint(latitude: -117.0, longitude: 34.8))
let marker3 = Marker(identifier: "xyz456", geoPoint: GPoint(latitude: -118.1, longitude: 33.3))

addMarkerToMap(marker1)
addMarkerToMap(marker2)
addMarkerToMap(marker3)
print(mapMarkers)