zoukankan      html  css  js  c++  java
  • GIS 纠偏,点距

    妈的,这么个技术点都成香馍馍了,人家老早把算法私下颁布了啊(呵呵,我们公司好像10多年也没搞定,也是我来搞定的,不过不是我写的,我抄来的,写过游戏的直觉是对的,估计也是sin一类的);

    百度的二次偏移不支持,需要再次运算,以下算法为一次偏移纠偏运算(比如bing,google都只是一次偏移);

    上个图证明是OK的哈,图中的是silverlight bingmap ——

    代码继续往下——

     1     internal class EvilTransform
     2     {
     3         private const double pi = 3.14159265358979324;
     4 
     5         //
     6         // Krasovsky 1940
     7         //
     8         // a = 6378245.0, 1/f = 298.3
     9         // b = a * (1 - f)
    10         // ee = (a^2 - b^2) / a^2;
    11         private const double a = 6378245.0;
    12         private const double ee = 0.00669342162296594323;
    13 
    14         //
    15         // World Geodetic System ==> Mars Geodetic System
    16         public static void Transform(double wgLat, double wgLon, out double mgLat, out double mgLon)
    17         {
    18             if (OutOfChina(wgLat, wgLon))
    19             {
    20                 mgLat = wgLat;
    21                 mgLon = wgLon;
    22                 return;
    23             }
    24             double dLat = TransformLat(wgLon - 105.0, wgLat - 35.0);
    25             double dLon = TransformLon(wgLon - 105.0, wgLat - 35.0);
    26             double radLat = wgLat/180.0*pi;
    27             double magic = Math.Sin(radLat);
    28             magic = 1 - ee*magic*magic;
    29             double sqrtMagic = Math.Sqrt(magic);
    30             dLat = (dLat*180.0)/((a*(1 - ee))/(magic*sqrtMagic)*pi);
    31             dLon = (dLon*180.0)/(a/sqrtMagic*Math.Cos(radLat)*pi);
    32             mgLat = wgLat + dLat;
    33             mgLon = wgLon + dLon;
    34         }
    35 
    36         private static bool OutOfChina(double lat, double lon)
    37         {
    38             if (lon < 72.004 || lon > 137.8347)
    39                 return true;
    40             if (lat < 0.8293 || lat > 55.8271)
    41                 return true;
    42             return false;
    43         }
    44 
    45         private static double TransformLat(double x, double y)
    46         {
    47             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));
    48             ret += (20.0*Math.Sin(6.0*x*pi) + 20.0*Math.Sin(2.0*x*pi))*2.0/3.0;
    49             ret += (20.0*Math.Sin(y*pi) + 40.0*Math.Sin(y/3.0*pi))*2.0/3.0;
    50             ret += (160.0*Math.Sin(y/12.0*pi) + 320*Math.Sin(y*pi/30.0))*2.0/3.0;
    51             return ret;
    52         }
    53 
    54         private static double TransformLon(double x, double y)
    55         {
    56             double ret = 300.0 + x + 2.0*y + 0.1*x*x + 0.1*x*y + 0.1*Math.Sqrt(Math.Abs(x));
    57             ret += (20.0*Math.Sin(6.0*x*pi) + 20.0*Math.Sin(2.0*x*pi))*2.0/3.0;
    58             ret += (20.0*Math.Sin(x*pi) + 40.0*Math.Sin(x/3.0*pi))*2.0/3.0;
    59             ret += (150.0*Math.Sin(x/12.0*pi) + 300.0*Math.Sin(x/30.0*pi))*2.0/3.0;
    60             return ret;
    61         }
    62     }

    在来个算两点距离的(二维平面,不算三维的z哈)

     1 public struct EarthPoint
     2     {
     3         public const double Ea = 6378137; // 赤道半径 WGS84标准参考椭球中的地球长半径(单位:m)  
     4         public const double Eb = 6356725; // 极半径   
     5         public readonly double Ec;
     6         public readonly double Ed;
     7         public readonly double Jd;
     8         public readonly double Latidute;
     9         public readonly double Longitude;
    10         public readonly double Wd;
    11 
    12         public EarthPoint(double longitude, double latidute)
    13         {
    14             Longitude = longitude;
    15             Latidute = latidute;
    16             Jd = Longitude*Math.PI/180; //转换成角度
    17             Wd = Latidute*Math.PI/180; //转换成角度
    18             Ec = Eb + (Ea - Eb)*(90 - Latidute)/90;
    19             Ed = Ec*Math.Cos(Wd);
    20         }
    21 
    22         public double Distance(EarthPoint point)
    23         {
    24             double dx = (point.Jd - Jd)*Ed;
    25             double dy = (point.Wd - Wd)*Ec;
    26             return Math.Sqrt(dx*dx + dy*dy);
    27         }
    28 
    29         public static double GetDistance(
    30             double latidute1,
    31             double longitude1,
    32             double latidute2,
    33             double longitude2)
    34         {
    35             var p1 = new EarthPoint(longitude1, latidute1);
    36             var p2 = new EarthPoint(longitude2, latidute2);
    37             return p1.Distance(p2);
    38         }
    39     }
  • 相关阅读:
    那么 Appium 到底是怎么工作的呢?
    最小的 Velocity 教程
    CentOS 7 使用经验(更新中)
    [TL-WR841N V5~V9] 如何当作无线交换机使用?
    VS2012打包部署Winform程序
    ASP.NET 应用程序生命周期概述[转自MSDN]
    (翻译)从底层了解ASP.NET体系结构 [转]
    .NET在IE9中页面间URL传递中文变成乱码的解决办法
    终于把你必须知道的.NET看完了
    装箱与拆箱的操作与内存管理
  • 原文地址:https://www.cnblogs.com/huapiaoshuiliuxi/p/4562650.html
Copyright © 2011-2022 走看看