iOS开发之地图篇(一)


赵客缦胡缨,吴钩霜雪明。银鞍照白马,飒沓如流星。
十步杀一人,千里不留行。事了拂衣去,深藏身与名。

地图坐标体系

1.WGS-84原始坐标系

  • 一般用国际GPS纪录仪记录下来的经纬度
  • 通过GPS定位拿到的原始经纬度
  • Google(国外)、高德地图(国外)、OSM地图定位的的经纬度。
  • 但是在国内是不允许直接用WGS84坐标系标注的,必须经过加密后才能使用

    注意:国内不允许直接使用,但是GPS设备上传的数据还是标准的数据,国内使用需要转为GCJ-02坐标

2.GCJ-02坐标系

  • GCJ-02坐标系又名“火星坐标系”,是我国国测局独创的坐标体系,由WGS-84加密而成。
  • 在国内,必须至少使用GCJ-02坐标系,如高德和Google在国内。
  • 或者使用在GCJ-02加密后再进行加密的坐标系,如百度坐标系。

3.百度坐标系:bd-09

  • 百度坐标系是在GCJ-02坐标系的基础上再次加密偏移后形成的坐标系,只适用于百度地图。

国内地图偏移问题

  • 地图偏移问题一般只有在国内才会出现

国内‘标准’GPS设备定位坐标为GCJ-02坐标系,显示地图为偏移过的地图,最终显示的为准确的位置
国内非’标准’的设备定位坐标为WGS-84原始坐标系,显示地图为偏移过的地图,最终显示的位置出现偏移

Google Maps

Google Maps注意点

  • 自定义弹窗可以直接使用InfoWindow

  • 调整地图上面的图标位置

没办法可以直接调整每一个图标的位置

可以设置地图的内容padding属性来调整

但是padding属性设置局限于调整和屏幕边缘的距离

  • 刷新地图弹框内容可以设置自动刷新帧的间隔(对应有的不需要变化的控件可以关闭以节约性能)

  • 添加手势会和地图的手势冲突,需要设置地图的consumesGesturesInView为false

consumesGesturesInView手势控制是否用户设置的手势被谷歌地图接管处理
默认设置为YES

  • 定位点的自定义弹框

每一个定位点对象GMSMarker 如果想要自定义弹框可以在下面方法实现

  • (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker

如果想要刷新地图弹框的内容, 需要在设置Marker的方法里直接转换坐标,并且实时位置的自定义弹框需要全局是一个控件,否则无法刷新控件

markerInfoWindow:方法只需要初始化控件即可,在获取到数据设置GMSMarker的方法里传递数据

想要刷新数据要设置 tracksInfoWindowChanges = YES

  • 在国内直接使用GPS原始坐标显示在地图上面会有偏移

可以使用网上别人c语言写的一些纠偏算法,纠偏后偏移不是很大(纠偏只针对国内,可以使用经纬度区分国内还是国外的区域,不是非常准确)

高德地图和百度地图SDK里面有提供国内外区域判断的Api,提供一个坐标点判断是在国内还是在国外

Google Maps 收费

The Google Maps Geolocation API

  • 普通用户

每天可以调用2500次,每秒调用50次

超过后按每1000次/0.5美元收费(还是有调用限制:每天上限:100000次)

  • 高级用户

高级用户需要和Google公司联系,可以按协议付费提高调用次数限制

但是只能针对国外的公司(不对国内公司提供服务),账单付费也必须是国外的公司

解决方法 (调用高德服务)

  • 高德地图针对没有开发对应的iOS和Android的客户端的智能硬件产品的企业用户, 提供智能硬件定位服务,支持通过服务端上传WIFI和基站信息进行定位并获取经纬度。

需要开发者账号注册为企业用户

免费调用限制为3000000次/每天

同Google Maps Geolocation API 将设备GPS获取到的Wifi和Lb数据或者Cell Tower数据转换为对应的经纬度信息

高德转出来的为GCJ-02坐标体系(火星坐标)

有国外的数据支持,但是具体的精准的还需要再测试

地图坐标体系转换

  • 地图的SDK一般会提供其他地图坐标体系到自身体系的转换接口
  • 但是

均不提供从自身向其他坐标体系转换

google SDK没有坐标转换接口

  • 别人写的转换方法、有误差

https://github.com/JackZhouCn/JZLocationConverter

  • 别人写的服务器(C#版)坐标转换

https://www.jianshu.com/p/8975586a820e

要不要鼓励一下😘