<简书 — 刘小壮> http://www.jianshu.com/p/41179be5893aandroid
本人现就任于国内某地图导航公司,这篇文章是我前段时间在公司组织技术分享的一个PPT,文章内容也主要由这个PPT的内容为主,经过这篇文章能够很好的帮你了解地图导航这个行业的相关技术。算法
PPT内容主要包括地图相关专业知识、百度和高德SDK总体框架、数据来源、行业概览等组成。其中关于地图引擎相关的技术知识,我向公司地图引擎开发同事求证过,这个PPT也给他们看过,也帮忙指出了其中的一些问题。服务器
这篇文章主要用于分享,其中若是有什么问题,还请多多指出,谢谢!网络
经纬度是一种地理坐标系统,主要用来表示地球的球面坐标系,经纬度能够定位地球的任何一个位置。南北方向的称为纬度
,东西方向称为经度
。数据结构
纬度:赤道纬度
周长最长,离赤道越远纬度
周长越短,也就更加靠近南北极。赤道以南称为南纬
,赤道以北称为北纬
。纬度
取值范围是0-90,赤道纬度
最小为0,两级最大。架构
经度:经度
也叫子午线,任意两条经线长度相等,起始点都在南北极。经度
以本初子午线为区分,以东称为东经
,以西称为西经
,东经
为正数,西经
为负数。经度
取值范围在0-180,本初子午线为0。东经
180度也就是西经
180度就是白令海峡,白令海峡就是国际换日线,日期相差一天。app
按照经度
,地球被分为24个时区,每一个时区又有分,分又包含秒。框架
作地图,投影
的概念很重要。咱们的地球是圆形的,地球的坐标是一个球面坐标,球面坐标是三维坐标(x、y、z),而咱们的地图是是二维的(x、y),须要将球面的三维坐标转换为平面的二维坐标。工具
坐标转换久用到了投影
的概念,经常使用的投影
有:圆柱投影
、圆锥投影
、方位投影
,而在咱们地图导航中使用墨卡托投影
。性能
百度、高德、Google都使用墨卡托投影
,墨卡托投影
有一个很大的弊端,就是在高纬度(南纬
、北纬
)地区产生巨大的变形。变形比较严重的地方在于俄罗斯、格林兰岛、非洲、南极洲等高纬度地区。
上面五个国家分别是:俄罗斯、澳大利亚、中国、巴西、加拿大 咱们将这五个国家放在一个纬度
,来比较这五个国家,发现相差并不太大。可是若是放在上面那张图中,俄罗斯顶好几个中国大小。
国外开发者开发了一个网站,这个网站能够将不一样国家拉到同一个纬度
,这时候就能显示出真正比例的国家面积。 网站地址:http://thetruesize.com/
古德投影
能够避免地图变形的问题,这种投影
将地图分为几个部分,而后沿赤道将几个部分链接在一块儿。咱们发现上面的格林兰岛已经被分为两部分,这种投影
并不适合用于开发,并且看起来效果也不太好看。
把一张世界地图显示到手机里是不可能的,因此就引入了金字塔模型
的概念(也就是比例尺
),咱们能够根据不一样的缩放比例,显示不一样的分辨率。
在地图应用中,咱们用手指缩放和放大地图,地图显示大小的变换,都是基于金字塔模型
来组织瓦片图的。
和金字塔模型
配合使用的就是瓦片坐标系
,在不一样的缩放等级下,同一块区域瓦片
个数也是不同的。
瓦片
越多就表明这一区域显示越详细,缩放比例也就越大。瓦片坐标系
在2D和3D的场景下都会被使用,咱们在网络很差的状况下能够看到地图瓦片
的加载过程以及瓦片
的大小、位置。
CLLocationManager
中的经纬度加密(WGS-84
)MKMapView
中的经纬度加密(GCJ-02
)GCJ-02
)GCJ-02
再次加密,叫作BD-09
)根据中国法律规定,地图提供商必须对地图经纬度进行偏移,国测局制定了一套加密标准,就是经常使用的GCJ-02
。经纬度坐标
加密主要有两种格式,GPS坐标系 (WGS-84
) 和火星坐标系 (GCJ-02
) ,加密算法是开源的,能够搜索到。
国际经纬度坐标标准为WGS-84
,国内必须至少使用国测局制定的GCJ-02
,对地理位置进行首次加密。因为每家导航SDK提供方加密都不统一,因此百度、高德、谷歌多家地图数据并不统一,须要再次进行转换。
移动端定位方式主要有三种:GPS
、Wi-Fi
、基站
,可是android
和iOS
还不太同样,android
可让用户选择和设置那种定位方式,可是iOS
是由系统为咱们选择的,咱们没有操做定位方式的权限。iOS
不容许有第三方定位,因此如今地图应用都是对系统定位进行的封装。若是有GPS
信号,iOS
系统会优先选择GPS
方式定位,而后是Wi-Fi
定位,若是Wi-Fi
信号很差就会选择基站
定位。
在定位中精确度最高的是Google
,Google
利用大数据分析,记录每一次利用Google
地图的定位。下次再次定位时,直接根据Mac地址
等信息进行分析,提升定位精确度。
比较悲催的一个问题就是,有一些比较老的iOS
机器,没有GPS
定位模块,例如一些老版本iPad
,这种设备在没有Wi-Fi
的状况下是没法定位的。
地理编码
:即地理解析,由详细的结构化地址获得对应的经纬度信息,例如北京市海淀区中关村南大街27号
的地址,就能够获取到一个惟一的经纬度信息。
逆地理编码
:即逆地理解析,由一个经纬度信息获取一个结构化地址信息,例如lng:116.31985,lat:39.959836
经纬度,就能够获取到相似于上面的地理信息。
在iOS
系统API、高德SDK、百度SDK中,都为咱们提供了地理编码
和逆地理编码
API,可是须要注意经纬度的转换,不一样地图SDK返回的经纬度加密方式不一样,咱们在传入经纬度参数和接收经纬度参数时,都须要作转换。
国内比较活跃的数据采集商主要是高德和四维图新两家,百度没有数据采集资质(最近收购了道道通),因此数据主要依赖于四维图新。
四维图新和国家测绘局合做比较密切,数据来源主要是国家测绘局提供,也有部分本身测绘的数据。高德测绘和航拍能力还不错,主要本身测绘数据,部分数据也依赖国测局提供。数据测绘单位互相之间都有合做,会相互购买本身没有的数据。
在中国,谷歌地图或苹果地图等地图开发商,数据来源几乎都是这两家公司。
POI
数据是一种矢量数据,包括美食、商店、银行、加油站等都是POI
数据,在地图上通常都以气泡或大头针表示。
数据采集能够经过车载GPS
摄像机采集,或从服务性互联网企业抓取或购买,因为百度和高德提供了对外的SDK,经过用户使用地图SDK也能够获取一些数据。
百度的地图数据主要依赖于四维图新和道道通,高德地图主要以自采为主。通常这些数据也会和大众点评、携程、口碑等互联网服务商购买,相互之间也会购买POI
数据。
2D场景:轻地图应用,简单的位置分享、兴趣点标注、线路展现等。2D模型
展现效果不太好,在缩放比例较小的状况下,看起来比较模糊(缩放比例大一些看起来清晰度还能够)。
栅格模型
对于某一个地方的描述,是经过不少层图片叠加组成的,每层表明不一样信息(例如道路)。栅格模型
通常都会先渲染一个底图,而后是在底图的基础上叠加路况、POI
等图层。
珊格图都是在服务器预处理的图片,从服务器下载处理好的图片到本地进行拼接便可,因为下载到本地是图片,本地不能再对图层进行更改。对于性能上来讲,服务器进行图片合成性能消耗较大,可是客户端性能消耗比较小,内存占用也比较小,用起来会比较流畅。
3D场景:重地图应用,以LBS
为核心功能,须要离线地图、更好的渲染效果、app内导航的。好比打车应用、出行导航类应用,3D模型
渲染后的效果比较好,通常使用导航功能都必须用这个3D模型
。
矢量数据是从服务器将地图数据下载下来,而后在客户端进行合成绘制的,因此咱们能够对地图的显示进行控制,可定制性更强。矢量图
看起来更佳清晰,渲染效果比较好。可是矢量图
对手机性能消耗很厉害,手机内存占用比较高,CPU
、GPU
消耗都很大。对于服务器性能消耗就比2D场景
性能小一些,由于服务器只是加载原始数据和向客户端进行传输,将合成绘制等这些图层渲染的绘制处理交给客户端来作。提升了客户端灵活性和更好的效果,牺牲了客户端的性能,有利有弊。
三维地图
是以三维地图数据为基础开发的,三维地图
看起来更佳立体化,地图上能够呈现出立体建筑及阴影的效果,并且地图随着用户的操做,楼宇的角度、阴影等效果也会随之发生变化。
在三维地图
过渡过程当中,也出现过假三维地图
。这种地图只能进行平面平移,不能进行旋转操做,是数据平面地图
和三维地图
过渡的产物。
百度地图目前已经能够支持部分国家的国外地图服务,例如新加坡、韩国、日本、泰国等国家。能够在最新的百度地图app上直接查看、搜索这些国家的一些POI
,以及使用导航等功能。
目前为止只有百度一家支持国外地图服务,高德暂时不支持这项服务。在百度和高德不支持的地方,因为服务器没有数据,因此不会作渲染,看起来白白的一片。
实景地图
最开始是Google
研发的,这项技术须要软件和硬件相互的配合,以及大量的数据处理才能完成。
采集实景须要各式实景采集工具,包括汽车采集、自行车采集、人力采集等,这主要是因为须要应对各类采集地点。采集时将数据实时绑定GPS
位置,这样就清楚是在哪一个位置采集的。
数据采集后须要工程师将数据进行复杂处理,才能造成咱们看到的实景数据。实景数据
通常都是静态的,并且不是实时更新的。实景数据
为了保护被采集人的用户隐私,须要对关键部位进行模糊处理,例如脸、车牌照等。
室内定位
是一种结合3D定位
的定位模式,这种定位能够在室内进行定位。室内定位直接定位某个商铺在几楼的某个位置,并且能够选择楼层。
在传统的定位中,楼内因为是多层,会致使定位重叠的问题,并且楼内GPS
信号也不太好甚至没有。因此出现了一些新技术来实现楼内定位:AGPS
(辅助全球卫星定位系统)、Wi-Fi指纹
定位、zigbee芯片
定位、RFID智能标签技术
、以及苹果推出的ibeacon
,其中高德使用的是Wi-Fi指纹定位
技术。
首先是由百度率先支持热力图
功能,热力图
功能预示着大数据时代愈来愈近。热力图是根据百度地图移动客户端和SDK在这些地区的使用状况推断出来的,这些推断数据能够是网络请求、打开次数等,经过这些数据推断出人员分布。经过以前百度在CCTV
的报道来看,经过这些数据甚至能够预测景区拥堵,防止大型踩踏等群体性事件。
热力图
随着同一区域的密集程度变化,颜色随之变深。可是因为统计方式的特色,统计的数据并不太准确,例如白天和夜间就有很大区别,只是看成参考。
Annotation
:单点标注,继承自UIView
,可使用UIView
的一些基础属性,引入了重用机制(百度也是一样的实现,包括一些打车软件的小车,都是使用Annotation
实现)。
Overlay
:多点标注,引擎直接渲染,能够经过SDK的API自定义UI,多点标注用于标识路线或某一个区域。
Other
:云搜索,地理编码和逆地理编码,导航路径规划,定位,POI
搜索等。
右边图片的高德logo是黑色,而且显示在右下角,这是iOS
系统的MapKit.framework
左边图片的高德logo是蓝色,而且显示在左下角,这是高德本身的SDK。
苹果的MapKit
只是使用了高德的数据,可是API是苹果本身开发的。
openGLES
绘制C++
的手机系统平台百度地图对于高德地图来讲,增长了一些实用性的功能,例如热力图、骑行、个性化地图等。这些功能都是高德所没有的,固然高德也有一些很不错的功能,二者各有优势。
百度地图和高德地图都有2D和3D功能,2D纯平面展现,没有楼宇拔高效果。
百度SDK主要模块划分:
POI
,地理编码、路径规划等)百度SDK分为六个大的模块,能够按照需求下载对应的模块,这样使下载下来的SDK体积变小。
百度鉴权认证策略:用户能够经过两种方式与百度开放云进行交互,包括认证方式
和匿名方式
。在SDK中不少地方都用到了鉴权认证
,例如加载地图时认证不经过不会显示地图,百度比较看重SDK的鉴权
。
百度地图渲染分为多个图层渲染,每一个图层渲染的目标也不同,地图上自定义标注和覆盖物统称为地图覆盖物,多个图层叠加起来造成矢量图
。百度地图SDK地图等级目前为19级,能够根据缩放等级的不一样渲染建筑物、道路、河流、学校、公园等内容。
百度地图支持多点触摸、双击放大、多点缩小、旋转等手势操做。而且支持画点、折线、圆、多边形等操做,而且能够自定义热力图
、瓦片图
等。
百度地图在16年1月份推出了个性化地图
,SDK提供了个性化地图模版,经过地图模版更改底图颜色和样式。从百度开发者平台下载到模版,经过地图模版能够修改地面、水系、草地、道路、铁路、地铁、POI
等颜色和样式,而后调用SDK提供的方法读取该模版便可。
第一张图是一份14年的统计报告,这份统计报告统计不太全面,部分导航应用没有被包含在内。
在这份统计报告中,咱们发现高德是惟一一个覆盖整条产业链的企业,在产业链的每一个环节都存在高德的身影。
2014年4月,阿里对高德完成了15亿美圆的收购,高德成为阿里旗下全资子公司。
这篇文章是我在公司内部组织的一次技术分享,也能够说是技术分析。当时是经过一份PDF进行分享的,我将PDF发在这里,你们能够下载看看,经过PDF看更加直观。
下载地址 密码:9hsc