新普金娱乐网址


地理iOS如何识别App打开的发源

若森画江湖‖我们一起画江湖

移动端地图技术分享

  • 十月 26, 2018
  • 地理
  • 没有评论
欠文章属于<简书 — 刘小壮>原创,转载请注明:

<简书 — 刘小壮>
http://www.jianshu.com/p/41179be5893a


我现就职于国内有地图导航公司,这篇稿子是自身前段时间在柜组织技能分享的一个PPT,文章内容也重点出于是PPT的情为主,通过这篇稿子可以老好之帮忙你询问地图导航是行当之系技能。

PPT内容重点不外乎地图相关专业知识、百度和高德SDK整体框架、数据来源于、行业概览等构成。其中关于地图引擎相关的艺知识,我向商店地图引擎开发同事求证过,这个PPT也受她们扣押罢,也拉指出了中的一部分题材。

及时首文章要用以分享,其中倘产生啊问题,还请求多指出,谢谢!


地理位置授权

待引用#import <CoreLocation/CoreLocation.h>

  • plist

始终允许访问位置
NSLocationAlwaysUsageDescription
位置
NSLocationUsageDescription
在使用期间访问位置
NSLocationWhenInUseUsageDescription
始终允许访问位置并且在使用期间访问位置
NSLocationAlwaysAndWhenInUseUsageDescription
  • 判断

//判断是否开启
[CLLocationManager locationServicesEnabled];
//获取具体状态
[CLLocationManager authorizationStatus];
  • 授权

CLLocationManager *locManager = [[CLLocationManager alloc] init];
[locManager ]
//获取始终允许访问位置权限
[locManager requestWhenInUseAuthorization];
//获取在使用期间访问位置
[locManager requestAlwaysAuthorization];

地图开发专业知识

相册授权

急需引用#import <AssetsLibrary/AssetsLibrary.h>#import <Photos/Photos.h>

  • plist

访问相册
NSPhotoLibraryUsageDescription
添加相册
NSPhotoAddLibraryUsageDescription
  • 判断

[ALAssetsLibrary authorizationStatus];

[PHPhotoLibrary authorizationStatus];
  • 授权

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized) {
// 用户同意授权
}
else {
// 用户拒绝授权
}
}];
经纬度

经纬度

通过纬度是同栽地理坐标系统,主要用来表示地球的球面坐标系,经纬度可以一定地球之别一个职务。南北方向的称为纬度,东西方向称为经度

纬度:赤道纬度周长最丰富,离赤道越远纬度周长越短,也就是更加贴近南北极。赤道以南称为南纬,赤道以北称为北纬纬度取值范围是0-90,赤道纬度最好小为0,两层最深。

经度:经度为叫子午线,任意两修经线长度等,起始点都于南北极。经度为本初子午线为区别,以东称为东经,以西称为西经东经为正数,西经为负数。经度取值范围在0-180,本初子午线为0。东经180度过也就是西经180度不怕是白令海峡,白令海峡就是国际换日线,日期去一天。

按照经度,地球被分为24只时区,每个时区又有分,分而富含秒。

相机&麦克风授权

需要引用#import <AVFoundation/AVFoundation.h>

  • plist

相机
NSCameraUsageDescription
麦克风
NSMicrophoneUsageDescription
  • 判断

//AVMediaTypeVideo相机 AVMediaTypeAudio麦克风
[AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
  • 授权

//AVMediaTypeVideo相机 AVMediaTypeAudio麦克风
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {

if (granted){// 用户同意授权

}
else {// 用户拒绝授权

}
}];

//不推荐慎用
[[AVAudioSession sharedInstance] performSelector:@selector(requestRecordPermission:) withObject:^(BOOL granted) {
if (granted){// 用户同意授权

}
else {// 用户拒绝授权

}
}];
投影

投影

投影

做地图,投影的定义好关键。我们的地球是圈子的,地球的坐标是一个球面坐标,球面坐标是三维坐标(x、y、z),而我辈的地形图是是二维的(x、y),需要以球面的老三维坐标转换为面的次维坐标。

坐标转换久用到了投影的概念,常用的投影有:圆柱投影圆锥投影方位投影,而以我们地图导航中使墨卡托投影

通讯录授权

需引用#import <Contacts/Contacts.h>

  • plist

通讯录
NSContactsUsageDescription
  • 判断

[CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]
  • 授权

CNContactStore*contactStore = [[CNContactStore alloc] init];

[contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted,NSError*_Nullable error) {
if (granted){// 用户同意授权

}
else {// 用户拒绝授权

}
}];
墨卡托影

墨卡托影

百度、高德、Google都使用墨卡托投影墨卡托投影生一个坏特别之坏处,就是在大纬度(南纬北纬)地区来巨大的变形。变形比较严重的地方在俄罗斯、格林兰岛、非洲、南极洲相当于高纬度地区。

墨卡托影

方五独国各自是:俄罗斯、澳大利亚、中国、巴西、加拿大
我们以立刻五单国在一个纬度,来比较及时五个国家,发现距离并无顶好。但是一旦身处上面那张图中,俄罗斯交好几独中国大小。

海外开发者开发了一个网站,这个网站可以以不同国度拉至同一个纬度,这时候就会显得出真比例之国度面积。
网站地址:http://thetruesize.com/

蜂巢网络授权

古德投影

古德投影

古德投影足免地图变形的题材,这种投影以地图分为几只有,然后沿着赤道将几独片连接在一起。我们发现点的格林兰岛已经让分成两局部,这种投影并无入用来支付,而且看起效果啊未极端为难。

现阶段无解,可能以后呢无解

单得断定首次于安装是免是蜂窝网络尚未开要无授权

援以下头文件

#import <SystemConfiguration/CaptiveNetwork.h>
#import <SystemConfiguration/SCNetworkReachability.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
#import <CoreTelephony/CTCellularData.h>
#import <netinet/in.h>
  • 判断

//info不为nil,则当前链接wifi
- (NSDictionary *)fetchSSIDInfo {
NSArray *ifs = (__bridge_transfer NSArray *)CNCopySupportedInterfaces();
if (!ifs) {
return nil;
}

NSDictionary *info = nil;
for (NSString *ifnam in ifs) {
info = (__bridge_transfer NSDictionary *)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
if (info && [info count]) { break; }
}
return info;
}

//返回CTRadioAccessTechnologyGPRS时说明是2g,网络情况复杂就当无网
- (NSString *)fetchMobileInfo {
CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
return  info.currentRadioAccessTechnology;
}

- (BOOL)checkNetworkConnect {
// 创建零地址,0.0.0.0的地址表示查询本机的网络连接状态
struct sockaddr_in zeroAddress;//sockaddr_in是与sockaddr等价的数据结构
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;//sin_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET,代表TCP/IP协议族

/**
*  SCNetworkReachabilityRef: 用来保存创建测试连接返回的引用
*
*  SCNetworkReachabilityCreateWithAddress: 根据传入的地址测试连接.
*  第一个参数可以为NULL或kCFAllocatorDefault
*  第二个参数为需要测试连接的IP地址,当为0.0.0.0时则可以查询本机的网络连接状态.
*  同时返回一个引用必须在用完后释放.
*  PS: SCNetworkReachabilityCreateWithName: 这个是根据传入的网址测试连接,
*  第二个参数比如为"www.apple.com",其他和上一个一样.
*
*  SCNetworkReachabilityGetFlags: 这个函数用来获得测试连接的状态,
*  第一个参数为之前建立的测试连接的引用,
*  第二个参数用来保存获得的状态,
*  如果能获得状态则返回TRUE,否则返回FALSE
*
*/
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress); //创建测试连接的引用:
SCNetworkReachabilityFlags flags;

BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (didRetrieveFlags && flags == 0) {
//当前是没有打开网络情况进入,可能是关闭蜂窝/无线或进入飞行模式
return NO;
}
return YES;
}

- (void)startValidateNetworkAuthorization:(void(^)(CTCellularDataRestrictedState state))block {
CTCellularData *cellularData = [[CTCellularData alloc]init];
cellularData.cellularDataRestrictionDidUpdateNotifier =  ^(CTCellularDataRestrictedState state){
block(state);
//获取联网状态
switch (state) {
case kCTCellularDataRestricted:

break;
case kCTCellularDataNotRestricted:

break;
case kCTCellularDataRestrictedStateUnknown:

break;
default:
break;
};
};
}
  • 调用

BOOL checkConnect=YES;
BOOL isConnectWifi=[self fetchSSIDInfo];
BOOL isGPRS=[[self fetchMobileInfo] isEqualToString:CTRadioAccessTechnologyGPRS]||[[self fetchMobileInfo] isEqualToString:CTRadioAccessTechnologyEdge];
BOOL isConnectNetwork=[self checkNetworkConnect];
if (!isConnectWifi) {
checkConnect=NO;
}
if (isGPRS) {
checkConnect=NO;
}
if (!isConnectNetwork) {
checkConnect=NO;
}

if (![[[NSUserDefaults standardUserDefaults] objectForKey:@"firstInstall"] boolValue]) {
[[NSUserDefaults standardUserDefaults] setObject:@(YES) forKey:@"firstInstall"];
if (checkConnect) {
[self startValidateNetworkAuthorization:^(CTCellularDataRestrictedState state) {
if (state != kCTCellularDataRestricted) {
//首次打开app,未连接wifi移动网络正常,即有网情况蜂窝关闭,需提示用户开启蜂窝网络
}
}];
}
}
金字塔型

金字塔型

管同布置世界地图显示到手机里是勿可能的,所以就引入了金字塔模型的概念(也就是比例尺),我们好依据不同的缩放比例,显示不同之分辨率。

于地图应用被,我们用指头缩放和放地图,地图显示大小的易,都是冲金字塔模型来组织瓦片图的。

旁授权

  • plist

蓝牙
NSBluetoothPeripheralUsageDescription
媒体资料库
NSAppleMusicUsageDescription
音乐
kTCCServiceMediaLibrary
Siri
NSSiriUsageDescription
语音识别
NSSpeechRecognitionUsageDescription
日历
NSCalendarsUsageDescription
健康分享
NSHealthShareUsageDescription
健康更新
NSHealthUpdateUsageDescription
运动与健康
NSMotionUsageDescription
提醒事项
NSRemindersUsageDescription
FaceID
NSFaceIDUsageDescription
智能家居
NSHomeKitUsageDescription
运动
NSMotionUsageDescription
NFC
NFCReaderUsageDescription
视频认证
NSVideoSubscriberAccountUsageDescription
瓦片坐标系

瓦片坐标系

金字塔模型相当使用的就是是瓦片坐标系,在不同之缩放等级下,同一片区域瓦片个数也是勿同等的。

瓦片更多便意味着就无异于区域显示更加详细,缩放比例为就算越是老。瓦片坐标系在2D与3D的光景下都见面为应用,我们在网不好的气象下足观看地图瓦片的加载过程及瓦片的大小、位置。

坐标加密
  • CLLocationManager被之经纬度加密(WGS-84)
  • MKMapView中的中纬度加密(GCJ-02)
  • 高德SDK中之经纬度加密(GCJ-02)
  • 百度SDK中的中纬度加密(使用GCJ-02再也加密,叫做BD-09)

依据中国律规定,地图提供商要对地图经纬度进行偏移,国测局制定了一样仿加密标准,就是常用之GCJ-02经纬度坐标加密着重发生点儿种植格式,GPS坐标系
(WGS-84) 和火星坐标系 (GCJ-02) ,加密算法是开源之,可以搜寻到。

国际经纬度坐标标准吗WGS-84,国内必须至少用国测局制定的GCJ-02,对地理位置展开首不良加密。由于每家导航SDK提供方加密都不统一,所以百度、高德、谷歌多下地图数据并无合并,需要更进行转移。

地图定位

地图定位

运动端稳法重点有三种:GPSWi-Fi基站,但是androidiOS尚未极端一致,android足叫用户选择与安装那种定位法,但是iOS是由于网吧我们摘的,我们无操作定位法的权力。iOS未允生第三在定位,所以现在地图应用还是本着系统定点进行的包装。如果出GPS信号,iOS系会预先选项GPS道固定,然后是Wi-Fi定位,如果Wi-Fi信号不好就会见选择基站定位。

以稳定被精确度最高的是GoogleGoogle以很数量解析,记录每一样次等用Google地图的一贯。下次重定位时,直接冲Mac地址齐信息进行解析,提高一定精确度。

比悲催的一个题材不怕,有一对较一直的iOS机器,没有GPS定位模块,例如有老版本iPad,这种装置在并未Wi-Fi的情事下是无法稳定的。

地理编码和逆地理编码

示范图片

地理编码:即地理解析,由详细的结构化地址得到相应的中纬度信息,例如北京市海淀区中关村南大街27号的地址,就足以落到一个唯一的经纬度信息。

逆地理编码:即逆地理解析,由一个经纬度信息获取一个结构化地址信息,例如lng:116.31985,lat:39.959836通过纬度,就足以博得到接近于点的地理信息。

iOS系统API、高德SDK、百度SDK中,都为我们提供了地理编码逆地理编码API,但是要小心通过纬度的转换,不同地图SDK返回的中纬度加密方法不同,我们于传出经纬度参数与接到经纬度参数时,都急需开转换。

地图数据来

高德

四维图新

境内比较活跃的多寡采集商主要是高德以及四维图新两贱,百度没有数据搜集资质(最近收购了道道通),所以数据要借助让四维图新。

四维图新与国测绘局合作比较缜密,数据来源于至关重要是国家测绘局资,也时有发生一些好测绘的数量。高德测绘和航拍能力还不错,主要自己测绘数据,部分数据也因国测局提供。数据测绘单位互相之间还出合作,会互相购买好从没底多少。

在神州,谷歌地图或苹果地图等地图开发商,数据来源于几乎都是立有限家庄。

POI数据

POI

POI数据是平等种矢量数据,包括美食、商店、银行、加油站等还是POI数码,在地形图及相似还盖气泡或大头针表示。

数据搜集可以由此车载GPS摄像机采集,或打服务性互联网公司抓取或市,由于百度和高德提供了对外的SDK,通过用户使用地图SDK也得获取有多少。

百度的地形图数据主要依靠让四维图新和道道通,高德地图主要归因于自采为主。一般这些数据也会见跟民众点评、携程、口碑等互联网服务商购买,相互之间也会见市POI数据。

栅格-2D地图

珊格图

珊格图

2D场面:轻地图应用,简单的职务分享、兴趣点标注、线路展示等。2D模型显效果不绝好,在缩放比例比较小的状下,看起较模糊(缩放比例非常有扣押起清晰度还足以)。

栅格模型于有一个地方的描述,是透过群交汇图片叠加成的,每层代表不跟信息(例如道路)。栅格模型诚如都见面先行渲染一个底图,然后是在底图的基础及折加路况、POI等图层。

珊格图都是于服务器预处理的图纸,从服务器下载处理好之图及本地开展拼接即可,由于下充斥至当地是图形,本地未可知更指向图层进行反。对于性达到的话,服务器进行图片合成性能消耗比较生,但是客户端性能消耗比较粗,内存占用呢比较小,用起会较流畅。

矢量-3D地图

矢量地图

矢量地图

3D场景:重地图应用,以LBS呢核心职能,需要离线地图、更好的渲染效果、app内导航的。比如打车应用、出行导航类应用,3D模型渲染后底作用比好,一般采用导航功能都须用这3D模型

矢量数据是起服务器将地图数据下载下来,然后以客户端进行合成绘制的,所以我们得以针对地图的显得进行控制,可定制性更强。矢量图圈起更优质清晰,渲染效果比较好。但是矢量图本着手机特性消耗大厉害,手机内存占用比较高,CPUGPU淘都十分要命。对于服务器性能消耗就较2D场景特性小片段,因为服务器就是加载原始数据与向阳客户端进行传输,将合成绘制等这些图层渲染之绘图处理交给客户端来开。提高了客户端灵活性与重好之效力,牺牲了客户端的性质,有利有弊。

三维地图

三维地图

三维地图凡为三维地图数据也底蕴开发之,三维地图圈起再也佳立体化,地图及可以呈现出立体建筑和影子的机能,而且地图随着用户的操作,楼宇的角度、阴影等效果呢会随之发生变化。

三维地图连接过程中,也起了假三维地图。这种地图只能进行平面平移,不克拓展盘操作,是数据平面地图三维地图搭的结局。

域外地图

国外地图

百度地图目前曾经好支撑有国家的国外地图服务,例如新加坡、韩国、日本、泰国当国家。可以当风行的百度地图app上一直翻、搜索这些国家之有的POI,以及下导航等效果。

目前为止只发百度一小支撑海外地图服务,高德暂时未支持这项服务。在百度和高德不支持的地方,由于服务器无多少,所以未会见做渲染,看起白白的一致切片。

实景地图

实景地图

实景地图顶开头是Google研发的,这项技术需要软件和硬件相互的相当,以及大气底多少处理才能够一气呵成。

采集实景需要各式实景采集工具,包括汽车采集、自行车采集、人力采集等,这关键是出于用报各种采集地点。采集时以数据实时绑定GPS职,这样就掌握是当谁位置采集的。

数量收集后需要工程师将数据开展复杂处理,才能够形成我们见到的实景数据。实景数据相似还是静态的,而且无是实时更新的。实景数据为了维护于采集人的用户隐私,需要针对关键部位进行模糊处理,例如脸、车牌照等。

室内地图

室内地图

室内定位凡是一样栽组成3D定位的稳模式,这种稳定好于室内进行定位。室内定位一直固定某个商铺在几乎楼底某位置,而且可挑选楼层。

当风的定点被,楼内由是基本上交汇,会造成定位重叠的题材,而且楼内GPS信号呢非绝好还未曾。所以出现了有初技巧来落实楼内固定:AGPS(辅助全球卫星定位系统)、Wi-Fi指纹定位、zigbee芯片定位、RFID智能标签技术、以及苹果推出的ibeacon,其中高德用的是Wi-Fi指纹定位技术。

百度热力图

百度热力图

首先是出于百度率先支持热力图功能,热力图功能预示着十分数据时代更加接近。热力图是基于百度地图移动客户端与SDK在这些地区的使用状态想出来的,这些推断数据可是网络要、打开次数等于,通过这些多少测算出人员分布。通过前百度在CCTV的报导来拘禁,通过这些数据还是可以预计景区人山人海,防止大型踩踏等群体性事件。

热力图乘机同一区域的凝聚程度变化,颜色就转移死。但是出于统计方式的表征,统计的数据并无极端准确,例如白天及夜间便起坏怪分别,只是当参考。


地图SDK架构

高德SDK结构

高德SDK结构

Annotation:单点标注,继承自UIView,可以用UIView的有的基础属性,引入了用机制(百度也是一致的落实,包括一些打车软件的手推车,都是应用Annotation实现)。

Overlay:多接触标注,引擎直接渲染,可以由此SDK的API自定义UI,多碰标注用于标识路线还是某个一个区域。

Other:云搜索,地理编码和逆地理编码,导航路径设计,定位,POI搜索等。

MapKit和高德SDK区别

对比

右侧图片的高德logo是黑色,并且显示在右边下角,这是iOS系统的MapKit.framework

左侧图片的高德logo是蓝色,并且显示在左下角,这是高德自己之SDK。

苹果的MapKit只是采用了高德的多寡,但是API是苹果好开支的。

百度地图SDK框架

百度地图SDK框架

超平台引擎:
  • 百度地图的地图引擎使用openGLES绘制
  • 能够运转于支撑C++的手机系统平台
  • 不等平台对应用层保持一致的API接口
  • 提供能够满足应用层的功底数据结构
  • 尽心尽力少的乘系统接口,提高可移植性
  • 世故与而扩展性

百度地图对于高德地图来说,增加了有些实用性的职能,例如热力图、骑行、个性化地图等。这些力量还是高德所没有底,当然高德也生有死是的功力,两者各出助益。

百度地图跟高德地图还起2D同3D功能,2D彻头彻尾平面展示,没有楼宇拔高效果。

百度地图SDK框架

百度地图SDK框架

百度SDK主要模块划分:

  • 地图(基础功用,地图显示和操作和各种覆盖物图层)
  • 检索(POI,地理编码、路径设计相当)
  • 一贯(提供单身稳定模块,经纬度根据国测局二不行加密)
  • 工具(调用百度客户端,坐标转换等)
  • 大面积雷达(检索用户信息,查找附近的人数,主要用来社交)
  • LBS云(区域搜索,百度服务器存储数据,可以好操作,属于开发者自发生多少)

百度SDK分为六只好的模块,可以依照要求下载对应之模块,这样要下载下来的SDK体积变小。

百度鉴权认证策略:用户可以由此个别种方式以及百度开放云进行互动,包括认证方式匿名方式。在SDK中众地方都用到了鉴权认证,例如加载地图时说明不通过非见面显示地图,百度比较重视SDK的鉴权

希冀层渲染

希冀层渲染

百度地图渲染分为多单图层渲染,每个图层渲染之对象吗非同等,地图上起定义标注和挂物统称为地图覆盖物,多个图层叠加起来形成矢量图。百度地图SDK地图等时吧19级,可以因缩放等级的例外渲染建筑物、道路、河流、学校、公园等内容。

百度地图支持多碰触摸、双击放大、多碰缩小、旋转等手势操作。并且支持画点、折线、圆、多边形等操作,并且可以起定义热力图瓦片图等。

百度个性化地图

百度个性化地图

百度地图在16年1月份生产了个性化地图,SDK提供了单性化地图模版,通过地图模版更改底图颜色和样式。从百度开发者平台下充斥到模版,通过地图模版可以改本地、水系、草地、道路、铁路、地铁、POI相当颜色与样式,然后调用SDK提供的计读博该模版即可。


地图产业链

地图产业链

生龙活虎统计

第一摆放图是平等卖14年之统计报告,这卖统计报告统计不顶周到,部分导航应用尚未于含有在内。

每当这卖统计报告受到,我们发现高德是绝无仅有一个覆盖整条产业链的合作社,在产业链的每个环节还设有高德的人影。

2014年4月,阿里针对高德就了15亿美元之收买,高德成为阿里旗产都资子公司。

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图