iOS 火星坐标系 与 地球坐标系
在开发过程中,遇到一个问题,安卓和iOS传同样的经纬度给后台,但是后台给出的酒店 按照距离排序 两端确实不一致的。
原因:安卓使用的高德地图定位,直接定位的经纬度就是火星坐标系,而iOS使用的是苹果自带的定位系统,定位的坐标使用的是地球坐标系,没有转换。
解决方法:使用了架构组提供的方法,发现不准确,差大概500~600m的距离,尝试失败。
换另外一种方法: (高德提供的)
CLLocationCoordinate2D amapcoord = AMapCoordinateConvert(CLLocationCoordinate2DMake(39.989612,116.480972), AMapCoordinateType); |
//将地球坐标系转成火星坐标系
self.currentLocation = AMapCoordinateConvert(CLLocationCoordinate2DMake([TNLocationManager sharedInstance].lat,[TNLocationManager sharedInstance].lng), AMapCoordinateTypeGPS);
效果比较好,差距在1m以内。架构组重新去更改转换的算法:)
--------------------------------下面部分为转载
其原理是这样的:保密局开发了一个系统,能将实际的坐标转换成虚拟的坐标。所有在中国销售的数字地图必须使用这个系统进行坐标转换之后方可上市。这是生产环节,这种电子地图被称为火星地图。在使用环节,GPS终端设备必须集成保密局提供的加密算法(集成工作由保密局完成),把从GPS卫星那里得到的坐标转换成虚拟坐标,然后再去火星地图上查找,这样就在火星坐标系上完成了地图的匹配。 所以大家所用的百度,高德等地图定位准是偏差几百米
名词总结:
地球坐标:指WGS84坐标系统
火星坐标:指使用国家保密插件人为偏移后的坐标
地球地图:指与地球坐标对应的客观真实的地图
火星地图:指经过加密偏移后的,与火星坐标对应的地图
坐标系转换算法
1.GCJ-02(火星坐标系)和BD-09转换
- // GCJ-02 坐标转换成 BD-09 坐标
- + (CLLocationCoordinate2D)MarsGS2BaiduGS:(CLLocationCoordinate2D)coordinate
- {
- double x_pi = PI * 3000.0 / 180.0;
- double x = coordinate.longitude, y = coordinate.latitude;
- double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi);
- double theta = atan2(y, x) + 0.000003 * cos(x * x_pi);
- double bd_lon = z * cos(theta) + 0.0065;
- double bd_lat = z * sin(theta) + 0.006;
- return CLLocationCoordinate2DMake(bd_lat, bd_lon);
- }
- // BD-09 坐标转换成 GCJ-02 坐标
- + (CLLocationCoordinate2D)BaiduGS2MarsGS:(CLLocationCoordinate2D)coordinate
- {
- double x_pi = PI * 3000.0 / 180.0;
- double x = coordinate.longitude - 0.0065, y = coordinate.latitude - 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);
- double gg_lon = z * cos(theta);
- double gg_lat = z * sin(theta);
- return CLLocationCoordinate2DMake(gg_lat, gg_lon);
- }
2WGS-84(地球坐标系)和BD-09(百度坐标)转换
- // WGS-84 坐标转换成 BD-09 坐标
- + (CLLocationCoordinate2D)WorldGS2BaiduGS:(CLLocationCoordinate2D)coordinate
- {
- CLLocationCoordinate2D mars = [ALDGeocoder WorldGS2MarsGS:coordinate];
- CLLocationCoordinate2D baidu = [ALDGeocoder MarsGS2BaiduGS:mars];
- return baidu;
- }
- // BD-09 坐标转换成 WGS-84 坐标
- + (CLLocationCoordinate2D)BaiduGS2WorldGS:(CLLocationCoordinate2D)coordinate
- {
- CLLocationCoordinate2D mars = [ALDGeocoder BaiduGS2MarsGS:coordinate];
- CLLocationCoordinate2D world = [ALDGeocoder MarsGS2WorldGS:mars];
- return world;
- }
3.WGS-84和sogou坐标转换
- // WGS-84 坐标转换成 Sogou 坐标
- + (CLLocationCoordinate2D)WorldGS2SogouGS:(CLLocationCoordinate2D)coordinate
- {
- const double ee = 0.082271854224939184;
- double lon = coordinate.longitude;
- double lat = coordinate.latitude;
- double dlon = [ALDGeocoder rad:CLIP(lon, -360, 360)];
- double dlat = [ALDGeocoder rad:CLIP(lat, -90, 90)];
- dlon = 6378206.4 * dlon;
- double sinphi = sin(dlat);
- double temp1, temp2;
- if((temp1 = 1.0 + sinphi) == 0.0){
- dlat = -1000000000;
- }else if((temp2 = 1.0 - sinphi) == 0.0){
- dlat = 1000000000;
- }else{
- double esinphi = ee * sinphi;
- dlat = 3189103.2000000002 * log((temp1 / temp2) * pow((1.0 - esinphi) / (1.0 + esinphi), ee));
- }
- return CLLocationCoordinate2DMake(dlat, dlon);
- }
- // Sogou 坐标转换成 WGS-84 坐标
- + (CLLocationCoordinate2D)SogouGS2WorldGS:(CLLocationCoordinate2D)coordinate
- {
- const double ee = 1.5707963267948966;
- const double aa = 0.0033938814110493522;
- double lon = coordinate.longitude;
- double lat = coordinate.latitude;
- double dlon = lon / 6378206.4;
- double temp = -lat / 6378206.4;
- double chi;
- if(temp < -307){
- chi = ee;
- }else if(temp > 308){
- chi = -ee;
- }else{
- chi = ee - 2 * atan(exp(temp));
- }
- double chi2 = 2 * chi;
- double coschi2 = cos(chi2);
- double dlat = chi + sin(chi2) * (aa + coschi2 * (1.3437644537757259E-005 + coschi2 * (7.2964865099246009E-008 + coschi2 * 4.4551470401894685E-010)));
- double rlon = CLIP([ALDGeocoder deg:dlon], -360, 360);
- double rlat = CLIP([ALDGeocoder deg:dlat], -90, 90);
- return CLLocationCoordinate2DMake(rlat, rlon);
- }
4火星坐标和地球坐标转换
- // World Geodetic System ==> Mars Geodetic System
- + (CLLocationCoordinate2D)WorldGS2MarsGS:(CLLocationCoordinate2D)coordinate
- {
- // 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;
- if (outOfChina(coordinate.latitude, coordinate.longitude))
- {
- return coordinate;
- }
- double wgLat = coordinate.latitude;
- double wgLon = coordinate.longitude;
- double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);
- double dLon = transformLon(wgLon - 105.0, wgLat - 35.0);
- double radLat = wgLat / 180.0 * PI;
- double magic = sin(radLat);
- magic = 1 - ee * magic * magic;
- double sqrtMagic = sqrt(magic);
- dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * PI);
- dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * PI);
- return CLLocationCoordinate2DMake(wgLat + dLat, wgLon + dLon);
- }
- // Mars Geodetic System ==> World Geodetic System
- + (CLLocationCoordinate2D)MarsGS2WorldGS:(CLLocationCoordinate2D)coordinate
- {
- double gLat = coordinate.latitude;
- double gLon = coordinate.longitude;
- CLLocationCoordinate2D marsCoor = [ALDGeocoder WorldGS2MarsGS:coordinate];
- double dLat = marsCoor.latitude - gLat;
- double dLon = marsCoor.longitude - gLon;
- return CLLocationCoordinate2DMake(gLat - dLat, gLon - dLon);
- }
5WGS-84 和 墨卡托 坐标转换
- //WGS-84 坐标转换成 墨卡托 坐标
- + (CLLocationCoordinate2D)WorldGS2Mercator:(CLLocationCoordinate2D)coordinate
- {
- double lon = coordinate.longitude*20037508.34/180;
- double lat = log(tan((90+coordinate.latitude)*M_PI/360))/(M_PI/180);
- lat = lat*20037508.34/180;
- return CLLocationCoordinate2DMake(lat, lon);
- }
- //墨卡托 坐标转换成 WGS-84 坐标
- + (CLLocationCoordinate2D)Mercator2WorldGS:(CLLocationCoordinate2D)mercator
- {
- double lon = mercator.longitude/20037508.34*180;
- double lat = mercator.latitude/20037508.34*180;
- lat = 180/M_PI*(2*atan(exp(lat*M_PI/180))-M_PI/2);
- return CLLocationCoordinate2DMake(lat, lon);
- }
iOS 火星坐标系 与 地球坐标系相关推荐
- android 地球坐标 火星坐标系,IOS开发入门之iOS开发火星坐标系与地球坐标系解析...
本文将带你了解IOS开发入门iOS开发火星坐标系与地球坐标系解析,希望本文对大家学IOS有所帮助. iOS开发火星坐标系与地球坐标系解析. 在开发过程中,遇到一个问题,安卓和iOS传同样的经纬度给后台 ...
- 在vue中wgs84和gcj02互相转化,地球坐标系转火星坐标系
在开始转化前先理清几个名词的定义,以及为什么要转化? WGS-84坐标系:也叫 地球坐标系,他是国际上通用的坐标系,谷歌地图用的就是WGS-84(谷歌中国除外),使用GPS芯片或者 北斗芯片的设 ...
- gps84转换gcj02公式_地球坐标系 (WGS-84) 相互转火星坐标系 (GCJ-02) 的转换算法
import java.util.HashMap; import java.util.Map; /** * 地球坐标系 (WGS-84) 相互转火星坐标系 (GCJ-02) 的转换算法 * * @au ...
- STM32开发 -- 地球坐标系(WGS84),火星坐标系(GCJ02), 百度坐标系(BD09)坐标转换
如需转载请注明出处:https://juyou.blog.csdn.net/article/details/99599071 STM32开发 – GPS模块开发详解 最后有提到一下: WGS84坐标系 ...
- WGS84地球坐标系,GCJ02火星坐标系,BD09百度坐标系简介与转换,mybatis字段映射原理
1.各坐标系简介 2.各坐标系转换 2.1坐标点实体类 2.2各坐标系转换工具类 3.测试 1.各坐标系简介 WGS84坐标系 即地球坐标系,国际上通用的坐标系. 设备一般包含GPS芯片或者北斗芯片获 ...
- B站/博客园/CSDN/知乎:@秋意正寒 地球坐标系(WGS84),火星坐标系(GCJ02), 百度坐标系(BD09)坐标转换
https://blog.csdn.net/skh2015java/article/details/68486756 聊聊GIS中那些坐标系 转载请声明到标题. B站/博客园/CSDN/知乎:@秋意正 ...
- 地球坐标系(WGS - 84)转火星坐标系(GCJ)
地球坐标系(WGS - 84)转火星坐标系(GCJ) package com.tdt.convert.utils;import java.math.BigDecimal;/*** @author Mr ...
- 地球坐标系,火星坐标系,百度坐标系
地球坐标系--WGS84:常见于 GPS 设备,Google 地图等国际标准的坐标体系. 火星坐标系--GCJ-02:中国国内使用的被强制加密后的坐标体系,高德坐标就属于该种坐标体系. 百度坐标系-- ...
- 关于不同坐标地之前的转化(地球坐标系,经纬度坐标系,火星坐标系,EPSG:4326,WGS84,EPSG:3857)
EPSG:3857转换经纬度(EPSG:4326) // javascript 转换 function mercatorTolonlat(mercator){var lonlat={x:0,y:0}; ...
最新文章
- libcurl网络连接使用tcp/ip
- 阿里妈妈首次公开新一代自研智能检索模型 | WWW 2018论文解读
- [WinError 127] 找不到指定的程序
- 【Linux】Linux中Vim基础
- leetcode1025. 除数博弈(dp/数学)
- 第二周:神经网络的编程基础之Python与向量化
- 2020 大会员惊喜上线!大特权限时领取!
- 8086微型计算机结构功能,3.2 8086微处理器的功能结构
- 【语法】iOS(一)ObjectC的语法
- 分布式微服务云架构电子商务平台
- 说说域名、二级域名和主机名的联系区别
- android 盒子 红白机 模拟器,安卓FC模拟器
- 【多目标跟踪论文阅读笔记——2021年CVPR论文粗读记录】
- 计算机三级的英语单词,大学英语三级词汇表(新版)资料.doc
- PLB: Congestion Signals are Simple and Effective for Network Load Balancing读后思考
- 一个大二博主的一年来写博的年终总结与未来展望——致2019努力的自己,也致2020更好的自己
- matlab语言帮助系统题目,西电 matlab语言考试题2009年
- COGS 775. 山海经 【线段树】
- 国家自然基金相关资料
- kuangbin带你飞 专题一