火星坐标系统_怎样算自己的上升星座

火星坐标系统_怎样算自己的上升星座其原理是这样的:保密局开发了一个系统,能将实际的坐标转换成虚拟的坐标。所有在中国销售的数字地图必须使用这个系统进行坐标转换之后方可上市。这是生产环节,这种电子地图被称为火星地图。在使用环节,GPS终端

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

其原理是这样的:保密局开发了一个系统,能将实际的坐标转换成虚拟的坐标。所有在中国销售的数字地图必须使用这个系统进行坐标转换之后方可上市。这是生产环节,这种电子地图被称为火星地图。在使用环节,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(百度坐标)转换

 

 1 // WGS-84 坐标转换成 BD-09 坐标
 2 + (CLLocationCoordinate2D)WorldGS2BaiduGS:(CLLocationCoordinate2D)coordinate
 3 {
 4     CLLocationCoordinate2D mars = [ALDGeocoder WorldGS2MarsGS:coordinate];
 5     CLLocationCoordinate2D baidu = [ALDGeocoder MarsGS2BaiduGS:mars];
 6     return baidu;
 7 }
 8  
 9 // BD-09 坐标转换成 WGS-84 坐标
10 + (CLLocationCoordinate2D)BaiduGS2WorldGS:(CLLocationCoordinate2D)coordinate
11 {
12     CLLocationCoordinate2D mars = [ALDGeocoder BaiduGS2MarsGS:coordinate];
13     CLLocationCoordinate2D world = [ALDGeocoder MarsGS2WorldGS:mars];
14     return world;
15 }

 

3.WGS-84和sogou坐标转换

 
 1 // WGS-84 坐标转换成 Sogou 坐标
 2 + (CLLocationCoordinate2D)WorldGS2SogouGS:(CLLocationCoordinate2D)coordinate
 3 {
 4     const double ee = 0.082271854224939184;
 5     double lon = coordinate.longitude;
 6     double lat = coordinate.latitude;
 7     double dlon = [ALDGeocoder rad:CLIP(lon, -360, 360)];
 8     double dlat = [ALDGeocoder rad:CLIP(lat, -90, 90)];
 9     dlon = 6378206.4 * dlon;
10     double sinphi = sin(dlat);
11     double temp1, temp2;
12     if((temp1 = 1.0 + sinphi) == 0.0){
13         dlat = -1000000000;
14     }else if((temp2 = 1.0 - sinphi) == 0.0){
15         dlat = 1000000000;
16     }else{
17         double esinphi = ee * sinphi;
18         dlat = 3189103.2000000002 * log((temp1 / temp2) * pow((1.0 - esinphi) / (1.0 + esinphi), ee));
19     }
20     return CLLocationCoordinate2DMake(dlat, dlon);
21 }
22  
23 // Sogou 坐标转换成 WGS-84 坐标
24 + (CLLocationCoordinate2D)SogouGS2WorldGS:(CLLocationCoordinate2D)coordinate
25 {
26     const double ee = 1.5707963267948966;
27     const double aa = 0.0033938814110493522;
28     double lon = coordinate.longitude;
29     double lat = coordinate.latitude;
30     double dlon = lon / 6378206.4;
31     double temp = -lat / 6378206.4;
32     double chi;
33     if(temp < -307){
34         chi = ee;
35     }else if(temp > 308){
36         chi = -ee;
37     }else{
38         chi = ee - 2 * atan(exp(temp));
39     }
40     double chi2 = 2 * chi;
41     double coschi2 = cos(chi2);
42     double dlat = chi + sin(chi2) * (aa + coschi2 * (1.3437644537757259E-005 + coschi2 * (7.2964865099246009E-008 + coschi2 * 4.4551470401894685E-010)));
43     double rlon = CLIP([ALDGeocoder deg:dlon], -360, 360);
44     double rlat = CLIP([ALDGeocoder deg:dlat], -90, 90);
45     return CLLocationCoordinate2DMake(rlat, rlon);
46 }

4火星坐标和地球坐标转换

 1 // World Geodetic System ==> Mars Geodetic System
 2 + (CLLocationCoordinate2D)WorldGS2MarsGS:(CLLocationCoordinate2D)coordinate
 3 {
 4     // a = 6378245.0, 1/f = 298.3
 5     // b = a * (1 - f)
 6     // ee = (a^2 - b^2) / a^2;
 7     const double a = 6378245.0;
 8     const double ee = 0.00669342162296594323;
 9      
10     if (outOfChina(coordinate.latitude, coordinate.longitude))
11     {
12         return coordinate;
13     }
14     double wgLat = coordinate.latitude;
15     double wgLon = coordinate.longitude;
16     double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);
17     double dLon = transformLon(wgLon - 105.0, wgLat - 35.0);
18     double radLat = wgLat / 180.0 * PI;
19     double magic = sin(radLat);
20     magic = 1 - ee * magic * magic;
21     double sqrtMagic = sqrt(magic);
22     dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * PI);
23     dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * PI);
24      
25     return CLLocationCoordinate2DMake(wgLat + dLat, wgLon + dLon);
26 }
27  
28 // Mars Geodetic System ==> World Geodetic System
29 + (CLLocationCoordinate2D)MarsGS2WorldGS:(CLLocationCoordinate2D)coordinate
30 {
31     double gLat = coordinate.latitude;
32     double gLon = coordinate.longitude;
33     CLLocationCoordinate2D marsCoor = [ALDGeocoder WorldGS2MarsGS:coordinate];
34     double dLat = marsCoor.latitude - gLat;
35     double dLon = marsCoor.longitude - gLon;
36     return CLLocationCoordinate2DMake(gLat - dLat, gLon - dLon);
37 }

5WGS-84 和 墨卡托 坐标转换

 1 //WGS-84 坐标转换成 墨卡托 坐标
 2 + (CLLocationCoordinate2D)WorldGS2Mercator:(CLLocationCoordinate2D)coordinate
 3 {
 4     double lon = coordinate.longitude*20037508.34/180;
 5     double lat = log(tan((90+coordinate.latitude)*M_PI/360))/(M_PI/180);
 6     lat = lat*20037508.34/180;
 7     return CLLocationCoordinate2DMake(lat, lon);
 8 }
 9  
10 //墨卡托 坐标转换成 WGS-84 坐标
11 + (CLLocationCoordinate2D)Mercator2WorldGS:(CLLocationCoordinate2D)mercator
12 {
13     double lon = mercator.longitude/20037508.34*180;
14     double lat = mercator.latitude/20037508.34*180;
15     lat = 180/M_PI*(2*atan(exp(lat*M_PI/180))-M_PI/2);
16     return CLLocationCoordinate2DMake(lat, lon);
17 }

 

开发时所面临的现状

获取经纬度(GPS)

  • 火星坐标

    • MKMapView

  • 地球坐标

    • CLLocationManager

显示经纬度(地图)

  • 火星坐标

    • iOS 地图

    • Gogole地图

    • 搜搜、阿里云、高德地图

  • 地球坐标

    • Google 卫星地图(国外地图应该都是……)

  • 百度坐标

    • 百度地图

推荐的解决方案:

    • 既然是在国内,存储一律用火星坐标,这样在使用国内地图显示时最方便(用百度地图显示时可以一次转换取得)

    • CLLocationManager 拿到的 CLLocation 转为火星坐标,MKMapView 不用处理

    • 使用地图 API 进行 地址解析/逆地址解析(Geocoding) 时注意相应使用相应地图商的坐标系

    • 部分地图商支持多个坐标系输入,如高德支持地球、火星坐标(这个一直有变动,具体只能参考厂商最新文档了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167575.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c++-析构函数

    c++-析构函数

    2021年9月29日
    55
  • QT 实现 RTSP 视频流服务器[通俗易懂]

    QT 实现 RTSP 视频流服务器[通俗易懂]uos操作系统中使用QT开发RTSP视频流服务器,以下的实现方式使用的是单播方式。可以通过自己开发的rtsp服务器将摄像头的数据推送到服务器中,其他用户可以通过访问视频流地址,直接访问摄像头的内容,也就是通常说的摄像头直播。本篇文章使用开源框架live555开发一个属于自己的视频流服务器。

    2022年10月20日
    0
  • Java的8个Java日志工具[通俗易懂]

    摘要:本文要来分享一些Java程序员最常用的Java日志框架组件。日志工具log4j–最受欢迎的Java日志组件Log4j是一款基于Java的开源日志组件,Log4j功能非常强大,我们可以将日志信息输出到控制台、文件、用户界面,也可以输出到操作系统的事件记录器和一些系统常驻进程。更值得一提的是,Log4j可以允许你非常便捷地自定义日志格式和日志等级,可以帮助开发人员全方位地掌控…

    2022年4月9日
    495
  • vsphere vsan配置_快船队最新消息

    vsphere vsan配置_快船队最新消息一直想抽空写写vSAN这个产品,在15年的时候笔者第一次听说vSAN这个产品,当时VMware还以VDI最佳拍档的方式去推广vSAN,短短两年的时间,vSAN经过多个版本的更新迭代,无论从功能还是稳定性上均有很大提升,最广泛的应用也由VDI变为了承载核心业务。这篇文章总结一下笔者对vSAN的一些学习和使用经验,简单介绍下vSAN,希望可以用最少的文字介绍清楚…

    2025年6月2日
    0
  • Linux 网络配置方法 nmtui 配置

    1、nmtui   tui字符界面图形模式配置  输入命令nmtui即可2、进入配置界面3、选择网络接口 eno16777736 回车4、进行相关网络配置  掩码直接在IP地址后面添加 不然默认32位的       键盘操作  比如 Adress 后面的 SHOW  光标到SHOW 回车 即可出现IP地址配置     最后的自…

    2022年4月3日
    51
  • python与图像处理_python图像处理书籍

    python与图像处理_python图像处理书籍第1章 基本的图像操作和处理本章讲解操作和处理图像的基础知识,将通过大量示例介绍处理图像所需的Python工具包,并介绍用于读取图像、图像转换和缩放、计算导数、画图和保存结果等的基本工具。这些工具的使用将贯穿本书的剩余章节。1.1 PIL:Python图像处理类库PIL(PythonImagingLibraryPython,图像处理类库)提供了通用的图像处理功能,以及大量有用的基本图…

    2022年10月14日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号