• ios 百度地图,火星坐标,地球坐标互转


     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    //
    //  CLLocation+YCLocation.h
    //  Topevery.GPS 转换
    //
    //  Created by JY Mac on 15-5-30.
    //  Copyright (c) 2015年  JY. All rights reserved.
    //  火星坐标系转换扩展
    /*
     从 CLLocationManager 取出来的经纬度放到 mapView 上显示,是错误的!
     从 CLLocationManager 取出来的经纬度去 Google Maps API 做逆地址解析,当然是错的!
     从 MKMapView 取出来的经纬度去 Google Maps API 做逆地址解析终于对了。去百度地图API做逆地址解析,依旧是错的!
     从上面两处取的经纬度放到百度地图上显示都是错的!错的!的!
      
     分为 地球坐标,火星坐标(iOS mapView 高德 , 国内google ,搜搜、阿里云 都是火星坐标),百度坐标(百度地图数据主要都是四维图新提供的)
      
     火星坐标: MKMapView
     地球坐标: CLLocationManager
      
     当用到CLLocationManager 得到的数据转化为火星坐标, MKMapView不用处理
      
      
     API                坐标系
     百度地图API         百度坐标
     腾讯搜搜地图API      火星坐标
     搜狐搜狗地图API      搜狗坐标
     阿里云地图API       火星坐标
     图吧MapBar地图API   图吧坐标
     高德MapABC地图API   火星坐标
     灵图51ditu地图API   火星坐标
      
     */
     
    #import <CoreLocation/CoreLocation.h>
     
    @interface CLLocation (YCLocation)
     
    //从地图坐标转化到火星坐标
    - (CLLocation*)locationMarsFromEarth;
     
    //从火星坐标转化到百度坐标
    - (CLLocation*)locationBaiduFromMars;
     
    //从百度坐标到火星坐标
    - (CLLocation*)locationMarsFromBaidu;
     
    //从火星坐标到地图坐标
    - (CLLocation*)locationEarthFromMars;
     
    //从百度坐标到地图坐标
    - (CLLocation*)locationEarthFromBaidu;
     
    @end
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    //
    //  CLLocation+YCLocation.m
    //  Topevery.GPS 转换
    //
    //  Created by JY Mac on 15-5-30.
    //  Copyright (c) 2015年  JY. All rights reserved.
    //
     
    #import "CLLocation+YCLocation.h"
     
    void transform_earth_from_mars(double lat, double lng, double* tarLat, double* tarLng);
    void transform_mars_from_baidu(double lat, double lng, double* tarLat, double* tarLng);
    void transform_baidu_from_mars(double lat, double lng, double* tarLat, double* tarLng);
     
    @implementation CLLocation (YCLocation)
     
    - (CLLocation*)locationMarsFromEarth
    {
        double lat = 0.0;
        double lng = 0.0;
        transform_earth_from_mars(self.coordinate.latitude, self.coordinate.longitude, &lat, &lng);
        return [[CLLocation alloc] initWithCoordinate:CLLocationCoordinate2DMake(lat+self.coordinate.latitude, lng+self.coordinate.longitude)
                                             altitude:self.altitude
                                   horizontalAccuracy:self.horizontalAccuracy
                                     verticalAccuracy:self.verticalAccuracy
                                               course:self.course
                                                speed:self.speed
                                            timestamp:self.timestamp];
    }
     
    - (CLLocation*)locationEarthFromMars
    {
        double lat = 0.0;
        double lng = 0.0;
        transform_earth_from_mars(self.coordinate.latitude, self.coordinate.longitude, &lat, &lng);
        return [[CLLocation alloc] initWithCoordinate:CLLocationCoordinate2DMake(self.coordinate.latitude-lat, self.coordinate.longitude-lng)
                                             altitude:self.altitude
                                   horizontalAccuracy:self.horizontalAccuracy
                                     verticalAccuracy:self.verticalAccuracy
                                               course:self.course
                                                speed:self.speed
                                            timestamp:self.timestamp];
        return nil;
    }
     
    - (CLLocation*)locationBaiduFromMars
    {
        double lat = 0.0;
        double lng = 0.0;
        transform_mars_from_baidu(self.coordinate.latitude, self.coordinate.longitude, &lat, &lng);
        return [[CLLocation alloc] initWithCoordinate:CLLocationCoordinate2DMake(lat, lng)
                                             altitude:self.altitude
                                   horizontalAccuracy:self.horizontalAccuracy
                                     verticalAccuracy:self.verticalAccuracy
                                               course:self.course
                                                speed:self.speed
                                            timestamp:self.timestamp];
    }
     
    - (CLLocation*)locationMarsFromBaidu
    {
        double lat = 0.0;
        double lng = 0.0;
        transform_baidu_from_mars(self.coordinate.latitude, self.coordinate.longitude, &lat, &lng);
        return [[CLLocation alloc] initWithCoordinate:CLLocationCoordinate2DMake(lat, lng)
                                             altitude:self.altitude
                                   horizontalAccuracy:self.horizontalAccuracy
                                     verticalAccuracy:self.verticalAccuracy
                                               course:self.course
                                                speed:self.speed
                                            timestamp:self.timestamp];
    }
     
    -(CLLocation*)locationEarthFromBaidu
    {
        double lat = 0.0;
        double lng = 0.0;
        CLLocation *Mars = [self locationMarsFromBaidu];
         
        transform_earth_from_mars(Mars.coordinate.latitude, Mars.coordinate.longitude, &lat, &lng);
        return [[CLLocation alloc] initWithCoordinate:CLLocationCoordinate2DMake(Mars.coordinate.latitude-lat, Mars.coordinate.longitude-lng)
                                             altitude:self.altitude
                                   horizontalAccuracy:self.horizontalAccuracy
                                     verticalAccuracy:self.verticalAccuracy
                                               course:self.course
                                                speed:self.speed
                                            timestamp:self.timestamp];
        return nil;
    }
     
    @end
     
     
     
    // --- transform_earth_from_mars ---
    // 参考来源:https://on4wp7.codeplex.com/SourceControl/changeset/view/21483#353936
    // Krasovsky 1940
    //
    // a = 6378245.0, 1/f = 298.3
    // b = a * (1 - f)
    // ee = (a^2 - b^2) / a^2;
    const double a = 6378245.0;
    const double ee = 0.00669342162296594323;
     
    bool transform_sino_out_china(double lat, double lon)
    {
        if (lon < 72.004 || lon > 137.8347)
            return true;
        if (lat < 0.8293 || lat > 55.8271)
            return true;
        return false;
    }
     
    double transform_earth_from_mars_lat(double x, double y)
    {
        double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(abs(x));
        ret += (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 / 3.0;
        ret += (20.0 * sin(y * M_PI) + 40.0 * sin(y / 3.0 * M_PI)) * 2.0 / 3.0;
        ret += (160.0 * sin(y / 12.0 * M_PI) + 320 * sin(y * M_PI / 30.0)) * 2.0 / 3.0;
        return ret;
    }
     
    double transform_earth_from_mars_lng(double x, double y)
    {
        double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(abs(x));
        ret += (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 / 3.0;
        ret += (20.0 * sin(x * M_PI) + 40.0 * sin(x / 3.0 * M_PI)) * 2.0 / 3.0;
        ret += (150.0 * sin(x / 12.0 * M_PI) + 300.0 * sin(x / 30.0 * M_PI)) * 2.0 / 3.0;
        return ret;
    }
     
    void transform_earth_from_mars(double lat, double lng, double* tarLat, double* tarLng)
    {
        if (transform_sino_out_china(lat, lng))
        {
            *tarLat = lat;
            *tarLng = lng;
            return;
        }
        double dLat = transform_earth_from_mars_lat(lng - 105.0, lat - 35.0);
        double dLon = transform_earth_from_mars_lng(lng - 105.0, lat - 35.0);
        double radLat = lat / 180.0 * M_PI;
        double magic = sin(radLat);
        magic = 1 - ee * magic * magic;
        double sqrtMagic = sqrt(magic);
        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * M_PI);
        dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * M_PI);
        *tarLat = dLat;
        *tarLng = dLon;
    }
     
    // --- transform_earth_from_mars end ---
    // --- transform_mars_vs_bear_paw ---
    // 参考来源:http://blog.woodbunny.com/post-68.html
    const double x_pi = M_PI * 3000.0 / 180.0;
     
    void transform_mars_from_baidu(double gg_lat, double gg_lon, double *bd_lat, double *bd_lon)
    {
        double x = gg_lon, y = gg_lat;
        double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi);
        double theta = atan2(y, x) + 0.000003 * cos(x * x_pi);
        *bd_lon = z * cos(theta) + 0.0065;
        *bd_lat = z * sin(theta) + 0.006;
    }
     
    void transform_baidu_from_mars(double bd_lat, double bd_lon, double *gg_lat, double *gg_lon)
    {
        double x = bd_lon - 0.0065, y = bd_lat - 0.006;
        double z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi);
        double theta = atan2(y, x) - 0.000003 * cos(x * x_pi);
        *gg_lon = z * cos(theta);
        *gg_lat = z * sin(theta);
    }
  • 相关阅读:
    NodeJS学习笔记之Connect中间件模块(一)
    XML CDATA节点
    6个强大的AngularJS扩展应用
    java使用poi读取ppt文件和poi读取excel、word示例
    Java log4j详细教程
    JAVA8 十大新特性详解
    Express 路由
    基于 Node.js 平台,快速、开放、极简的 web 开发框架。
    Node.js 手册查询-1-核心模块方法
    Node.js 手册查询-2-MongoDB数据库方法
  • 原文地址:https://www.cnblogs.com/jyking/p/4939879.html
Copyright © 2020-2023  润新知