MKMapKit

中国国测局地理坐标(GCJ-02)、世界标准地理坐标(WGS-8

2017-11-09  本文已影响0人  Bytesking

YJLocationConverter

中国国测局地理坐标(GCJ-02)<火星坐标>、世界标准地理坐标(WGS-84) 、百度地理坐标(BD-09)坐标系转换工具类

需求

一、在进行地图开发过程中,我们一般能接触到以下三种类型的地图坐标系:

Installation

Cocoapods

YJBannerView is available through CocoaPods. To install it, simply add the following line to your Podfile:

    pod 'YJLocationConverter'

Support-Method

/**
 世界标准地理坐标(WGS-84) 转换成 中国国测局地理坐标(GCJ-02)<火星坐标> 超出中国依旧是世界标准地理坐标

 @param location 世界标准地理坐标(WGS-84)
 @return 中国国测局地理坐标(GCJ-02)<火星坐标>
 */
+ (CLLocationCoordinate2D)yj_WGS84ConvertToGCJ02:(CLLocationCoordinate2D)location;

/**
 中国国测局地理坐标(GCJ-02)<火星坐标>  转换成  世界标准地理坐标(WGS-84) 超出中国依旧是世界标准地理坐标

 @param location 中国国测局地理坐标(GCJ-02)<火星坐标>
 @return 世界标准地理坐标(WGS-84)
 */
+ (CLLocationCoordinate2D)yj_GCJ02ConvertToWGS84:(CLLocationCoordinate2D)location;

/**
 世界标准地理坐标(WGS-84) 转换成 百度地理坐标(BD-09)

 @param location 世界标准地理坐标(WGS-84)
 @return 百度地理坐标(BD-09)
 */
+ (CLLocationCoordinate2D)yj_WGS84ConvertToBD09:(CLLocationCoordinate2D)location;

/**
 中国国测局地理坐标(GCJ-02)<火星坐标> 转换成 百度地理坐标(BD-09)

 @param location  中国国测局地理坐标(GCJ-02)<火星坐标>
 @return 百度地理坐标(BD-09)
 */
+ (CLLocationCoordinate2D)yj_GCJ02ConvertToBD09:(CLLocationCoordinate2D)location;

/**
 百度地理坐标(BD-09) 转换成 中国国测局地理坐标(GCJ-02)<火星坐标>

 @param location 百度地理坐标(BD-09)
 @return 中国国测局地理坐标(GCJ-02)<火星坐标>
 */
+ (CLLocationCoordinate2D)yj_BD09ConvertToGCJ02:(CLLocationCoordinate2D)location;

/**
 百度地理坐标(BD-09) 转换成 世界标准地理坐标(WGS-84)此接口有1-2米左右的误差,需要精确定位情景慎用

 @param location 百度地理坐标(BD-09)
 @return 世界标准地理坐标(WGS-84)
 */
+ (CLLocationCoordinate2D)yj_BD09ConvertToWGS84:(CLLocationCoordinate2D)location;

附加

1、使用IOS的私有类MKLocationManager来计算。
  这个做法是有风险的,苹果不允许私有模块被直接调用。换句话说,你的软件可能会被Deny。因为是私有模块,我们需要声明这个类和我们要用到的函数,代码如下:

@interface MKLocationManager   
+ (id)sharedLocationManager;    // 创建并获取MKLocationManager实例
- (BOOL)chinaShiftEnabled;     // 判断IOS系统是否支持计算偏移
- (CLLocation*)_applyChinaLocationShift:(CLLocation*)arg;   // 传入原始位置,计算偏移后的位置
@end

在CLLocationManager的位置监听函数中,我们把newLocation(原始位置),转换为中国位置:

-(void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{

    if ([[MKLocationManager sharedLocationManager] chinaShiftEnabled]) {
        newLocation = [[MKLocationManager sharedLocationManager] _applyChinaLocationShift:newLocation];
        if (newLocation == nil) {  // 计算location好像是要联网的,软件刚启动时前几次计算会返回nil。
            return;
        }
    }
    ...
}

总结:这样(只能在IOS5以前的系统中使用),经转换后的newLocation,已经是中国的位置了。现在在映射到MKMapView上时,会显示正确的所在位置。

2、打开MKMapView的showsUserLocation功能。
  初始化MKMapView时,将属性showsUserLocation设置为YES,MKMapView会启动内置的位置监听服务,当用户位置变化时,调用delegate的回调函数:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
    // 这里得到的userLocation,已经是偏移后的位置了
}

总结:这个方法不会用到IOS的私有类和函数,不会有被绝的风险。缺点可能是不能像CLLocationManager那样进行丰富的配置,至少目前我还没找到。

源码查看链接:源码地址

上一篇下一篇

猜你喜欢

热点阅读