首页 技术 正文
技术 2022年11月15日
0 收藏 768 点赞 2,790 浏览 7677 个字
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 ////  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

 

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 ////  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.htmlconst 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);}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,078
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,553
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,402
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,177
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,814
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898