赵客缦胡缨,吴钩霜雪明。银鞍照白马,飒沓如流星。
十步杀一人,千里不留行。事了拂衣去,深藏身与名。
地图坐标体系
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没有坐标转换接口
- 别人写的转换方法、有误差
- 别人写的服务器(C#版)坐标转换