墨卡托投影C#实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace MRP
{
public class ClassMct
{
static public int __IterativeTimes = ; //反向转换程序中的迭代次数
static public double __IterativeValue = ; //反向转换程序中的迭代初始值
static public double __A = 6378.137; //椭球体长轴,千米
static public double __B = 6356.752314; //椭球体短轴,千米
static public double __B0 = ; //标准纬度,弧度
static public double __L0 = ; //原点经度,弧度 //角度到弧度的转换
static public double DegreeToRad(double degree)
{
return Math.PI * degree / ;
} //弧度到角度的转换
static public double RadToDegree(double rad)
{
return ( * rad) / Math.PI;
} //设定__A与__B
static public void SetAB(double a, double b)
{
if (a <= || b <= )
{
return;
}
__A = a;
__B = b;
}
//设定__B0
static public void SetLB0(double pmtL0, double pmtB0)
{
double l0 = DegreeToRad(pmtL0);
if (l0 < -Math.PI || l0 > Math.PI)
{
return;
}
__L0 = l0; double b0 = DegreeToRad(pmtB0);
if (b0 < -Math.PI / || b0 > Math.PI / )
{
return;
}
__B0 = b0;
} /*******************************************
经纬度转XY坐标
pmtLB0: 参考点经纬度
pmtLB1: 要转换的经纬度
返回值: 直角坐标,单位:公里
*******************************************/
static public PointXY LBToXY(PointLB pmtLB0, PointLB pmtLB1)
{
SetLB0(pmtLB0.lon, pmtLB0.lat); double B = DegreeToRad(pmtLB1.lat);
double L = DegreeToRad(pmtLB1.lon); PointXY xy = new PointXY();
xy.x = ; xy.y = ; double f/*扁率*/, e/*第一偏心率*/, e_/*第二偏心率*/, NB0/*卯酉圈曲率半径*/, K, dtemp;
double E = Math.Exp();
if (L < -Math.PI || L > Math.PI || B < -Math.PI / || B > Math.PI / )
{
return xy;
}
if (__A <= || __B <= )
{
return xy;
}
f = (__A - __B) / __A;
dtemp = - (__B / __A) * (__B / __A);
if (dtemp < )
{
return xy;
}
e = Math.Sqrt(dtemp);
dtemp = (__A / __B) * (__A / __B) - ;
if (dtemp < )
{
return xy;
}
e_ = Math.Sqrt(dtemp);
NB0 = ((__A * __A) / __B) / Math.Sqrt( + e_ * e_ * Math.Cos(__B0) * Math.Cos(__B0));
K = NB0 * Math.Cos(__B0);
xy.x = K * (L - __L0);
xy.y = K * Math.Log(Math.Tan(Math.PI / + (B) / ) * Math.Pow(( - e * Math.Sin(B)) / ( + e * Math.Sin(B)), e / ));
double y0 = K * Math.Log(Math.Tan(Math.PI / + (__B0) / ) * Math.Pow(( - e * Math.Sin(__B0)) / ( + e * Math.Sin(__B0)), e / ));
xy.y = xy.y - y0; xy.y = -xy.y;//正常的Y坐标系(向上)转程序的Y坐标系(向下) return xy;
} /*******************************************
XY坐标转经纬度
pmtLB0: 参考点经纬度
pmtXY: 要转换的XY坐标,单位:公里
返回值: 经纬度
*******************************************/
static public PointLB XYtoLB(PointLB pmtLB0, PointXY pmtXY)
{
SetLB0(pmtLB0.lon, pmtLB0.lat); double X = pmtXY.x;
double Y = -pmtXY.y;//程序的Y坐标系(向下)转正常的Y坐标系(向上) double B = , L = ; PointLB lb = new PointLB();
lb.lat = ; lb.lon = ; double f/*扁率*/, e/*第一偏心率*/, e_/*第二偏心率*/, NB0/*卯酉圈曲率半径*/, K, dtemp;
double E = Math.Exp(); if (__A <= || __B <= )
{
return lb;
}
f = (__A - __B) / __A;
dtemp = - (__B / __A) * (__B / __A);
if (dtemp < )
{
return lb;
}
e = Math.Sqrt(dtemp);
dtemp = (__A / __B) * (__A / __B) - ;
if (dtemp < )
{
return lb;
}
e_ = Math.Sqrt(dtemp);
NB0 = ((__A * __A) / __B) / Math.Sqrt( + e_ * e_ * Math.Cos(__B0) * Math.Cos(__B0));
K = NB0 * Math.Cos(__B0); double y0 = K * Math.Log(Math.Tan(Math.PI / + (__B0) / ) * Math.Pow(( - e * Math.Sin(__B0)) / ( + e * Math.Sin(__B0)), e / ));
Y = Y + y0; L = X / K + __L0;
B = __IterativeValue; for (int i = ; i < __IterativeTimes; i++)
{
B = Math.PI / - * Math.Atan(Math.Pow(E, (-Y / K)) * Math.Pow(E, (e / ) * Math.Log(( - e * Math.Sin(B)) / ( + e * Math.Sin(B)))));
} lb.lon = RadToDegree(L);
lb.lat = RadToDegree(B); return lb;
}
}
}
墨卡托投影C#实现的更多相关文章
- 火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版
火星坐标 火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地图.导航设备都是采用的这一坐标系或在这一坐标的基础上进行二次加密得到的.火星坐标的真实名称应该是GCJ- ...
- Web墨卡托投影(转)
Google Maps地图投影全解析(1):Web墨卡托投影 Google Maps.Virtual Earth等网络地理所使用的地图投影,常被称作Web Mercator或Spherical Mer ...
- GIS理论(墨卡托投影、地理坐标系、地面分辨率、地图比例尺、Bing Maps Tile System)
[注]原文 http://www.cnblogs.com/beniao/archive/2010/04/18/1714544.html 墨卡托投影(Mercator Projection),又名&qu ...
- 地图投影——高斯-克吕格投影、墨卡托投影和UTM投影
地图投影(Map Projection) http://baike.baidu.com/view/94066.htm 概念: 地图投影是把地球表面的任意点,利用一定数学法则,转换到地图平面上的理论和方 ...
- 地球坐标系与投影方式的理解(关于北京54,西安80,WGS84;高斯,兰勃特,墨卡托投影)
一.地球模型 地球是一个近似椭球体,测绘时用椭球模型逼近,这个模型叫做参考椭球,如下图: 赤道是一个半径为a的近似圆,任一圈经线是一个半径为b的近似圆.a称为椭球的长轴半径,b称为椭球的短轴半径. a ...
- 统一横轴墨卡托投影(UTM)
UTM 坐标系统使用基于网格的方法表示坐标.UTM 系统将地球分为 60 个区,每一个区基于横轴墨卡托投影.画图法中的地图投影方法能够在平面中表示一个两维的曲面,比如一个标准地图.图 1 展示了一个横 ...
- 墨卡托投影坐标系(Mercator Projection)原理及实现C代码
墨卡托投影是一种"等角正切圆柱投影",荷兰地图学家墨卡托(Mercator)在1569年拟定:假设地球被围在一个中空的圆柱里,其赤道与圆柱相接触,然后再假想地球中心有一盏灯,把球面 ...
- ArcGIS API for Javascript 加载天地图(墨卡托投影)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- arcgis server 中Web墨卡托投影与WGS-84坐标的转换
arcgis server 中Web墨卡托投影坐标与WGS-84坐标的转换 //经纬度转墨卡托 function lonlat2mercator(lonlat){ var mercator={x:0, ...
- OpenLayers中的球面墨卡托投影
最近看OpenLayers,研究到地图投影时找到官方的文档,就翻译了一下,由于英文能力差,翻译不好的地方,请看原文 原文地址:http://docs.openlayers.org/library/sp ...
随机推荐
- 【ZOJ1003】Crashing Balloon(DFS)
Crashing Balloon Time Limit: 2 Seconds Memory Limit: 65536 KB On every June 1st, the Children's ...
- WEKA运行LIBSVM出现problem evaluating classifier:rand
原来这个实验已经做了的.也出现了些问题,但是上网找到了解决方法,那个时候是完成数据挖掘的课程论文,用WEKA运行LIBSVM,也没有很深入,简单跑出结果就算了. 这次想着研讨会就讲这个,想着深入进去, ...
- nginx beginners_guide
http://nginx.org/en/docs/beginners_guide.html https://www.nginx.com/resources/wiki/start/topics/tuto ...
- OPENVPN
安装 方法1--源码安装yum -y install pam pam-devel gcc gcc-c++ lzo lzo-devel openssl openssl-devel wget autom ...
- java1234教程系列笔记 S1 Java SE 0101 HelloWorld
本节分为三讲.java概览,第二节讲了安装jdk 配置环境变量 第三节讲了经典的hello world 1.新建一个txt文本 public class chapter0102{ public sta ...
- kali 初始化
关于kali使用前的一些配置,网上有很多版本,但是几乎都很雷同,或者是不全,或者是根本就没有测试过,或者是有的方法是错的(换句话说是版本变化的差异),因此让很多人接触kali时百度无数,效果一般,浪费 ...
- 在CentOS 6.x中支持exfat格式的U盘(移动硬盘)
参考资料:http://linux.cn/article-1503-1.html CentOS系列一直没有默认支持使用exfat格式的大容量U盘(移动硬盘),但可以通过添加fuse-exfat模块来支 ...
- [PHP] - Laravel 5 的 Hello Wold
吐槽一段 整了半天,Laravel下载麻烦得可以去死.先要安装composer,而composer又被共墙了,之后又要安装git,安装完git还要注册git,等等.... 最终放弃这种玩法,太恶心了. ...
- Inno Setup制作安装包的几个问题
1. 卸载时,如何判断应用程序是否运行 InnoSetup 提供变量AppMutex,用来保存应用程序的Mutex名称.现在很多应用程序都是唯一实例运行.这样避免配置文件被错误修改以及其他很多衍 ...
- Map以及Set的遍历(EntrySet方法,补充enumeration和Iterator的区别)
public void mearge(Map map) { Map returnMap = new HashMap<>(); // 转换为Entry Set<Map.Entry< ...