官网:https://proj.org/en/9.4/
项目Github地址:https://github.com/OSGeo/PROJ
proj
库是一个开源的库,主要用于地理坐标系之间的转换和地图投影。它被广泛应用于地理信息系统(GIS)和其他需要坐标转换和地图投影的应用中。
基本概念:
1.坐标系:地球上的位置可以用不同的坐标系表示,如经纬度(WGS84)和投影坐标系(如UTM)。 2.地图投影:将地球的三维表面映射到二维平面上(如地图)的方法。不同的投影方法适用于不同的应用场景。 3.坐标转换:将一种坐标系中的点转换到另一种坐标系中,通常涉及复杂的数学计算。
主要功能:
1.坐标转换:支持多种地理坐标系之间的转换,如从WGS84到UTM,或者从地理坐标系到地心坐标系。 2.地图投影:支持多种地图投影方式,如墨卡托投影、兰伯特正形投影等。 3.坐标操作:支持各种坐标操作,如偏移、旋转等。
Ubuntu上使用可以直接apt安装:
sudo apt install libproj-dev
程序g++编译:
g++ -o main main.cpp -lproj
WGS84转UTM示例:
#include <proj.h>
#include <iostream>
int main() {
// 创建坐标转换上下文
PJ_CONTEXT *ctx = proj_context_create();
// 定义源和目标坐标系
PJ *source_crs = proj_create(ctx, "EPSG:4326"); // WGS84
PJ *target_crs = proj_create(ctx, "EPSG:32633"); // UTM zone 33N
// 创建坐标转换对象
PJ *transformation = proj_create_crs_to_crs_from_pj(ctx, source_crs, target_crs, nullptr, nullptr);
if (transformation == nullptr) {
std::cerr << "Failed to create transformation object." << std::endl;
proj_context_destroy(ctx);
return 1;
}
// 坐标转换前,需要将坐标转换对象转为度量型
PJ *transform = proj_normalize_for_visualization(ctx, transformation);
proj_destroy(transformation);
if (transform == nullptr) {
std::cerr << "Failed to normalize transformation." << std::endl;
proj_context_destroy(ctx);
return 1;
}
// 输入经纬度坐标 (经度, 纬度)
PJ_COORD input = proj_coord(12.0, 55.0, 0, 0); // (Longitude, Latitude)
PJ_COORD output;
// 执行坐标转换
output = proj_trans(transform, PJ_FWD, input);
// 输出转换后的坐标 (东, 北)
std::cout << "Easting: " << output.xy.x << " Northing: " << output.xy.y << std::endl;
// 清理资源
proj_destroy(transform);
proj_context_destroy(ctx);
return 0;
}
UTM转WGS84示例:
#include <proj.h>
#include <iostream>
int main() {
// 创建PROJ上下文
PJ_CONTEXT *ctx = proj_context_create();
// 定义UTM坐标系 (EPSG:32633 - UTM zone 33N) 和 WGS84坐标系 (EPSG:4326)
PJ *utm_crs = proj_create(ctx, "EPSG:32633"); // UTM zone 33N
PJ *wgs84_crs = proj_create(ctx, "EPSG:4326"); // WGS84
// 创建坐标转换对象
PJ *transformation = proj_create_crs_to_crs_from_pj(ctx, utm_crs, wgs84_crs, nullptr, nullptr);
if (transformation == nullptr) {
std::cerr << "Failed to create transformation object." << std::endl;
proj_context_destroy(ctx);
return 1;
}
// 将转换对象规范化为视觉化使用
PJ *transform = proj_normalize_for_visualization(ctx, transformation);
proj_destroy(transformation);
if (transform == nullptr) {
std::cerr << "Failed to normalize transformation." << std::endl;
proj_context_destroy(ctx);
return 1;
}
// 输入UTM坐标 (Easting, Northing)
double utm_easting = 500000.0; // 例如: 500000米
double utm_northing = 4649776.22482; // 例如: 4649776.22482米
PJ_COORD input = proj_coord(utm_easting, utm_northing, 0, 0);
// 执行坐标转换
PJ_COORD output = proj_trans(transform, PJ_INV, input); // PJ_INV 表示逆转换(UTM -> WGS84)
// 输出转换后的WGS84坐标 (经度, 纬度)
std::cout << "Longitude: " << output.lp.lam << " Latitude: " << output.lp.phi << std::endl;
// 清理资源
proj_destroy(transform);
proj_context_destroy(ctx);
return 0;
}