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#实现的更多相关文章

  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. select 触发事件

    需求:现在需要获取用户选择的选项,同时获取里面自定义的字段. 因为option没法设置事件 <select class="form-control js-example-basic-s ...

  2. [转载]Eclipse调试Java的10个技巧

    原文:http://www.oschina.net/question/82993_69439 我也特别喜欢的是Drop to frame. 在看这篇文章前,我推荐你看一下Eclipse 快捷键手册,我 ...

  3. DSP中.gel文件的作用

    GEL是CCS提供的一种解释语言,使用该语言写出的GEL,函数具有两在功能,一是配置CCS工作环境,二是直接访问目标处理器DSP(包括DSP软/硬仿真器).用户可以使用GEL函数完成类似于宏操作的自动 ...

  4. highchart 中数据千分位显示为空格而不是逗号的解决方案

    thousandsSep: String   一千的分隔符 在highcharts.js 中找到  thousandsSep位置,把"" 改为  ","

  5. 【java】之对List中每个对象元素按时间顺序排序

    import java.text.SimpleDateFormat; import java.util.*; public class ListSort { public static class U ...

  6. python 中__name__ = '__main__' 的作用

    有句话经典的概括了这段代码的意义: "Make a script both importable and executable" 意思就是说让你写的脚本模块既可以导入到别的模块中用 ...

  7. Android EditText输入格式设置

    在开发的过程中,通常会用到EditText,如何让虚拟键盘来适应输入框中内容的类型,通常我们都会在xml文件中加入android:inputType="". android:inp ...

  8. 网购vs实体店购物 [20161226]

    2016这一年依然网购了许多商品,比起以往,我选择退货的次数更多了. 以前如果网购到尺码或者样式不合适的东西,有时候将就拿去用,没有选择退货.由此闲置了不少衣物,而且延续高中时喜欢穿大一号的衣服的习惯 ...

  9. Python 配置日志

    Python 2.6+ def cfgLogging(): from logging.handlers import RotatingFileHandler console = logging.Str ...

  10. 04-c#入门(类型转换)

    “无论是什么类型,所有的数据都是一系列的位,即一系列0和1.变量的含义是通过解释这些数据的方式来传达的.”——这句原话是书上翻译的,不过后一句话总感觉理解起来不是很通俗,自己觉得这样理解可能会合适些: ...