在写lbs相关的app时,肯定会在地图上标记一些坐标点,有时候也需要根据需求来改变标记的外观,这篇文章就是记录了我使用高德地图sdk的添加自定义样式点标记时遇到的问题以及解决方法。我使用的开发语言是swift。

我的需求是要在一个地图页面上动态标记从网络获取的点,并且动态生成点标记的样式。简单的说就是在地图上戳的点的图标是我从网络动态获取的图标

我看了高德开放平台的教程,无论是添加自定义样式点标记还是添加自定义AnnotationView都没有办法满足我的需求,因为这两种办法都需要提前导入图片,也就是提前把图片放入Assets文件夹里。
高德开放平台的教程:
添加自定义样式点标记
添加自定义AnnotationView

于是乎我是这样解决的:
先定义几个全局数组用于存放我所需要的从网络获取的点标记外观样式等信息,你也可以使用字典等其他数据类型,为了方便我使用普通一维数组。然后我发现:每次调用标注代理方法的时候,这些全局数组的最后一个元素就是我所需要的数据!!不信你可以在代理方法里打印一下 。友情提示:数组的最后一个元素的获取方法是 .last。
代码大概如下:

import UIKit
import Alamofire
import SwiftyJSON
import SVProgressHUD
class AnnotationViewController: UIViewController,UINavigationControllerDelegate{
    /// 高德地图view
    var mapView = MAMapView()
    /// 主storyboard
    let storyBoard = UIStoryboard(name: "Main", bundle: nil)
    /// 点标记坐标数组
    var annotationLocations = [CLLocation]()
    /// 点标记名称数组
    var annotationNames = [String]()
    /// 点标记图标url
    var logoURLs = [NSURL]()   
    /// 点标记图标
    var logos = [UIImage]() 
    override func viewDidLoad() {
        super.viewDidLoad()
        /// 初始化地图view,这个方法的代码实现在这篇文章里已省略!需自行添加。
        initMapView()
        /// 初始化点标记view
        initAnnotationView()
    }  
    // MARK: - 初始化点标记view
    func initAnnotationView(){
	    /// 一定要记得这一步,否则无法正常生效 
        mapView.delegate = self
        /// 进行网络请求,这里以json为例
        Alamofire.request(.GET, requestURL, parameters: parameters)
        .responseJSON{ 
            response in
            /// 解析数据  
            var responseData = JSON(data: response.data!)        
            var datas = responseData["data"]
            /// 遍历数据
            for i in 0..<(datas.count){
                /// 获取图标url并将图标url追加到logoURLs数组
                let logoURLString = datas[i]["logoUrl"].stringValue
                let logoURL = NSURL(string: logoURLString)
                self.logoURLs.append(logoURL!)
                /// 获取图标并将图标追加到logos数组
                let logoData = NSData(contentsOf: logoURL as! URL)
                let logo = UIImage(data: logoData as! Data)
                self.logos.append(logo!)
                /// 戳点
                let annotationPoint = MAPointAnnotation()
                /// 添加点标记的坐标和标题
                annotationPoint.coordinate = self.annotationLocations[i].coordinate
                annotationPoint.title = self.annotationNames[i]        
                self.mapView.addAnnotation(annotationPoint)         
            }
        }   
    }  
}
// MARK: - MAMapViewDelegate代理方法
extension BWExpressViewController: MAMapViewDelegate{
    // MARK: - 标注代理方法
    func mapView(_ mapView: MAMapView!, viewFor annotation: MAAnnotation!) -> MAAnnotationView! {
        if annotation.isKind(of: MAPointAnnotation.self){
            let annotationIdentifier = "locationIentifier"
            var poiAnnotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier) as? MAPinAnnotationView
            if poiAnnotationView == nil{
                poiAnnotationView = MAPinAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier)
            }
            /// logos最后一个元素就是每次戳点所对应的图标
            poiAnnotationView!.image = logos.last
            poiAnnotationView!.animatesDrop = false
            poiAnnotationView!.canShowCallout = true
            return poiAnnotationView
        }
        return nil
    } 
}


后来仔细想想也是,每次调用代理方法的时候,就会往数组追加一下然后马上戳点,那么数组最新一个元素理所当然是该点的属性啦~