给出一个经纬度转UTM坐标的c++算法
时间: 2023-07-25 17:39:44 浏览: 154
好的,以下是一个简单的C++函数,可以将经纬度坐标转换为UTM坐标:
```c++
#include <cmath>
const double PI = 3.14159265358979323846;
const double a = 6378137.0; // WGS 84 地球长半轴
const double k0 = 0.9996;
const double e = 0.0818191910428; // WGS 84 地球偏心率
const double e2 = e * e;
const double ep2 = (e2) / (1 - e2);
int LatLonToUTM(double lat, double lon, int &zone, double &x, double &y)
{
// 计算带号
zone = (int)floor((lon + 180.0) / 6.0) + 1;
double lon0 = zone * 6.0 - 183.0;
// 将经纬度转换为弧度
double latr = lat * PI / 180.0;
double lonr = lon * PI / 180.0;
double lon0r = lon0 * PI / 180.0;
// 计算参数
double N = a / sqrt(1 - e2 * sin(latr) * sin(latr));
double T = tan(latr) * tan(latr);
double C = ep2 * cos(latr) * cos(latr);
double A = cos(latr) * (lonr - lon0r);
// 计算UTM坐标
double M = a * ((1 - e2 / 4 - 3 * e2 * e2 / 64 - 5 * e2 * e2 * e2 / 256) * latr
- (3 * e2 / 8 + 3 * e2 * e2 / 32 + 45 * e2 * e2 * e2 / 1024) * sin(2 * latr)
+ (15 * e2 * e2 / 256 + 45 * e2 * e2 * e2 / 1024) * sin(4 * latr)
- (35 * e2 * e2 * e2 / 3072) * sin(6 * latr));
x = k0 * N * (A + (1 - T + C) * pow(A, 3) / 6
+ (5 - 18 * T + T * T + 72 * C - 58 * ep2) * pow(A, 5) / 120);
y = k0 * (M + N * tan(latr) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * pow(A, 4) / 24
+ (61 - 58 * T + T * T + 600 * C - 330 * ep2) * pow(A, 6) / 720));
if (lat < 0)
{
y += 10000000.0; // 南半球加 10000000 米
}
return 0;
}
```
这个函数接收经度和纬度,然后计算出对应的UTM带号、x和y坐标,并将它们存储在传入的引用变量中。请注意,这个函数只能处理WGS 84椭球体的坐标。如果您正在处理其他的椭球体或大地基准,请相应地修改公式中的常数。
阅读全文