近期、根据公司的业务需求、需要对获取的地理位置信息进行标注以及简单的线路规划!在此分享一下这几天的心得与体会
1、关于高德地图添加标注点的问题
地图标注点是地图上的一种遮盖层,我们可以通过高德地图提供的借口添加一个标注点和多个标注点、
添加一个标注点
首先我们通过获取到的经纬度坐标信息去创建遮盖层MAPointAnnotation的实例,之后通过地图类添加到地图上
如下:
let pointAnnotation:MAPointAnnotation! = MAPointAnnotation()
pointAnnotation.coordinate = locationCoordinate
pointAnnotation.title = locationDic["title"] as! String
mapView.addAnnotation(pointAnnotation)
添加多个标注点和添加一个基本一样,调用的方法是mapView.addAnnotations(遮盖层数组)
接着、地图通过调用func mapView(_ mapView: MAMapView!, viewFor annotation: MAAnnotation!) -> MAAnnotationView! 的代理方法去添加遮盖层到地图上
例如:
func mapView(_ mapView: MAMapView!, viewFor annotation: MAAnnotation!) -> MAAnnotationView! {
// 用户
if annotation is MAUserLocation {
let userReuseIndetifier:String = "userReuseIndetifier"
let annotationView = MAAnnotationView.init(annotation: annotation, reuseIdentifier: userReuseIndetifier)
annotationView!.image = UIImage(named: "userPosition")
self.userLocationAnnotationView = annotationView
return annotationView
} else if annotation is MAPointAnnotation {
// 标注点
let customReuseIndetifier: String = "customReuseIndetifier"
var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: customReuseIndetifier)
if annotationView == nil {
annotationView = MAAnnotationView.init(annotation: annotation, reuseIdentifier: customReuseIndetifier)
}
annotationView?.image = UIImage(named: "point")
annotationView?.canShowCallout = true
annotationView?.isDraggable = true
/*rightbutton*/
let rightBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 45, height: 45))
rightBtn.setImage(UIImage(named: "arrow_right"), for: .normal)
annotationView?.rightCalloutAccessoryView = rightBtn
rightBtn.addTarget(self, action: #selector(clickRightButton), for: .touchDragInside)
return annotationView
}
return nil
}
@objc func clickRightButton() -> Void {
let naviMapVC:NaviMapViewController = NaviMapViewController()
naviMapVC.startPoint = self.startPoint
naviMapVC.endPoint = self.endPoint
self.navigationController?.pushViewController(naviMapVC, animated: true)
}
2、关于用户位置的精确圈问题、
用户的精确圈有的时候我们是不需要的,又不能进行隐藏,我们可以通过自定义精确圈的方法去隐藏精确圈、首先要做的是我们去声明地图允许自定义精度圈,也就是地图的customizeUserLocationAccuracyCircleRepresentation属性,紧接着地图就会回调func mapView(_ mapView: MAMapView!, rendererFor overlay: MAOverlay!) -> MAOverlayRenderer!代理方法
例如:
func mapView(_ mapView: MAMapView!, rendererFor overlay: MAOverlay!) -> MAOverlayRenderer! {
if overlay.isEqual(mapView.userLocationAccuracyCircle) {
let circleRender = MACircleRenderer.init(circle:mapView.userLocationAccuracyCircle)
circleRender?.lineWidth = 2.0
circleRender?.strokeColor = UIColor.clear
circleRender?.fillColor = UIColor.clear
return circleRender
} else {
return nil
}
}
3、线路规划与搜索
线路的规划与搜索的核心类是AMapSearchAPI 与AMapDrivingRouteSearchRequest(驾车线路搜索)类,通过对起始点与终点的坐标进行路径所搜与规划
例如:驾驶路线搜索
func searchDrivingRoute(startPoint:CLLocationCoordinate2D,endPoint:CLLocationCoordinate2D) -> Void {
let naviRequest:AMapDrivingRouteSearchRequest = AMapDrivingRouteSearchRequest.init()
naviRequest.requireExtension = true
naviRequest.strategy = 10
naviRequest.origin = AMapGeoPoint.location(withLatitude: CGFloat(startPoint.latitude), longitude: CGFloat(startPoint.longitude))
naviRequest.destination = AMapGeoPoint.location(withLatitude: CGFloat(endPoint.latitude), longitude: CGFloat(endPoint.longitude))
self.searchApi.aMapDrivingRouteSearch(naviRequest)
}
搜索类的代理回调方法
func onRouteSearchDone(_ request: AMapRouteSearchBaseRequest!, response: AMapRouteSearchResponse!) {
if response == nil {
return
}
if response.count > 0 && self.delegate != nil{
/*搜索的结果进行处理*/
}
}
搜索结果处理分为公交与非公交的类别、非公交的相对来说简单、以下是处理非公交路线的代码
例如:
/*对线路数组的处理,主要是得到经纬度数组*/
public func getPolylineArray(steps:Array<AMapStep>) -> Array<Any> {
var polyLinesArray:Array<Any> = Array()
for step in steps {
let polyline = step.polyline
let array = getCoodinats(polyLine: polyline!)
polyLinesArray += array
}
return polyLinesArray
}
// 把经纬度字符串转化成经纬度数组
private func getCoodinats(polyLine:String) -> Array<Any> {
let array:Array<Any> = polyLine.components(separatedBy: ";")
return array
}
// 经纬度数组生成线路遮盖层
public func getMAPolylineArray(array:Array<Any>) -> Array<MAPolyline> {
var coodArray:Array<CLLocationCoordinate2D> = Array()
for coordStr in array {
let swapStr = coordStr as! String
let coordinateArray = swapStr.components(separatedBy: ",")
let latitude: String = coordinateArray.last!
let longitude: String = coordinateArray.first!
let coodinate: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: Double(latitude)!, longitude: Double(longitude)!)
coodArray.append(coodinate)
}
let polyline:MAPolyline = MAPolyline(coordinates: &coodArray, count: UInt(coodArray.count))
return [polyline]
}
/*通过地图的回调方法添加线路涂层到地图上*/
func getResoult(_ request: AMapRouteSearchBaseRequest!, response: AMapRouteSearchResponse!) {
if response.route != nil {
if response.count > 0 {
// 移除原有的地图上的线路涂层
mapView.removeOverlays(linesArray)
linesArray = nil
// 选取一条线路规划结果
let steps = response.route.paths[0].steps
let array = self.mapManager.getPolylineArray(steps: steps!)
// 获取路径规划涂层数组
linesArray = self.mapManager.getMAPolylineArray(array: array)
// 添加到地图上进行显示
mapView.addOverlays(linesArray)
}
}
}