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