高德地图

作者: changsanjiang | 来源:发表于2017-02-25 15:48 被阅读463次

    在我国所有的地图产品必须至少经过GCJ-02加密。就是所谓的火星坐标。苹果自身的CoreLocation是没有经过加密的。所以定位得到的经纬度如果直接添加标注到地图上面的话,就会发生偏移。

    百度地图GCJ-02的基础上又经过了一次加密,所以高德地图和百度地图的坐标其实不一样的。

    高德地图新版的SDK推出了一个功能就是室内外地图一体化。在3D的基础上实现的。现在北京的各大商场都支持。

    高德地图2D渲染使用(UIScrollView+CATiledLayer) 实现的。
    3D主要使用的OpenGLES渲染的。

    以下是高德地图结构:

    • 高德地图结构.png


      Base Map 就是底图。Overlay system 就是画线,画圆,画多边形这个系统。都是由下边的地图渲染引擎来渲染的。再往下就是数据源,最后是缓存。
      Annotation system 标注,其实是使用UIView实现的。。所以说很多时候 UIView 的属性也可以运用在上面的。比如说 transform 可以改变她的旋转角度,透明度等等。。

    标注:
    地图里面的标注主要分两种:
    单点 - Annotation.
    多点 - Overlay.
    Annotation 对象 - 实现 MAAnnotation 协议(MAPointAnnotation).
    Annotation 视图 - 继承 MAAnnotationView 类(MAPointAnnotation).
    Overlay 对象 - 实现MAOverlay 协议 (MAPolyline/MAPolygon/MACircle).
    Overlay 渲染器 - 继承 MAOverlayRenderer 类 (MAPolylineRenderer/MAPolygonRenderer/MACircleRenderer).
    添加 Annotation到地图上的流程。。

    • 添加标注到地图上的流程.png

      Annotations 这个View添加之后她并不是直接显示的,而是在可视区域内(这个可视区域她不是一个完全的可视区域,他会有一个扩大)进行计算,如果这个标注在可视区域内,会去执行代理方法mapView:viewForAnnotation 获得相应的 View,再添加到地图上。如果移出了地图的可视范围,这个时候会将Annotation View放到可重用池之中,等待下次重用。。

    Overlay的添加:

    • Overlay添加.png

      Overlay 的添加和Annotation 其实不太一样,因为它是地图引擎直接绘制的,所以渲染的时候就不用考虑重用不重用了,这里主要介绍几个Overlay的几个派生类,Overlay主要由圆,线,多边形,还有ground Overlay(就是一个图片渲染),然后下边就是一个Tile类,就是瓦片坐标系,我们可以直接把谷歌的瓦片拿过来贴到任何地图上面,后边是一个HeatMapOverlay是一个热地图,可以把自己的数据,作为热地图的形式显示在地图上面。

    • 一般情况下,提供的那些圆,线,多边形,就足够用了,但如果有开发者自定义显示自己的Overlay,2D,3D地图的话,实现起来有不同的地方.
      自定义 Overlay:

    2D 地图:

    • 继承 MAOverlaypathRenderer

      • (void)createPath
    • 继承 MAOverlayRenderer

      • (void)drawMapRect:zoomScale:inContext:

    2D的话就是创建一个Path,或者说直接在Context上直接用CGGraphics什么什么的方法进行画图就可以了。

    3D 地图

    • 继承 MAOverlayView
      • (void)referenceDidChange: 重新计算 openGL 坐标.
      • (void)glRender 进行绘制.

    3D的话需要重载两个函数,一个是重新计算openGL坐标,一个是在glRender里面进行绘制。高德在SDK里面提供了基本的绘制方法,画线,画面,如果有人openGL的水平很高的话,自己画也是可以的。。

    搜索

    • 云图搜索
    • 兴趣点(POI)搜索
    • 地理编码 & 逆地理编码
    • 路径规划
    • 短串分享
    • 附近搜索
    • ....
      云图搜索,这里的搜索仅仅指的是云图的检索和上传,功能是在云端。

    兴趣点搜索就是用的很普遍的搜索某一区域的点。

    逆地理编码是使用的最多的服务,就是当我们地理定位,得到一个经纬度的时候,我想知道我在那条街,哪个城市,都需要使用逆地理服务。

    路径规划现在又三种 步行,驾车,还有公交。

    附近搜索 这个附近搜索并不是搜索某个附近的兴趣点,他其实是基于云图的一个实时位置的一个检索和上传(存储)这样的一个功能主要应用场景有 智能派单, 附近的人等。目前有两种模式:

    一种是在App端,可以把我们的实时位置上传,其他App的用户呢她可以检索这个位置,就是可以把上传位置的这个用户检索出来,显示出来。
    第二种方式是可以结合开发者自己的数据,比如说 智能派单这种模式,我有快递员把自己的实时位置上传,然后在开发者自己的服务端我得到这些位置之后,我根据她的的评级,评分进行筛选,再把筛选后的结果下发给App。。这是两种应用模式。。

    定位 有三种定位模式 WIFI, 基站, GPS,三种定位方式。。
    iOS系统屏蔽掉了底层细节,使用最佳方案。当有GPS的时候选择GPS,因为GPS的精度是最高的。但是GPS并不是什么时候都有,如果室内,他没有信号了,这个时候他会选择WIFI,如果没有选择基站。

    定位 首先她不依赖于地图,高德提供了一些简便的方法比如

    • 单次定位 - 带逆地理信息

    • 连续定位

    • 地理围栏

      单次定位 一般的应用场景就是团购的应用,他只要知道用户所在的城市就够了,一次定位就够了,不需要持续定位,这个时候我只需要使用 单次定位(带逆地理信息),很长一段时间就不需要再去定位了。

      连续定位 和CoreLocation一样的,只不过是得到的坐标是经过GCL-02加密偏移的。

      地理围栏 当手机进去,离开某个特定地理区域,或在区域内活动时,手机可以接受自动通知和警告。

    导航功能

    • 调起高德地图客户端进行导航. MAMapURLSearch.
    • 使用导航SDK进行应用内导航. AMapNaviManager.

    AMapNav这种就是应用内导航,她不会跳出本身的App.
    导航SDK

    • 导航过程中开放的数据:
      AMapNaviInfo
      AMapNaviRoute
      AMapNaviLocation
      TrafficStatuses 路况光柱
      播报的字符串
      在导航的过程中会开放一些数据,开发者可以利用这些数据做一些处理,比如说之前有一个应用,他会得到你现在处在那条路,下一条路是哪一条路,然后拿到这个路跟他的数据库去匹配,得到你一个大概位置,会推送你这些路况信息什么的。

      支持3DTouch, 点大头针 弹出个界面。
    1. https://github.com/hadesh/MyRoute swift使用2D和搜索
    2. https://github.com/hadesh/tripdemo 高小德用车 - 出行类乘客端 Demo
    3. https://github.com/hadesh/iOS_3D_RecordPath 3D 记录路径并回放的Demo.
    4. https://github.com/hadesh/iOS_2D_RecordPath 2D记录路径并回放的Demo.
    5. https://github.com/hadesh/iOS_3D_ClusterAnnotation 点聚合 Demo.
    6. https://github.com/hadesh/iOS_MovingAnnotation_Demo annotation 动画Demo
    7. https://github.com/amapapi/iOS_3D_ClickOverlay 可选中 overlayDemo
    8. https://github.com/hadesh/AMapPlaceChooseDemo 地图中心选点 Demo.

    相关文章

      网友评论

        本文标题:高德地图

        本文链接:https://www.haomeiwen.com/subject/wkxnwttx.html