GPS定位的偏移校正(WGS84与火星坐标互转)
地图坐标系目前包括:
地球坐标 (WGS84)
WGS84:World Geodetic System 1984,是为GPS全球定位系统使用而建立的坐标系统。
- 国际标准,从 GPS 设备中取出的数据的坐标系
- 国际地图提供商使用的坐标系
火星坐标 (GCJ-02)也叫国测局坐标系
GCJ-02是由中国国家测绘局(民间说的火星坐标系)制订的地理信息系统的坐标系统。
它是一种对经纬度数据的加密算法,即加入随机的偏差。
国内出版的各种地图系统(包括电子形式),必须至少采用GCJ-02对地理位置进行首次加密。
- 中国标准,从国行移动设备中定位获取的坐标数据使用这个坐标系
- 国家规定: 国内出版的各种地图系统(包括电子形式),必须至少采用GCJ-02对地理位置进行首次加密。
public class Wgs2MarsService
{
private readonly static double[] Lx = new double[]; private readonly static double[] Ly = new double[]; static Wgs2MarsService()
{
string str = string.Empty;
List<string> points = new List<string>();
using (StreamReader sr = new StreamReader(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "GPS.CoordinatesTransformation.txt")))
{
str = sr.ReadLine();
while (!string.IsNullOrEmpty(str))
{
points.Add(str);
str = sr.ReadLine();
}
}
int num = ;
foreach (string s in points)
{
if (Lx[num] == 0.0)
{
Lx[num] = (double)int.Parse(s) / 100000.0;
}
else
{
Ly[num] = (double)int.Parse(s) / 100000.0;
num++;
}
}
} private int ID(int i, int j)
{
return i + * j;
} public bool Wgs2Mars(double latwgs, double lngwgs, out double latmars, out double lngmars)
{
double num = lngwgs;
double num2 = latwgs;
for (long num3 = 0L; num3 < ; num3++)
{
if (num < 72.0 || num > 137.9 || num2 < 10.0 || num2 > 54.9)
{
latmars = latwgs;
lngmars = lngwgs;
return false;
}
int num4 = (int)Math.Floor((num - 72.0) * 10.0);
int num5 = (int)Math.Floor((num2 - 10.0) * 10.0);
double num6 = Lx[ID(num4, num5)];
double num7 = Ly[ID(num4, num5)];
double num8 = Lx[ID(num4 + , num5)];
double num9 = Ly[ID(num4 + , num5)];
double num10 = Lx[ID(num4 + , num5 + )];
double num11 = Ly[ID(num4 + , num5 + )];
double num12 = Lx[ID(num4, num5 + )];
double num13 = Ly[ID(num4, num5 + )];
double num14 = (num - 72.0 - 0.1 * (double)num4) * 10.0;
double num15 = (num2 - 10.0 - 0.1 * (double)num5) * 10.0;
double num16 = (1.0 - num14) * (1.0 - num15) * num6 + num14 * (1.0 - num15) * num8 + num14 * num15 * num10 + (1.0 - num14) * num15 * num12 - num;
double num17 = (1.0 - num14) * (1.0 - num15) * num7 + num14 * (1.0 - num15) * num9 + num14 * num15 * num11 + (1.0 - num14) * num15 * num13 - num2;
num = (num + lngwgs + num16) / 2.0;
num2 = (num2 + latwgs + num17) / 2.0;
}
lngmars = Math.Round(num, );
latmars = Math.Round(num2, );
return true;
} public bool Mars2Wgs(double latmars, double lngmars, out double latwgs, out double lngwgs)
{
double num = lngmars;
double num2 = latmars;
for (long num3 = 0L; num3 < ; num3++)
{
if (num < 72.0 || num > 137.9 || num2 < 10.0 || num2 > 54.9)
{
latwgs = latmars;
lngwgs = lngmars;
return false;
}
int num4 = (int)Math.Floor((num - 72.0) * 10.0);
int num5 = (int)Math.Floor((num2 - 10.0) * 10.0);
double num6 = Lx[ID(num4, num5)];
double num7 = Ly[ID(num4, num5)];
double num8 = Lx[ID(num4 + , num5)];
double num9 = Ly[ID(num4 + , num5)];
double num10 = Lx[ID(num4 + , num5 + )];
double num11 = Ly[ID(num4 + , num5 + )];
double num12 = Lx[ID(num4, num5 + )];
double num13 = Ly[ID(num4, num5 + )];
double num14 = (num - 72.0 - 0.1 * (double)num4) * 10.0;
double num15 = (num2 - 10.0 - 0.1 * (double)num5) * 10.0;
double num16 = (1.0 - num14) * (1.0 - num15) * num6 + num14 * (1.0 - num15) * num8 + num14 * num15 * num10 + (1.0 - num14) * num15 * num12 - num;
double num17 = (1.0 - num14) * (1.0 - num15) * num7 + num14 * (1.0 - num15) * num9 + num14 * num15 * num11 + (1.0 - num14) * num15 * num13 - num2;
num = (num + lngmars - num16) / 2.0;
num2 = (num2 + latmars - num17) / 2.0;
}
lngwgs = Math.Round(num, );
latwgs = Math.Round(num2, );
return true;
}
} 参考文档:https://github.com/shenqiliang/WGS2Mars
GPS.CoordinatesTransformation下载地址:GPS.CoordinatesTransformation.txt
GPS定位的偏移校正(WGS84与火星坐标互转)的更多相关文章
- GPS 偏移校正(WGS-84) 至(GCJ-02) java版本号以实现
public class EvilTransform { final static double pi = 3.14159265358979324; // // // a = 6378245.0, 1 ...
- 地球坐标-火星坐标-百度坐标及之间的转换算法 C#
美国GPS使用的是WGS84的坐标系统,以经纬度的形式来表示地球平面上的某一个位置.但在我国,出于国家安全考虑,国内所有导航电子地图必须使 用国家测绘局制定的加密坐标系统,即将一个真实的经纬度坐标加密 ...
- IOS中GPS定位偏移纠正(适用于Google地图)
在这个神奇的国度里,我们总得学习一些有中国特色的东东,例如“火星坐标”.也许有人还不知道这是什么玩意,我就简要介绍一下吧. 如果你有带GPS模块的智能手机,打开定位功能,然后访问Google ...
- IOS LocationManager定位国内偏移,火星坐标(GCJ-02)解决方法
转载自:http://blog.csdn.net/swingpyzf/article/details/16972351 纠偏也可参考:http://www.2cto.com/kf/201310/253 ...
- 火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版
火星坐标 火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地图.导航设备都是采用的这一坐标系或在这一坐标的基础上进行二次加密得到的.火星坐标的真实名称应该是GCJ- ...
- 【转】火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版
原文地址:https://www.cnblogs.com/fwc1994/p/5884115.html 火星坐标 火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地 ...
- 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换(JS版代码)
/** * Created by Wandergis on 2015/7/8. * 提供了百度坐标(BD09).国测局坐标(火星坐标,GCJ02).和WGS84坐标系之间的转换 */ //定义一些常量 ...
- 地图坐标转换 -- 火星坐标与GPS坐标
第一次处理地理位置的数据的人,没什么经验,往往掉入很多坑浪费不少时间.我也是刚刚从坑里爬出来.这篇博文主要是把入门GPS轨迹分析的经验总结一下,以方便大家少走些弯路. (1)可视化 GPS 路径 刚拿 ...
- WGS84、Web墨卡托、火星坐标、百度坐标互转
转自:1.http://blog.csdn.net/wildboy2001/article/details/12031351 2.http://kongxz.com/2013/10/wgs-cgj/ ...
随机推荐
- 使用python实现http服务器
主要使用python实现了一个http服务器.http服务器实现了用户的注册和登录的简单功能,当然还可以继续扩展. 数据的存储使用的是文件,有兴趣的话可以使用数据库进行存储.当然根据个人兴趣而定. 本 ...
- EventSource 实时传输数据
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 数据库Oracle字符处理函数
练习字符处理函数(数据库表都是从1开始),我们用到一张"伪表" dual: dual 表:dual 是一张只有一个字段,一行记录的表.dual 表也称之为'伪表',因为他不存储主题 ...
- Mysql多实例数据库
什么是Mysql的多实例? 简单的说,Mysql多实例就是一台服务器上同时开启多个不同的服务端口(如3306.3307)同时运行多个Mysql服务进程,这些服务进程通过不同socket监听不同的服务端 ...
- MooseFS 分布式存储
一.MooseFS介绍 MooseFS主要由管理服务器(master).元日志服务器(Metalogger).数据存储服务器(chunkserver)构成. 管理服务器:主要作用是管理数据存储服务器, ...
- redis(3)--redis原理分析
过期时间设置 在Redis中提供了Expire命令设置一个键的过期时间,到期以后Redis会自动删除它.这个在我们实际使用过程中用得非常多.EXPIRE命令的使用方法为EXPIRE key secon ...
- handler.postDelayed(new Runnable()){ }运行在主线程吗
答案:是的. handler.postDelayed(new Runnable() { @Override public void run() { tv_word.setVisibility(View ...
- 在.Net Core中记录日志
一个完善的系统,必然会有非常完善的日志记录,用户的操作.系统的运行状况等信息被完整的记录下来,方便我们对系统进行维护和改进..net core 也为日志记录提供了内置的支持. 在控制台程序中记录日志 ...
- VS2019 开发Django(九)------内置模板和过滤器
导航:VS2019开发Django系列 紧接上篇,继续介绍Django中的模板,考虑可能篇幅过长,所以分为两部分来讲,今天的主要内容: 1)内置模板和过滤器 母版,继承关系.头部导航和页脚,是需要与其 ...
- 1、看源码MVC如何实例化控制器?
我们知道MVC请求进来,然后路由匹配,然后找到控制器和Action,最后会调用Action方法,但是大家想想控制器是个普通的类,Action是个普通的实例方法,要想调用Action必须先实例化控制器, ...