1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace MRP
  8. {
  9. public class ClassMct
  10. {
  11. static public int __IterativeTimes = ; //反向转换程序中的迭代次数
  12. static public double __IterativeValue = ; //反向转换程序中的迭代初始值
  13. static public double __A = 6378.137; //椭球体长轴,千米
  14. static public double __B = 6356.752314; //椭球体短轴,千米
  15. static public double __B0 = ; //标准纬度,弧度
  16. static public double __L0 = ; //原点经度,弧度
  17.  
  18. //角度到弧度的转换
  19. static public double DegreeToRad(double degree)
  20. {
  21. return Math.PI * degree / ;
  22. }
  23.  
  24. //弧度到角度的转换
  25. static public double RadToDegree(double rad)
  26. {
  27. return ( * rad) / Math.PI;
  28. }
  29.  
  30. //设定__A与__B
  31. static public void SetAB(double a, double b)
  32. {
  33. if (a <= || b <= )
  34. {
  35. return;
  36. }
  37. __A = a;
  38. __B = b;
  39. }
  40. //设定__B0
  41. static public void SetLB0(double pmtL0, double pmtB0)
  42. {
  43. double l0 = DegreeToRad(pmtL0);
  44. if (l0 < -Math.PI || l0 > Math.PI)
  45. {
  46. return;
  47. }
  48. __L0 = l0;
  49.  
  50. double b0 = DegreeToRad(pmtB0);
  51. if (b0 < -Math.PI / || b0 > Math.PI / )
  52. {
  53. return;
  54. }
  55. __B0 = b0;
  56. }
  57.  
  58. /*******************************************
  59. 经纬度转XY坐标
  60. pmtLB0: 参考点经纬度
  61. pmtLB1: 要转换的经纬度
  62. 返回值: 直角坐标,单位:公里
  63. *******************************************/
  64. static public PointXY LBToXY(PointLB pmtLB0, PointLB pmtLB1)
  65. {
  66. SetLB0(pmtLB0.lon, pmtLB0.lat);
  67.  
  68. double B = DegreeToRad(pmtLB1.lat);
  69. double L = DegreeToRad(pmtLB1.lon);
  70.  
  71. PointXY xy = new PointXY();
  72. xy.x = ; xy.y = ;
  73.  
  74. double f/*扁率*/, e/*第一偏心率*/, e_/*第二偏心率*/, NB0/*卯酉圈曲率半径*/, K, dtemp;
  75. double E = Math.Exp();
  76. if (L < -Math.PI || L > Math.PI || B < -Math.PI / || B > Math.PI / )
  77. {
  78. return xy;
  79. }
  80. if (__A <= || __B <= )
  81. {
  82. return xy;
  83. }
  84. f = (__A - __B) / __A;
  85. dtemp = - (__B / __A) * (__B / __A);
  86. if (dtemp < )
  87. {
  88. return xy;
  89. }
  90. e = Math.Sqrt(dtemp);
  91. dtemp = (__A / __B) * (__A / __B) - ;
  92. if (dtemp < )
  93. {
  94. return xy;
  95. }
  96. e_ = Math.Sqrt(dtemp);
  97. NB0 = ((__A * __A) / __B) / Math.Sqrt( + e_ * e_ * Math.Cos(__B0) * Math.Cos(__B0));
  98. K = NB0 * Math.Cos(__B0);
  99. xy.x = K * (L - __L0);
  100. xy.y = K * Math.Log(Math.Tan(Math.PI / + (B) / ) * Math.Pow(( - e * Math.Sin(B)) / ( + e * Math.Sin(B)), e / ));
  101. double y0 = K * Math.Log(Math.Tan(Math.PI / + (__B0) / ) * Math.Pow(( - e * Math.Sin(__B0)) / ( + e * Math.Sin(__B0)), e / ));
  102. xy.y = xy.y - y0;
  103.  
  104. xy.y = -xy.y;//正常的Y坐标系(向上)转程序的Y坐标系(向下)
  105.  
  106. return xy;
  107. }
  108.  
  109. /*******************************************
  110. XY坐标转经纬度
  111. pmtLB0: 参考点经纬度
  112. pmtXY: 要转换的XY坐标,单位:公里
  113. 返回值: 经纬度
  114. *******************************************/
  115. static public PointLB XYtoLB(PointLB pmtLB0, PointXY pmtXY)
  116. {
  117. SetLB0(pmtLB0.lon, pmtLB0.lat);
  118.  
  119. double X = pmtXY.x;
  120. double Y = -pmtXY.y;//程序的Y坐标系(向下)转正常的Y坐标系(向上)
  121.  
  122. double B = , L = ;
  123.  
  124. PointLB lb = new PointLB();
  125. lb.lat = ; lb.lon = ;
  126.  
  127. double f/*扁率*/, e/*第一偏心率*/, e_/*第二偏心率*/, NB0/*卯酉圈曲率半径*/, K, dtemp;
  128. double E = Math.Exp();
  129.  
  130. if (__A <= || __B <= )
  131. {
  132. return lb;
  133. }
  134. f = (__A - __B) / __A;
  135. dtemp = - (__B / __A) * (__B / __A);
  136. if (dtemp < )
  137. {
  138. return lb;
  139. }
  140. e = Math.Sqrt(dtemp);
  141. dtemp = (__A / __B) * (__A / __B) - ;
  142. if (dtemp < )
  143. {
  144. return lb;
  145. }
  146. e_ = Math.Sqrt(dtemp);
  147. NB0 = ((__A * __A) / __B) / Math.Sqrt( + e_ * e_ * Math.Cos(__B0) * Math.Cos(__B0));
  148. K = NB0 * Math.Cos(__B0);
  149.  
  150. double y0 = K * Math.Log(Math.Tan(Math.PI / + (__B0) / ) * Math.Pow(( - e * Math.Sin(__B0)) / ( + e * Math.Sin(__B0)), e / ));
  151. Y = Y + y0;
  152.  
  153. L = X / K + __L0;
  154. B = __IterativeValue;
  155.  
  156. for (int i = ; i < __IterativeTimes; i++)
  157. {
  158. B = Math.PI / - * Math.Atan(Math.Pow(E, (-Y / K)) * Math.Pow(E, (e / ) * Math.Log(( - e * Math.Sin(B)) / ( + e * Math.Sin(B)))));
  159. }
  160.  
  161. lb.lon = RadToDegree(L);
  162. lb.lat = RadToDegree(B);
  163.  
  164. return lb;
  165. }
  166. }
  167. }

墨卡托投影C#实现的更多相关文章

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

    火星坐标 火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地图.导航设备都是采用的这一坐标系或在这一坐标的基础上进行二次加密得到的.火星坐标的真实名称应该是GCJ- ...

  2. Web墨卡托投影(转)

    Google Maps地图投影全解析(1):Web墨卡托投影 Google Maps.Virtual Earth等网络地理所使用的地图投影,常被称作Web Mercator或Spherical Mer ...

  3. GIS理论(墨卡托投影、地理坐标系、地面分辨率、地图比例尺、Bing Maps Tile System)

    [注]原文 http://www.cnblogs.com/beniao/archive/2010/04/18/1714544.html 墨卡托投影(Mercator Projection),又名&qu ...

  4. 地图投影——高斯-克吕格投影、墨卡托投影和UTM投影

    地图投影(Map Projection) http://baike.baidu.com/view/94066.htm 概念: 地图投影是把地球表面的任意点,利用一定数学法则,转换到地图平面上的理论和方 ...

  5. 地球坐标系与投影方式的理解(关于北京54,西安80,WGS84;高斯,兰勃特,墨卡托投影)

    一.地球模型 地球是一个近似椭球体,测绘时用椭球模型逼近,这个模型叫做参考椭球,如下图: 赤道是一个半径为a的近似圆,任一圈经线是一个半径为b的近似圆.a称为椭球的长轴半径,b称为椭球的短轴半径. a ...

  6. 统一横轴墨卡托投影(UTM)

    UTM 坐标系统使用基于网格的方法表示坐标.UTM 系统将地球分为 60 个区,每一个区基于横轴墨卡托投影.画图法中的地图投影方法能够在平面中表示一个两维的曲面,比如一个标准地图.图 1 展示了一个横 ...

  7. 墨卡托投影坐标系(Mercator Projection)原理及实现C代码

    墨卡托投影是一种"等角正切圆柱投影",荷兰地图学家墨卡托(Mercator)在1569年拟定:假设地球被围在一个中空的圆柱里,其赤道与圆柱相接触,然后再假想地球中心有一盏灯,把球面 ...

  8. ArcGIS API for Javascript 加载天地图(墨卡托投影)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. arcgis server 中Web墨卡托投影与WGS-84坐标的转换

    arcgis server 中Web墨卡托投影坐标与WGS-84坐标的转换 //经纬度转墨卡托 function lonlat2mercator(lonlat){ var mercator={x:0, ...

  10. OpenLayers中的球面墨卡托投影

    最近看OpenLayers,研究到地图投影时找到官方的文档,就翻译了一下,由于英文能力差,翻译不好的地方,请看原文 原文地址:http://docs.openlayers.org/library/sp ...

随机推荐

  1. php获取文件名称和扩展名

    1.basename()-返回路径的文件名请看下面php代码: <?php $path = "/usr/www/html/index.php"; echo basename( ...

  2. 关于flume配置加载(二)

    为什么翻flume的代码,一方面是确实遇到了问题,另一方面是想翻一下flume的源码,看看有什么收获,现在收获还谈不上,因为要继续总结.不够已经够解决问题了,而且确实有好的代码,后续会继续慢慢分享,这 ...

  3. #uwp# XMAL

    类型转换 在xaml中对属性赋值时,会将填入的字符串转换成对应的属性类型.比如: <Button Visibility="Visible" /> 会将Visible这个 ...

  4. Java BigDecimal 加减乘除运算

    加法:add 减法:subtract 乘法:multiply 除法:divide BigDecimal bignum1 = new BigDecimal("10"); BigDec ...

  5. kubernetes多节点部署解析

    注:以下操作均基于centos7系统. 安装ansible ansilbe可以通过yum或者pip安装,由于kubernetes-ansible用到了密码,故而还需要安装sshpass: pip in ...

  6. Linux MySql install and use with c++

    1.安装mysql客户端 用命令: yum install -y mysql-server mysql mysql-devel 此命令包含了安装客户端和服务器 2.访问myslq 在命令行输入: my ...

  7. 承接Unity3D外包公司 — 技术分享

    Cardboard SDK for Unity的使用 上一篇文章作为系列的开篇,主要是讲了一些虚拟现实的技术和原理,本篇就会带领大家去看一看谷歌的Cardboard SDK for Unity,虽然目 ...

  8. 使用ffmpeg转换webm格式

    安装ffmpeg brew install ffmpeg --with-libvpx --with-libvorbis 如果已经装过 brew reinstall ffmpeg --with-libv ...

  9. day26:面向对象进阶:set、get、del反射和内置

    三 __setattr__,__delattr__,__getattr__ __开头的都是内置的,不定义系统都会有.如果自己定义的话,就会覆盖系统内置的,执行自定义的部分(是否有完成设置的语法,有的话 ...

  10. 循环写入Insert 与 SqlBulkcopy

    /* Insert by Loop */ cmd.CommandText = "insert into BizSharedStore (BizSharedStoreId,BizSharedI ...