UTM投影正转算法实现 UTM to Decimal Degree

不用proj4来实现的方法。有点复杂,借用的网上的一个资料。

 

如下是稍微改动过的c#版本

 

private void LLtoUTM(double a, double f, double Lat, double Long, double LongOrigin, double FN, out double UTMNorthing, out double UTMEasting)
        {           
            double eSquare = (2 * f - f * f);
            double k0 = 0.9996;
            double e2Square;
            double V, T, C, A, M;
            double PI = 3.14;       


            // Make sure longtitude between -180.00 and -179.9
            double LongTemp = (Long + 180) - (int)((Long + 180) / 360) * 360 - 180;
            double LatRad = Lat * PI / 180;
            double LongRad = LongTemp * PI / 180;
            double LongOriginRad = LongOrigin * PI / 180;
            e2Square = (eSquare) / (1 - eSquare);

            V = a / Math.Sqrt(1 - eSquare * Math.Sin(LatRad) * Math.Sin(LatRad));
            T = Math.Tan(LatRad) * Math.Tan(LatRad);
            C = e2Square * Math.Cos(LatRad) * Math.Cos(LatRad);
            A = Math.Cos(LatRad) * (LongRad - LongOriginRad);
            M = a * ((1 - eSquare / 4 - 3 * eSquare * eSquare / 64 - 5 * eSquare * eSquare * eSquare / 256) * LatRad
            - (3 * eSquare / 8 + 3 * eSquare * eSquare / 32 + 45 * eSquare * eSquare * eSquare / 1024) * Math.Sin(2 * LatRad)
            + (15 * eSquare * eSquare / 256 + 45 * eSquare * eSquare * eSquare / 1024) * Math.Sin(4 * LatRad)
            - (35 * eSquare * eSquare * eSquare / 3072) * Math.Sin(6 * LatRad));

            UTMEasting = (double)(k0 * V * (A + (1 - T + C) * A * A * A / 6
            + (5 - 18 * T + T * T + 72 * C - 58 * e2Square) * A * A * A * A * A / 120) + 500000.0);
            UTMNorthing = (double)(k0 * (M + V * Math.Tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24
            + (61 - 58 * T + T * T + 600 * C - 330 * e2Square) * A * A * A * A * A * A / 720)));
        
            UTMNorthing = UTMNorthing + FN;
        }

 

如下是原文

 

在Gissky上发现了戴勤奋老师关于坐标转换的程序以及公式,程序的界面和转换精度都值得称赞,只是可惜没有提供实现的源码,最近由于工作需要正好需要实现这部分功能,通过对戴勤奋老师提供的公式以及OGP(欧洲石油勘探组织)最新的《Coordinate Conversions and Transformations including Formulas》文档进行了研究,利用程序将UTM投影正转实现,现发布出来供大家共同学习,也希望大家指出程序中的不足。
/****************************************************************************
** 函数名:LLtoUTM
** 输入: a 椭球体长半轴
** f 椭球体扁率 f=(a-b)/a 其中b代表椭球体的短半轴
** Lat 经过UTM投影之前的纬度
** Long 经过UTM投影之前的经度
** LongOrigin 中央经度线
** FN 纬度起始点,北半球为0,南半球为10000000.0m
** UTMNorthing 经过UTM投影后的纬度方向的坐标
** UTMEasting 经过UTM投影后的经度方向的坐标
** 功能描述:UTM投影正转
** 作者: CiCi
** 单位: 中国地质大学(北京)地球科学与资源学院
** 创建日期:2007年3月28日
** 版本:1.0
***************************************************************************/
LLtoUTM(double a,double f,const double Lat, const double Long,
double LongOrigin,double FN,double &UTMNorthing,double &UTMEasting)
{
//e表示WGS84第一偏心率,eSquare表示e的平方,
double eSquare =(2*f-f*f) ;
double k0 = 0.9996;
double e2Square;
double V, T, C, A, M;

//确保longtitude位于-180.00----179.9之间
double LongTemp = (Long+180)-int((Long+180)/360)*360-180;
double LatRad = Lat*PI/180;
double LongRad = LongTemp*PI/180;
double LongOriginRad;
LongOriginRad = LongOrigin * PI/180;
e2Square = (eSquare)/(1-eSquare);


V = a/sqrt(1-eSquare*sin(LatRad)*sin(LatRad));
T = tan(LatRad)*tan(LatRad);
C = e2Square*cos(LatRad)*cos(LatRad);
A = cos(LatRad)*(LongRad-LongOriginRad);
M = a*((1-eSquare/4-3*eSquare*eSquare/64-5*eSquare*eSquare*eSquare/256)*LatRad
-(3*eSquare/8+3*eSquare*eSquare/32+45*eSquare*eSquare*eSquare/1024)*sin(2*LatRad)
+(15*eSquare*eSquare/256+45*eSquare*eSquare*eSquare/1024)*sin(4*LatRad)
-(35*eSquare*eSquare*eSquare/3072)*sin(6*LatRad));

UTMEasting = (double)(k0*V*(A+(1-T+C)*A*A*A/6
+ (5-18*T+T*T+72*C-58*e2Square)*A*A*A*A*A/120)+ 500000.0);
UTMNorthing = (double)(k0*(M+V*tan(LatRad)*(A*A/2+(5-T+9*C+4*C*C)*A*A*A*A/24
+(61-58*T+T*T+600*C-330*e2Square)*A*A*A*A*A*A/720)));
//南半球纬度起点为10000000.0m
UTMNorthing=UTMNorthing+FN;
}
本程序实现的公式请参考《Coordinate Conversions and Transformations including Formulas》文档第35页,如果你需要此文档,请和我联系!也欢迎大家提出程序的不足。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在MATLAB中,可以使用UTM投影UTM坐标系中的坐标转换为大地坐标系中的坐标。下面是一个简单的MATLAB代码示例,说明如何进行该转换: 首先,需要加载MATLAB Mapping Toolbox,该工具包提供了许多地理信息处理函数和工具,以便执行投影转换。 ```matlab % 加载Mapping Toolbox % 需要确保已安装该工具包 % 可通过函数licensetool查看是否安装 % 如果没有安装,可以通过在主页的"Add-On"选项卡中搜索并安装"Mapping Toolbox" % 然后运行以下代码: clear; clc; % 创建一个UTM投影对象 utmProj = utmzone(51); % 假设UTM投影区域为51 % 假设UTM坐标系中的坐标为(500000, 4000000) utmX = 500000; utmY = 4000000; % 使用utmproj反向投影函数将UTM坐标系中的坐标转换为大地坐标系中的坐标 [lat, lon] = utmproj(utmProj, utmX, utmY); % 打印转换结果 fprintf('大地坐标系中的坐标:纬度 %.6f°, 经度 %.6f°\n', lat, lon); ``` 输出结果将会显示大地坐标系中的坐标:纬度和经度。 请注意,上述示例中使用的UTM投影区域为51,仅供参考。实际应用中,需要根据实际情况选择正确的UTM投影区域。此外,还可以根据需要使用其他函数和工具来处理地理信息数据,进行更复杂的投影转换和分析。 ### 回答2: UTM投影是一种广泛应用于地理信息系统中的坐标系统,它将地球表面划分成若干个小区域,并使用大地坐标系来表示每个小区域的位置。在Matlab中,我们可以使用一些内置的函数来进行UTM投影转换。 首先,我们可以使用`wgs84Ellipsoid`函数创建一个WGS 84椭球体对象,这是UTM投影所基于的椭球体模型。然后,我们可以使用`utmgeoid`函数将经度和纬度转换为UTM坐标。该函数需要提供一个WGS 84椭球体对象、经度和纬度作为输入,并返回该点的UTM坐标。 下面是一个示例代码: ```matlab % 创建WGS 84椭球体对象 ellipsoid = wgs84Ellipsoid(); % 输入经度和纬度 longitude = 116.397; % 经度 latitude = 39.908; % 纬度 % 将经度和纬度转换为UTM坐标 [x, y, zone] = utmgeoid(latitude, longitude, ellipsoid); % 显示转换结果 fprintf('UTM坐标:\n'); fprintf('X:%f\n', x); fprintf('Y:%f\n', y); fprintf('UTM区域:%s\n', zone); ``` 这个代码块将输入的经度和纬度(这里以北京市中心的坐标为例)转换为UTM坐标,并输出转换结果。这里的示例经度为116.397,纬度为39.908,转换结果的UTM坐标将在`x`和`y`中返回,所属UTM区域将在`zone`中返回。 通过这种方式,我们可以在Matlab中完成UTM投影转换,并将大地坐标转换为UTM坐标,从而在地理信息系统中进行后续分析和处理。 ### 回答3: 在MATLAB中,我们可以使用Projection Toolbox中的函数来进行UTM投影转换为大地坐标。下面是一个简单的步骤: 1. 导入Projection Toolbox。首先,您需要安装Projection Toolbox并将其添加到MATLAB的搜索路径中。 2. 定义UTM投影参数。UTM投影使用两个参数来定义,分别是带号和中央子午线经度。例如,使用WGS84的UTM投影,可以选择带号和中央子午线经度来定义投影。 3. 创建投影结构。使用UTM投影的参数创建一个投影结构体。可以使用`utmproj`函数来创建该结构体。 4. 转换坐标。使用`utm2ell`函数将UTM坐标转换为大地坐标。此函数接受UTM投影结构,以及待转换的UTM坐标向量。 下面是一个MATLAB示例代码: ```matlab % 导入Projection Toolbox addpath('toolbox_files') % 将‘toolbox_files’替换为Projection Toolbox所在文件夹的路径 % 定义UTM投影参数 utmZone = 51; % 带号 centralMeridian = 123; % 中央子午线经度 % 创建投影结构 utmProj = utmproj('WGS84', utmZone, centralMeridian); % 将UTM坐标转换为大地坐标 utmCoords = [500000, 6000000; 510000, 6001000]; % 待转换的UTM坐标 ellCoords = utm2ell(utmProj, utmCoords); % 显示转换结果 disp(ellCoords); ``` 运行上述代码后,`ellCoords`将包含对应于`utmCoords`的大地坐标值。 请注意,这只是一个简单的示例,实际使用中可能需要处理的更复杂。因此,您可能需要查阅Projection Toolbox的文档,以了解更多有关UTM投影转换为大地坐标的详细信息和使用示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值