.titrwh 发表于 2015-4-29 10:18:00

万能的坛,WGS84坐标系如何转为百度或者谷歌地图坐标

做个设备主要功能就是用GPS定位,然后把坐标传到服务器,客户在手机上可以看到设备的位置路径等。

现在基本功能都可以了,就是这个坐标上报后对应到地图有偏差,查资料发现GPS输出是用的WGS84坐标系,百度和谷歌地图就不知道是什么火星坐标了,反正是对不上。

后来找到一个网站http://minigps.net/convert.html,用这个手工转换了一些坐标发现和实际位置符合,但是不知道这个转换的算法是怎样的。

笑笑我笑了 发表于 2015-4-29 10:45:34

//
// Copyright (C) 1000 - 9999 Somebody Anonymous
// NO WARRANTY OR GUARANTEE
//

using System;

namespace Navi
{
    class EvilTransform
    {
      const double pi = 3.14159265358979324;

      //
      // 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;

      //
      // World Geodetic System ==> Mars Geodetic System
      public static void transform(double wgLat, double wgLon, out double mgLat, out double mgLon)
      {
            if (outOfChina(wgLat, wgLon))
            {
                mgLat = wgLat;
                mgLon = wgLon;
                return;
            }
            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 = Math.Sin(radLat);
            magic = 1 - ee * magic * magic;
            double sqrtMagic = Math.Sqrt(magic);
            dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
            dLon = (dLon * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);
            mgLat = wgLat + dLat;
            mgLon = wgLon + dLon;
      }

      static bool outOfChina(double lat, double lon)
      {
            if (lon < 72.004 || lon > 137.8347)
                return true;
            if (lat < 0.8293 || lat > 55.8271)
                return true;
            return false;
      }

      static double transformLat(double x, double y)
      {
            double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.Sqrt(Math.Abs(x));
            ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
            ret += (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0;
            ret += (160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0;
            return ret;
      }

      static double transformLon(double x, double y)
      {
            double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.Sqrt(Math.Abs(x));
            ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
            ret += (20.0 * Math.Sin(x * pi) + 40.0 * Math.Sin(x / 3.0 * pi)) * 2.0 / 3.0;
            ret += (150.0 * Math.Sin(x / 12.0 * pi) + 300.0 * Math.Sin(x / 30.0 * pi)) * 2.0 / 3.0;
            return ret;
      }
    }
}

出处:https://on4wp7.codeplex.com/SourceControl/changeset/view/21483#EvilTransform.cs

andy93762 发表于 2015-7-16 06:51:29

好东西 一定要顶   {:smile:}{:smile:}

mnhi124 发表于 2015-7-16 08:12:03

这个是进制转换的问题。一个用60进制,一个是100进制的,将gps的数据转换下就可以了。

fastchaser 发表于 2015-7-16 10:12:47

查一查各自的坐标系定义应该就懂了吧

LK9286 发表于 2015-7-16 10:53:23

好东西啊,收藏

sml009 发表于 2015-11-19 16:44:36

学习了
页: [1]
查看完整版本: 万能的坛,WGS84坐标系如何转为百度或者谷歌地图坐标