GPS定位的偏移校正(WGS84与火星坐标互转)

原文: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[297000];

        private readonly static double[] Ly = new double[297000];

        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 = 0;
            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 + 660 * 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 < 10; 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 + 1, num5)];
                double num9 = Ly[ID(num4 + 1, num5)];
                double num10 = Lx[ID(num4 + 1, num5 + 1)];
                double num11 = Ly[ID(num4 + 1, num5 + 1)];
                double num12 = Lx[ID(num4, num5 + 1)];
                double num13 = Ly[ID(num4, num5 + 1)];
                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, 6);
            latmars = Math.Round(num2, 6);
            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 < 10; 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 + 1, num5)];
                double num9 = Ly[ID(num4 + 1, num5)];
                double num10 = Lx[ID(num4 + 1, num5 + 1)];
                double num11 = Ly[ID(num4 + 1, num5 + 1)];
                double num12 = Lx[ID(num4, num5 + 1)];
                double num13 = Ly[ID(num4, num5 + 1)];
                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, 6);
            latwgs = Math.Round(num2, 6);
            return true;
        }
    }

参考文档:https://github.com/shenqiliang/WGS2Mars
GPS.CoordinatesTransformation下载地址:GPS.CoordinatesTransformation.txt
 

原文地址:https://www.cnblogs.com/lonelyxmas/p/11773769.html

时间: 2024-08-01 09:24:39

GPS定位的偏移校正(WGS84与火星坐标互转)的相关文章

GPS 偏移校正(WGS-84) 到(GCJ-02) java版本实现

public class EvilTransform { final static double pi = 3.14159265358979324; // // // a = 6378245.0, 1/f = 298.3 // b = a * (1 - f) // ee = (a^2 - b^2) / a^2; final static double a = 6378245.0; final static double ee = 0.00669342162296594323; // // Wor

[C#]利用纠偏数据来处理地球坐标(WGS-84)与火星坐标 (GCJ-02)转换

关键代码: using System; using System.Collections; using System.Collections.Generic; using System.IO; using YanZhiwei.DotNet2.Utilities.Models; namespace YanZhiwei.DotNet2.Utilities.Common { /// <summary> /// 地图纠偏数据帮助类 /// </summary> public class M

百度 Google 全国 地图 火星坐标 产生原因(记录)

1.偏移的起因:天朝测绘局以国家安全为理由,用法律的形式对所有在天朝发行的地图类产品加了强制性规范,要求所有地图类产品都必须使用国家测绘局的一种加偏移的算法,对地图的真实坐标进行加偏移处理,之后才可能通过审批准许上市.因此,天朝的所有官方及商用地图的坐标都是偏移的,这种偏移属于非线性的,偏移量在300至500米不等,偏移方向也不定.这种加过偏移的地图坐标就是所谓"火星坐标".2.GPS接收机本身接收卫星的信号,计算出本机所在位置的经纬度,在没有做特别处理的时候,这个经纬度是正确的.但是

IOS中GPS定位偏移纠正(适用于Google地图)

在这个神奇的国度里,我们总得学习一些有中国特色的东东,例如“火星坐标”.也许有人还不知道这是什么玩意,我就简要介绍一下吧.      如果你有带GPS模块的智能手机,打开定位功能,然后访问Google地图.只要你身处中国大陆,你就会发现定位不准,大概有几百米的偏差.然而运行一些导航软件,你又会发现定位很准确,说明手机的GPS模块确实是正常的.      这种现象是怎么造成的呢?答案是人为造成的.简单来说,GPS模块获取到的坐标是WGS84坐标系的,中国政府出于种种目的的考虑,不允许中国的地图使用

IOS LocationManager定位国内偏移,火星坐标(GCJ-02)解决方法

IOS7 WGS-84转GCJ-02(火星坐标) CLLocationManager类可以实时的获得我们位置的经纬度,并且可以通过经纬度在MapView上定位: [objc] view plaincopyprint? //创建CLLocationManager对象 CLLocationManager *locationManager = [[CLLocationManager alloc] init]; //设置委托对象为自己 [locationManager setDelegate:self]

Android GPS定位实现,教你如何一分钟实现GPS定位

转载请注明出处:http://blog.csdn.net/smartbetter/article/details/50425041 今天给大家带来的是一篇关于GPS定位的文章,我们都知道,Android定位大致分为wifi定位,基站定位和GPS定位,今天我就带大家来看看GPS定位是什么玩意,通过本篇的学习,相信大家能很快上手GPS定位操作了.GPS定位是通过和GPS定位卫星通讯来进行定位的,可以使用最少数量的卫星实现全球定位,3颗,通过光波进行通讯,不需要联网,但是连接时间比较长,大致1分钟左右

[转]百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换

注:项目中面对不同的坐标体系,在地图上显示会有不小的偏差,下面是JavaScript的转换方法. //定义一些常量 var x_PI = 3.14159265358979324 * 3000.0 / 180.0; var PI = 3.1415926535897932384626; var a = 6378245.0; var ee = 0.00669342162296594323; /** * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 * 即 百度 转 谷歌.高德 *

火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版

火星坐标 火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地图.导航设备都是采用的这一坐标系或在这一坐标的基础上进行二次加密得到的.火星坐标的真实名称应该是GCJ-02坐标.最近在知乎上看到关于火星坐标的话题都是充满争议的(点我跳转到知乎),感兴趣的同学可以去详细了解一下. 基本上所有的国内的电子地图采用的都是火星坐标系甚至Google地图中国部分都特意为中国政府做了偏移.百度坐标 火星坐标是在国际标准坐标WGS-84上进行的一次加密,由于国内的电子地图都要至

WGS84、Web墨卡托、火星坐标、百度坐标互转

转自:1.http://blog.csdn.net/wildboy2001/article/details/12031351 2.http://kongxz.com/2013/10/wgs-cgj/ 3.http://www.oschina.net/code/snippet_260395_39205 GCJ-02坐标系统(火星坐标)简介:http://blog.csdn.net/giswens/article/details/8775121(存档:http://mapbd.com/cms/201