兰勃特投影C#实现
兰勃特投影是等面积投影。
static double PI = 3.1415926; //---------------------------------------------------------------------------
//根据经纬度得到xy值
//lambda0,phi0,lambda,phi:基准点,目标点纬度、经度,单位度。
//xi,yi:长度,米 结果单位:公里
static public PointXY LBToXY(PointLB pmtLonLat0, PointLB pmtLonLat1)
{
PointXY result;
double mm, mm0;
double aa, aa2, aa3, aa4, aa5, aa6;
double ep2, nn, tt, cc;
double lambda0, phi0, lambda, phi; const double k0 = 0.9996;
const double a = 6378137.0; //地球椭球长半轴,WGS-84基准面参数(单位公里)
//b :double = 6356.75231425; //地球椭球短半轴,WGS-84基准面参数(单位公里)
//f :double = 0.00335281066399172; //扁平率,由a,b算出 f := 1 - (b/a);
//e :double = 0.0818191908334155; //偏心率,由f算出 sqrt(e2)
const double e2 = 0.00669437998863487; //e*e e2 := 2*f - f*f;
const double e4 = 4.4814723432235E-5; //e2*e2
const double e6 = 3.0000678774096E-7; //e4*e2
//e8 :double = 2.00835943630771E-9; //e4*e4
// const double PI=3.1415926535897; lambda0 = pmtLonLat0.lon;
phi0 = pmtLonLat0.lat;
lambda = pmtLonLat1.lon;
phi = pmtLonLat1.lat;
double x, y;
x = ;
y = ; //基准经度
lambda0 = lambda0 * PI / 180.0;
phi0 = phi0 * PI / 180.0; //转为弧度
lambda = lambda * PI / 180.0; //经度
phi = phi * PI / 180.0; //纬度 mm = a * ((1.0 - e2 / 4.0 - 3.0 * e4 / 64.0 - 5.0 * e6 / 256.0) * phi -
(3.0 * e2 / 8.0 + 3.0 * e4 / 32.0 + 45.0 * e6 / 1024.0) * Math.Sin(2.0 * phi) +
(15.0 * e4 / 256.0 + 45.0 * e6 / 1024.0) * Math.Sin(4.0 * phi) -
(35.0 * e6 / 3072.0) * Math.Sin(6.0 * phi)); mm0 = a * ((1.0 - e2 / 4.0 - 3.0 * e4 / 64.0 - 5.0 * e6 / 256.0) * phi0 -
(3.0 * e2 / 8.0 + 3.0 * e4 / 32.0 + 45.0 * e6 / 1024.0) * Math.Sin(2.0 * phi0) +
(15.0 * e4 / 256.0 + 45.0 * e6 / 1024.0) * Math.Sin(4.0 * phi0) -
(35.0 * e6 / 3072.0) * Math.Sin(6.0 * phi0)); aa = (lambda - lambda0) * Math.Cos(phi);
aa2 = aa * aa;
aa3 = aa2 * aa;
aa4 = aa2 * aa2;
aa5 = aa4 * aa;
aa6 = aa3 * aa3; ep2 = e2 / ( - e2);
nn = a / Math.Sqrt( - e2 * Math.Sin(phi) * Math.Sin(phi));
tt = Math.Tan(phi) * Math.Tan(phi);
cc = ep2 * Math.Cos(phi) * Math.Cos(phi); x = k0 * nn * (aa + ( - tt + cc) * aa3 / 6.0 +
(5.0 - 18.0 * tt + tt * tt + * cc - 58.0 * ep2) * aa5 / 120.0);
y = k0 * (mm - mm0 + nn * Math.Tan(phi) * (aa2 / 2.0 + (5.0 - tt + 9.0 * cc + 4.0 * cc * cc) * aa4 / 24.0 +
(61.0 - 58.0 * tt + tt * tt + 600.0 * cc - 330.0 * ep2) * aa6 / 720.0));
y = -y; result.x = x * 1.0 / 1000.0;
result.y = y * 1.0 / 1000.0; return result;
} //根据xy值获得经纬度,采用UTM投影,WGS-84(GPS standard)地球数据
//lambda0,phi0:基准点纬度、经度,单位度,
//lambda:经度 phi:纬度单位度
//p1为离p0点的距离(公里)
static public PointLB XYtoLB(PointLB p0, PointXY p1)
{
PointLB result;
double phi1;
double x, y, e1, e12, e13, e14;
double mm, mm0, mu, ep2, cc1, tt1, nn1, rr1;
double dd, dd2, dd3, dd4, dd5, dd6; double phi, lambda, lambda0, phi0; const double k0 = 0.9996;
const double a = 6378137.0; //地球椭球长半轴,WGS-84基准面参数(单位公里)
const double e2 = 0.00669437998863487; //e*e e2 := 2*f - f*f;
const double e4 = 4.4814723432235E-5; //e2*e2
const double e6 = 3.0000678774096E-7; //e4*e2
const double pi = 3.1415926535897; phi = -1.0;
lambda = -1.0;
lambda0 = p0.lon;
phi0 = p0.lat; lambda0 = lambda0 * pi / 180.0; //基准点经度,由度转为弧度
phi0 = phi0 * pi / 180.0; //基准点纬度,当phi0为零时即为UTM投影,以赤道做为基准点 x = p1.x * 1000.0; //得到离基准点真实x值
y = -p1.y * 1000.0; //得到离基准点真实y值 e1 = ( - Math.Sqrt( - e2)) / ( + Math.Sqrt( - e2));
e12 = e1 * e1;
e13 = e1 * e12;
e14 = e12 * e12; mm0 = a * (( - e2 / 4.0 - 3.0 * e4 / 64.0 - 5.0 * e6 / 256.0) * phi0 -
(3.0 * e2 / 8.0 + 3.0 * e4 / 32.0 + 45.0 * e6 / 1024.0) * Math.Sin(2.0 * phi0) +
(15.0 * e4 / 256.0 + 45.0 * e6 / 1024.0) * Math.Sin(4.0 * phi0) -
(35.0 * e6 / 3072.0) * Math.Sin(6.0 * phi0));
mm = mm0 + y / k0;
mu = mm / (a * (1.0 - e2 / 4.0 - 3.0 * e4 / 64.0 - 5.0 * e6 / 256.0)); phi1 = mu + (3.0 * e1 / 2.0 - 27.0 * e13 / 32.0) * Math.Sin(2.0 * mu) +
(21.0 * e12 / 16.0 - 55.0 * e14 / 32.0) * Math.Sin(4.0 * mu) +
(151.0 * e13 / 96.0) * Math.Sin(6.0 * mu) +
(1097.0 * e14 / 512.0) * Math.Sin(8.0 * mu); // 计算lambda 和 phi
ep2 = e2 / (1.0 - e2);
cc1 = ep2 * Math.Cos(phi1) * Math.Cos(phi1);
tt1 = Math.Tan(phi1) * Math.Tan(phi1);
nn1 = a / Math.Sqrt(1.0 - e2 * Math.Sin(phi1) * Math.Sin(phi1));
rr1 = a * (1.0 - e2) / Math.Pow(1.0 - e2 * Math.Sin(phi1) * Math.Sin(phi1), 1.5);
dd = x / (nn1 * k0); dd2 = dd * dd;
dd3 = dd * dd2;
dd4 = dd2 * dd2;
dd5 = dd3 * dd2;
dd6 = dd4 * dd2; lambda = lambda0 + (dd - (1.0 + 2.0 * tt1 + cc1) * dd3 / 6.0 +
(5.0 - 2.0 * cc1 + 28.0 * tt1 - 3.0 * cc1 * cc1 + 8.0 * ep2 + * tt1 * tt1) * dd5 / 120.0) / Math.Cos(phi1);
phi = phi1 - (nn1 * Math.Tan(phi1) / rr1) *
(dd2 / 2.0 - (5.0 + 3.0 * tt1 + 10.0 * cc1 - 4.0 * cc1 * cc1 - 9.0 * ep2) * dd4 / 24.0 +
(61.0 + 90.0 * tt1 + 298.0 * cc1 + 45.0 * tt1 * tt1 - 252.0 * ep2 - 3.0 * cc1 * cc1) * dd6 / 720.0); //转为度
result.lon = lambda * 180.0 / pi; //经度
result.lat = phi * 180.0 / pi; //纬度 return result;
}
兰勃特投影C#实现的更多相关文章
- 多种坐标系之间的转换 Proj.NET和DotSpatial
Proj.NET ( http://projnet.codeplex.com/)是一个.NET下开源的空间参照和投影引擎,遵循OGC相关标准.负责人(Coordinators )是D_Guidi 和S ...
- 地球坐标系与投影方式的理解(关于北京54,西安80,WGS84;高斯,兰勃特,墨卡托投影)
一.地球模型 地球是一个近似椭球体,测绘时用椭球模型逼近,这个模型叫做参考椭球,如下图: 赤道是一个半径为a的近似圆,任一圈经线是一个半径为b的近似圆.a称为椭球的长轴半径,b称为椭球的短轴半径. a ...
- Proj.Net 投影介绍
Proj.Net是开源地图投影库Proj.4的.net版本,许多GIS开源软件的投影都直接或间接地使用Proj.4的库,Proj.4是用C语言编写..Net下的开源GIS项目NetTopologySu ...
- GIS中的坐标系定义与转换
GIS中的坐标系定义与转换 青岛海洋地质研究所 戴勤奋 2002-3-27 14:22:47 ----------------------------------------------------- ...
- 地图投影与ArcGIS坐标系转换
1. 通常GIS项目涉及到的坐标系 (1)面向局部区域的大比例尺二维平面:高斯投影(横轴墨卡托) 说明:在市一级的小范围区域的GIS系统,比如规划局.国土局.建设局的系统,大都使用高斯投影,以便与地方 ...
- Polar 投影c#版本移植
from:http://hi.baidu.com/sungaoyong/item/0c4584d25873f131e3108f05 ///刘泽军java版本的极坐标投影c#版本的移植 using Sy ...
- GIS面试小知识点
1.什么是地理信息系统?简述其基本功能 它是随着地理科学.计算机技术.遥感技术和信息科学的发展而产生的一门科学.就应用而言,是对空间数据进行 组织.管理.分析.显示 的系统.其实本质上它探讨的就是 ...
- GIS中地图投影的定义
我国的基本比例尺地形图[1:5千.1:1万.1:2.5万.1:5万.1:10万.1:25万.1:50万.1:100万]中,大于等于50万的均采用高斯-克吕格投影[Gauss-Kruger]:小于50万 ...
- GIS坐标系测绘原理:大地水准面/基准面/参考椭球体/EPSG/SRI/WKT
预热文章系列:<GIS历史概述与WebGis应用开发技术浅解>.<GIS坐标系:WGS84,GCJ02,BD09,火星坐标,大地坐标等解析说与转换>.<OGC标准WMTS ...
随机推荐
- bug_ _ 常见的bug1
===== 3 java.lang.reflect.InvocationTargetException 异常解决方法 在做djunit测试的时候,发生下面异常: java.lang.reflec ...
- Yii2.0 实现三级联动 [ 2.0 版本 ]
view中代码 <?php use yii\bootstrap\ActiveForm; /* @var $this yii\web\View */ /* @var $form yii\boots ...
- Xcode5创建自己的静态库详解
首先声明: 本人屌丝一枚,如有不对不妥之处,请大牛指正! 1.静态库工程的建立: Xcode New一个新的project,选择IOS下面的Framework&Library,下面有一个Coc ...
- 一步步教你如何把电脑设置U盘启动(图解教程)
一.我们先来说说如何进入 BIOS设置程序: 在开机时按下特定的热键可以进入BIOS设置程序,不同类型的机器进入BIOS设置程序的按键不同,有的在屏幕上给出提示,有的不给出提示,几种常见的BIOS设置 ...
- C++学习21 基类和派生类的赋值
在C/C++中,经常会发生数据类型转换,例如整型数据可以赋值给浮点型变量,在赋值之前,先把整型数据转换为浮点型:反过来,浮点型数据也可以赋值给整型变量. 数据类型转换的前提是,编译器知道如何对数据进行 ...
- 栅格系统不是要包裹在container里面吗
栅格系统不是要包裹在container里面吗 为什么直接设置col-sm 在form表单中 不是应该这样么 <form> <div class="container&quo ...
- python 之编码问题详解
前在一个项目中遇到用post提交一个xml,xml中含有中文,对于单独的py文件,使用urllib2.urlopen完全ok,但在django中使用就一直报编码错误,然后在网上看到这篇文章不错,决定m ...
- SVN提交数据失败问题(提示 svn:MKACTIVITY ... 403 Forbidden )
注册了淘宝svn,结果在代码提交是老是出问题,如下截图所示: 网上有常用的一种方法是: http://jingyan.baidu.com/article/67508eb4d3f2e29ccb1ce47 ...
- nyoj 105 九的余数
点击打开链接 九的余数 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在给你一个自然数n,它的位数小于等于一百万,现在你要做的就是求出这个数整除九之后的余数. 输入 ...
- linux下udp编程
#include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #include<netine ...