高德地图
在我国所有的地图产品必须至少经过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, 点大头针 弹出个界面。
- https://github.com/hadesh/MyRoute swift使用2D和搜索
- https://github.com/hadesh/tripdemo 高小德用车 - 出行类乘客端 Demo
- https://github.com/hadesh/iOS_3D_RecordPath 3D 记录路径并回放的Demo.
- https://github.com/hadesh/iOS_2D_RecordPath 2D记录路径并回放的Demo.
- https://github.com/hadesh/iOS_3D_ClusterAnnotation 点聚合 Demo.
- https://github.com/hadesh/iOS_MovingAnnotation_Demo annotation 动画Demo
- https://github.com/amapapi/iOS_3D_ClickOverlay 可选中 overlayDemo
- https://github.com/hadesh/AMapPlaceChooseDemo 地图中心选点 Demo.