如何在 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 更新标记在谷歌地图中的位置?