高德地图的一些使用分享

近期、根据公司的业务需求、需要对获取的地理位置信息进行标注以及简单的线路规划!在此分享一下这几天的心得与体会

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 asString

            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)

            }

        }

    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于高德地图的Pokémon Go开发可提供更丰富和实际的游戏体验。Pokémon Go是一款增强现实游戏,结合了现实世界和虚拟世界。高德地图提供了强大的地理信息服务,可以作为Pokémon Go的核心组件,从而提升其游戏体验。 首先,基于高德地图的Pokémon Go可以更精确地定位和展示游戏中的Pokémon。通过高德地图的定位功能,玩家可以在现实世界中准确找到Pokémon出现的位置。高德地图提供了详细的地图数据,包括建筑物、街道和地点名称等,可以准确地标记Pokémon出现的位置,使得玩家可以更容易地捕捉它们。 其次,高德地图的导航功能可以帮助玩家更方便地探索Pokémon世界。在游戏中,玩家需要移动到各个地点来寻找不同的Pokémon。利用高德地图的导航功能,游戏可以为玩家提供最佳的路径规划,指引他们到达目的地。这不仅使得探索过程更加便捷,也增加了游戏的互动性和乐趣。 此外,高德地图还可以与Pokémon Go的社交功能相结合,促进玩家之间的互动和交流。通过高德地图的位置共享功能,玩家可以方便地分享他们捕捉到的Pokémon或者发现的特殊地点,与其他玩家分享游戏经验。这不仅增加了社区感,也可以促进玩家之间的合作和竞争,提高了游戏的可玩性。 基于高德地图的Pokémon Go开发,可以提供更真实、便捷和互动的游戏体验。高德地图的地理信息服务将能够为玩家提供准确的位置信息和导航功能,使得玩家更容易找到并捕捉到Pokémon。同时,社交功能的加入也将增加玩家之间的互动和乐趣。综上所述,基于高德地图的Pokémon Go开发将极大地提升这款游戏的品质和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值