如何在 swift/iOS 中更新谷歌地图标记位置

Posted

技术标签:

【中文标题】如何在 swift/iOS 中更新谷歌地图标记位置【英文标题】:How to update Google Maps marker position in swift/iOS 【发布时间】:2016-01-04 15:36:35 【问题描述】:

我想要多个标记并根据来自服务器的新数据更新它们的位置。这就是我在地图上显示标记的方式(基本内容):

func showMarkerOnMap() 
    mapView.clear() //<- That's GMSMapView
    for all in dataFromServer 
        let lat5 = all.latitude
        let lon5 = all.longitude
        let position = CLLocationCoordinate2DMake(lat5, lon5)
        let marker = GMSMarker(position: position)
        marker.flat = true
        marker.map = self.mapView
    

这就是我使用 Alamofire 获得 dataFromServer 的方式:

var dataFromServer = [dataClass]()
func getCoordinatesFromServer()

    //Here goes headers and authentication data

    Alamofire.request(.GET, URL, headers: headers).authenticate(user: oranges, password: appels).responseJSON  response in
        switch response.result 
        case .Success:
            //Remove existing dataFromServer
            self.dataFromServer.removeAll()

            if let value = response.result.value 
                let json = JSON(value)

                for result in json.arrayValue 
                    let lat = result["latitude"].doubleValue
                    let lon = result["longitude"].doubleValue

                    let zip = dataClass(latitude: lat, longitude: lon)
                    //The next part is for checking that coordinates do not overlap
                    if self.dataFromServer.count < 1 
                        self.dataFromServer.append(zip)     
                     else 
                        for all in self.dataFromServer 
                            guard all.latitude != lat else 
                                    return
                                
                                self.trblInfo1.append(zip)
                            
                    
                
                //This should update existing markers?
                self.showMarkerOnMap()
            
        case .Failure(let error):
            print(error)
        
    

基本上我只是将所有接收到的数据附加到属于dataClass 类的dataFromServer

class dataClass: NSObject 
var latitude: Double
var longitude: Double

init(latitude: Double, longitude: Double) 
    self.latitude = latitude
    self.longitude = longitude       
  

我的getCoordinatesFromServer() 函数每 3 秒调用一次(目前)。我期望收到新坐标(我确实收到了),然后应该调用showMarkerOnMap(),从而清除所有现有标记并创建新闻。我得到的 - 标记重复和明显的滞后。如果转到另一个视图,然后返回到包含 mapView 的视图,则原始标记会消失。

关于如何改进我的代码或其他替代方法的任何建议?

【问题讨论】:

【参考方案1】:

如果您有任何来自服务器的位置的唯一标识符,您可以保留一个标记列表,然后在新数据到达时更新它们的位置。像这样的:

for result in json.arrayValue 

     let lat = result["latitude"].doubleValue
     let lon = result["longitude"].doubleValue

     let identifier = result["identifier"] as! String
     self.myMarkersDictionary[identifier]?.position.latitude = lat
     self.myMarkersDictionary[identifier]?.position.longitude = lon
     ...    

【讨论】:

这听起来不错,我确实有一个自定义标识符,但我不知道如何在字典中存储标记?该怎么做? 我应该像这样创建标记字典:var myMarkersDictionary = [String:GMSMarker]() 就是这样。当您想删除标记时,只需将 .map 属性设置为 null。 @WillGlück.. 这里是“标识符”。我在服务器中只得到纬度和经度 这只是一个例子。要使用此解决方案,您需要有任何方法使用您接收的服务器数据来识别标记。使用某种标识符,您可以更新保存在字典中的先前标记或创建一个新标记。

以上是关于如何在 swift/iOS 中更新谷歌地图标记位置的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何使用 Getx Obx 更新标记在谷歌地图中的位置?

如何在 Android Studio 中删除谷歌地图上多个更新位置的旧标记?

新标记已更新其位置,但旧标记未在离子原生谷歌地图中删除

在不加载整个地图的情况下更新谷歌地图中的标记

如何在谷歌地图中平滑移动当前位置?

如何:从谷歌地图上的 JSON 动态更新标记