兰勃特投影是等面积投影。

  1. static double PI = 3.1415926;
  2.  
  3. //---------------------------------------------------------------------------
  4. //根据经纬度得到xy值
  5. //lambda0,phi0,lambda,phi:基准点,目标点纬度、经度,单位度。
  6. //xi,yi:长度,米 结果单位:公里
  7. static public PointXY LBToXY(PointLB pmtLonLat0, PointLB pmtLonLat1)
  8. {
  9. PointXY result;
  10. double mm, mm0;
  11. double aa, aa2, aa3, aa4, aa5, aa6;
  12. double ep2, nn, tt, cc;
  13. double lambda0, phi0, lambda, phi;
  14.  
  15. const double k0 = 0.9996;
  16. const double a = 6378137.0; //地球椭球长半轴,WGS-84基准面参数(单位公里)
  17. //b :double = 6356.75231425; //地球椭球短半轴,WGS-84基准面参数(单位公里)
  18. //f :double = 0.00335281066399172; //扁平率,由a,b算出 f := 1 - (b/a);
  19. //e :double = 0.0818191908334155; //偏心率,由f算出 sqrt(e2)
  20. const double e2 = 0.00669437998863487; //e*e e2 := 2*f - f*f;
  21. const double e4 = 4.4814723432235E-5; //e2*e2
  22. const double e6 = 3.0000678774096E-7; //e4*e2
  23. //e8 :double = 2.00835943630771E-9; //e4*e4
  24. // const double PI=3.1415926535897;
  25.  
  26. lambda0 = pmtLonLat0.lon;
  27. phi0 = pmtLonLat0.lat;
  28. lambda = pmtLonLat1.lon;
  29. phi = pmtLonLat1.lat;
  30. double x, y;
  31. x = ;
  32. y = ;
  33.  
  34. //基准经度
  35. lambda0 = lambda0 * PI / 180.0;
  36. phi0 = phi0 * PI / 180.0;
  37.  
  38. //转为弧度
  39. lambda = lambda * PI / 180.0; //经度
  40. phi = phi * PI / 180.0; //纬度
  41.  
  42. mm = a * ((1.0 - e2 / 4.0 - 3.0 * e4 / 64.0 - 5.0 * e6 / 256.0) * phi -
  43. (3.0 * e2 / 8.0 + 3.0 * e4 / 32.0 + 45.0 * e6 / 1024.0) * Math.Sin(2.0 * phi) +
  44. (15.0 * e4 / 256.0 + 45.0 * e6 / 1024.0) * Math.Sin(4.0 * phi) -
  45. (35.0 * e6 / 3072.0) * Math.Sin(6.0 * phi));
  46.  
  47. mm0 = a * ((1.0 - e2 / 4.0 - 3.0 * e4 / 64.0 - 5.0 * e6 / 256.0) * phi0 -
  48. (3.0 * e2 / 8.0 + 3.0 * e4 / 32.0 + 45.0 * e6 / 1024.0) * Math.Sin(2.0 * phi0) +
  49. (15.0 * e4 / 256.0 + 45.0 * e6 / 1024.0) * Math.Sin(4.0 * phi0) -
  50. (35.0 * e6 / 3072.0) * Math.Sin(6.0 * phi0));
  51.  
  52. aa = (lambda - lambda0) * Math.Cos(phi);
  53. aa2 = aa * aa;
  54. aa3 = aa2 * aa;
  55. aa4 = aa2 * aa2;
  56. aa5 = aa4 * aa;
  57. aa6 = aa3 * aa3;
  58.  
  59. ep2 = e2 / ( - e2);
  60. nn = a / Math.Sqrt( - e2 * Math.Sin(phi) * Math.Sin(phi));
  61. tt = Math.Tan(phi) * Math.Tan(phi);
  62. cc = ep2 * Math.Cos(phi) * Math.Cos(phi);
  63.  
  64. x = k0 * nn * (aa + ( - tt + cc) * aa3 / 6.0 +
  65. (5.0 - 18.0 * tt + tt * tt + * cc - 58.0 * ep2) * aa5 / 120.0);
  66. y = k0 * (mm - mm0 + nn * Math.Tan(phi) * (aa2 / 2.0 + (5.0 - tt + 9.0 * cc + 4.0 * cc * cc) * aa4 / 24.0 +
  67. (61.0 - 58.0 * tt + tt * tt + 600.0 * cc - 330.0 * ep2) * aa6 / 720.0));
  68. y = -y;
  69.  
  70. result.x = x * 1.0 / 1000.0;
  71. result.y = y * 1.0 / 1000.0;
  72.  
  73. return result;
  74. }
  75.  
  76. //根据xy值获得经纬度,采用UTM投影,WGS-84(GPS standard)地球数据
  77. //lambda0,phi0:基准点纬度、经度,单位度,
  78. //lambda:经度 phi:纬度单位度
  79. //p1为离p0点的距离(公里)
  80. static public PointLB XYtoLB(PointLB p0, PointXY p1)
  81. {
  82. PointLB result;
  83. double phi1;
  84. double x, y, e1, e12, e13, e14;
  85. double mm, mm0, mu, ep2, cc1, tt1, nn1, rr1;
  86. double dd, dd2, dd3, dd4, dd5, dd6;
  87.  
  88. double phi, lambda, lambda0, phi0;
  89.  
  90. const double k0 = 0.9996;
  91. const double a = 6378137.0; //地球椭球长半轴,WGS-84基准面参数(单位公里)
  92. const double e2 = 0.00669437998863487; //e*e e2 := 2*f - f*f;
  93. const double e4 = 4.4814723432235E-5; //e2*e2
  94. const double e6 = 3.0000678774096E-7; //e4*e2
  95. const double pi = 3.1415926535897;
  96.  
  97. phi = -1.0;
  98. lambda = -1.0;
  99. lambda0 = p0.lon;
  100. phi0 = p0.lat;
  101.  
  102. lambda0 = lambda0 * pi / 180.0; //基准点经度,由度转为弧度
  103. phi0 = phi0 * pi / 180.0; //基准点纬度,当phi0为零时即为UTM投影,以赤道做为基准点
  104.  
  105. x = p1.x * 1000.0; //得到离基准点真实x值
  106. y = -p1.y * 1000.0; //得到离基准点真实y值
  107.  
  108. e1 = ( - Math.Sqrt( - e2)) / ( + Math.Sqrt( - e2));
  109. e12 = e1 * e1;
  110. e13 = e1 * e12;
  111. e14 = e12 * e12;
  112.  
  113. mm0 = a * (( - e2 / 4.0 - 3.0 * e4 / 64.0 - 5.0 * e6 / 256.0) * phi0 -
  114. (3.0 * e2 / 8.0 + 3.0 * e4 / 32.0 + 45.0 * e6 / 1024.0) * Math.Sin(2.0 * phi0) +
  115. (15.0 * e4 / 256.0 + 45.0 * e6 / 1024.0) * Math.Sin(4.0 * phi0) -
  116. (35.0 * e6 / 3072.0) * Math.Sin(6.0 * phi0));
  117. mm = mm0 + y / k0;
  118. mu = mm / (a * (1.0 - e2 / 4.0 - 3.0 * e4 / 64.0 - 5.0 * e6 / 256.0));
  119.  
  120. phi1 = mu + (3.0 * e1 / 2.0 - 27.0 * e13 / 32.0) * Math.Sin(2.0 * mu) +
  121. (21.0 * e12 / 16.0 - 55.0 * e14 / 32.0) * Math.Sin(4.0 * mu) +
  122. (151.0 * e13 / 96.0) * Math.Sin(6.0 * mu) +
  123. (1097.0 * e14 / 512.0) * Math.Sin(8.0 * mu);
  124.  
  125. // 计算lambda 和 phi
  126. ep2 = e2 / (1.0 - e2);
  127. cc1 = ep2 * Math.Cos(phi1) * Math.Cos(phi1);
  128. tt1 = Math.Tan(phi1) * Math.Tan(phi1);
  129. nn1 = a / Math.Sqrt(1.0 - e2 * Math.Sin(phi1) * Math.Sin(phi1));
  130. rr1 = a * (1.0 - e2) / Math.Pow(1.0 - e2 * Math.Sin(phi1) * Math.Sin(phi1), 1.5);
  131. dd = x / (nn1 * k0);
  132.  
  133. dd2 = dd * dd;
  134. dd3 = dd * dd2;
  135. dd4 = dd2 * dd2;
  136. dd5 = dd3 * dd2;
  137. dd6 = dd4 * dd2;
  138.  
  139. lambda = lambda0 + (dd - (1.0 + 2.0 * tt1 + cc1) * dd3 / 6.0 +
  140. (5.0 - 2.0 * cc1 + 28.0 * tt1 - 3.0 * cc1 * cc1 + 8.0 * ep2 + * tt1 * tt1) * dd5 / 120.0) / Math.Cos(phi1);
  141. phi = phi1 - (nn1 * Math.Tan(phi1) / rr1) *
  142. (dd2 / 2.0 - (5.0 + 3.0 * tt1 + 10.0 * cc1 - 4.0 * cc1 * cc1 - 9.0 * ep2) * dd4 / 24.0 +
  143. (61.0 + 90.0 * tt1 + 298.0 * cc1 + 45.0 * tt1 * tt1 - 252.0 * ep2 - 3.0 * cc1 * cc1) * dd6 / 720.0);
  144.  
  145. //转为度
  146. result.lon = lambda * 180.0 / pi; //经度
  147. result.lat = phi * 180.0 / pi; //纬度
  148.  
  149. return result;
  150. }

兰勃特投影C#实现的更多相关文章

  1. 多种坐标系之间的转换 Proj.NET和DotSpatial

    Proj.NET ( http://projnet.codeplex.com/)是一个.NET下开源的空间参照和投影引擎,遵循OGC相关标准.负责人(Coordinators )是D_Guidi 和S ...

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

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

  3. Proj.Net 投影介绍

    Proj.Net是开源地图投影库Proj.4的.net版本,许多GIS开源软件的投影都直接或间接地使用Proj.4的库,Proj.4是用C语言编写..Net下的开源GIS项目NetTopologySu ...

  4. GIS中的坐标系定义与转换

    GIS中的坐标系定义与转换 青岛海洋地质研究所 戴勤奋 2002-3-27 14:22:47 ----------------------------------------------------- ...

  5. 地图投影与ArcGIS坐标系转换

    1. 通常GIS项目涉及到的坐标系 (1)面向局部区域的大比例尺二维平面:高斯投影(横轴墨卡托) 说明:在市一级的小范围区域的GIS系统,比如规划局.国土局.建设局的系统,大都使用高斯投影,以便与地方 ...

  6. Polar 投影c#版本移植

    from:http://hi.baidu.com/sungaoyong/item/0c4584d25873f131e3108f05 ///刘泽军java版本的极坐标投影c#版本的移植 using Sy ...

  7. GIS面试小知识点

    1.什么是地理信息系统?简述其基本功能 它是随着地理科学.计算机技术.遥感技术和信息科学的发展而产生的一门科学.就应用而言,是对空间数据进行  组织.管理.分析.显示  的系统.其实本质上它探讨的就是 ...

  8. GIS中地图投影的定义

    我国的基本比例尺地形图[1:5千.1:1万.1:2.5万.1:5万.1:10万.1:25万.1:50万.1:100万]中,大于等于50万的均采用高斯-克吕格投影[Gauss-Kruger]:小于50万 ...

  9. GIS坐标系测绘原理:大地水准面/基准面/参考椭球体/EPSG/SRI/WKT

    预热文章系列:<GIS历史概述与WebGis应用开发技术浅解>.<GIS坐标系:WGS84,GCJ02,BD09,火星坐标,大地坐标等解析说与转换>.<OGC标准WMTS ...

随机推荐

  1. R中根据匹配原则将一列拆分为几列的方法

    例如我们需要将一下数据的第二列从and处拆分为两列: before = data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar ...

  2. Bitbucket使用方法

    一.软件及SSH keys: 由于我的Bitbucket账号的邮箱及用户名与Github相同,所以SSH Public Keys可以用Github的,登录Bitbucket,悬浮在用户名boliqua ...

  3. Cardinality Feedback

    该特性主要针对 统计信息陈旧.无直方图或虽然有直方图但仍基数计算不准确的情况, Cardinality基数的计算直接影响到后续的JOIN COST等重要的成本计算评估,造成CBO选择不当的执行计划 O ...

  4. Android——ScrollView

    1.activity_scrollview.xml <?xml version="1.0" encoding="utf-8"?><Scroll ...

  5. Integer cache

    View.findViewById采用深度遍历,找到第一个匹配的控件 Integer Cache public static void testIntegerCache() { Class cache ...

  6. 移植ok6410

    tftp u-boot.bin http://blog.csdn.net/link_hui/article/details/5593518 LED driver http://blog.csdn.ne ...

  7. unity3d学习重点记录

    本文主要是记录在学习unity3d中遇到的重点功能的实现,以及一些API的使用方法.以便在以后使用到的时候查找. 1,给一个UIButton添加执行的事件 // Use this for initia ...

  8. matlab读取txt文档中的数据

    ps:文件中只有数字! format long fp=fopen('文件路径','打开方式(r)') [num,count]=fscnaf(fp,'%f')

  9. 8051学习笔记——AD

    AD.C #include<reg52.h> #include <iic.h> #define PCF8591 0x90 //PCF8591 地址 sbit LS138A=P2 ...

  10. js的捕捉事件,冒泡事件

    冒泡事件可以查询上个随笔, 捕捉事件正好和冒泡时间正反着 所以这代码我把冒泡事件注释, html和css的内容 <style type="text/css"> #box ...