wsg84与UTM坐标系互相转换C语言完整代码
时间: 2023-09-03 13:27:29 浏览: 193
回答1:
下面是使用 C 语言实现 WGS84 坐标系和 UTM 坐标系之间转换的完整代码:
#include <stdio.h>
#include <math.h>
#define pi 3.14159265358979323846
#define a 6378137.0
#define e 0.08181919084262188
// WGS84 坐标转 UTM 坐标
void wgs2utm(double lat, double lon, double *x, double *y, int *zone)
{
double latRad = lat * pi / 180.0;
double lonRad = lon * pi / 180.0;
double lonOrigin = floor((lon + 180.0) / 6.0) * 6.0 - 183.0;
double lonOriginRad = lonOrigin * pi / 180.0;
*zone = (int)((lon + 180.0) / 6.0) + 1;
double N = a / sqrt(1.0 - e * e * sin(latRad) * sin(latRad));
double T = tan(latRad) * tan(latRad);
double C = e * e * cos(latRad) * cos(latRad) / (1.0 - e * e);
double A = (lonRad - lonOriginRad) * cos(latRad);
double M = a * ((1.0 - e * e / 4.0 - 3.0 * e * e * e * e / 64.0 - 5.0 * e * e * e * e * e * e / 256.0) * latRad
- (3.0 * e * e / 8.0 + 3.0 * e * e * e * e / 32.0 + 45.0 * e * e * e * e * e * e / 1024.0) * sin(2.0 * latRad)
+ (15.0 * e * e * e * e / 256.0 + 45.0 * e * e * e * e * e * e / 1024.0) * sin(4.0 * latRad)
- (35.0 * e * e * e * e * e * e / 3072.0) * sin(6.0 * latRad));
*x = (double)(N * A * (1.0 + A * A * ((1.0 - T + C) / 6.0 + A * A * (5.0 - 18.0 * T + T * T + 72.0 * C - 58.0 * e * e) / 120.0)) + 500000.0);
*y = (double)(M + N * tan(latRad) * (A * A * (1.0 / 2.0 + A * A * ((5.0 - T + 9.0 * C + 4.0 * C * C) / 24.0 + A * A * (61.0 - 58.0 * T + T * T + 600.0 * C - 330.0 * e * e) / 720.0))));
}
// UTM 坐标
### 回答2:
下面是一个用C语言实现WSG84与UTM坐标系互相转换的完整代码示例(使用了示例库libproj4):
```c
#include <stdio.h>
#include <proj_api.h>
int main(int argc, char *argv[]) {
projPJ pj_utm, pj_wsg84;
double utm_easting, utm_northing, utm_zone, wsg84_latitude, wsg84_longitude;
// 初始化UTM投影对象(以WGS84作为基准椭球)
pj_utm = pj_init_plus("+proj=utm +zone=10 +ellps=WGS84");
// 输入UTM坐标(x, y)和所在的UTM区域
utm_easting = 500000.0;
utm_northing = 4649776.0;
utm_zone = 10.0;
// 将UTM坐标转换为WSG84经纬度
pj_transform(pj_utm, pj_latlong, 1, 1, &utm_easting, &utm_northing, NULL);
wsg84_latitude = utm_northing;
wsg84_longitude = utm_easting;
printf("UTM: easting=%.2f, northing=%.2f, zone=%.2f\n", utm_easting, utm_northing, utm_zone);
printf("WSG84: latitude=%.6f, longitude=%.6f\n", wsg84_latitude, wsg84_longitude);
// 初始化WSG84投影对象(以WGS84作为基准椭球)
pj_wsg84 = pj_init_plus("+proj=latlong +ellps=WGS84");
// 输入经纬度坐标
wsg84_latitude = 40.712776;
wsg84_longitude = -74.005974;
// 将WSG84经纬度转换为UTM坐标
pj_transform(pj_wsg84, pj_utm, 1, 1, &wsg84_longitude, &wsg84_latitude, NULL);
utm_easting = wsg84_longitude;
utm_northing = wsg84_latitude;
printf("WSG84: latitude=%.6f, longitude=%.6f\n", wsg84_latitude, wsg84_longitude);
printf("UTM: easting=%.2f, northing=%.2f, zone=%.2f\n", utm_easting, utm_northing, utm_zone);
// 释放投影对象资源
pj_free(pj_utm);
pj_free(pj_wsg84);
return 0;
}
请注意,该示例假设UTM投影所在的UTM区域为10,且使用了WGS84作为参考椭球。如果需要使用其他UTM区域或参考椭球,可以相应地修改代码中的参数。
阅读全文
相关推荐














