【C++】开源:地图投影和坐标转换proj库配置使用

😏*★,°* :.☆( ̄▽ ̄)/$:.°★ 😏

这篇文章主要介绍地图投影和坐标转换proj库配置使用。
无专精则不能成,无涉猎则不能通。------梁启超

欢迎来到我的博客,一起学习,共同进步。

喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • [:smirk:1. 项目介绍](#:smirk:1. 项目介绍)
    • [:blush:2. 环境配置](#:blush:2. 环境配置)
    • [:satisfied:3. 使用说明](#:satisfied:3. 使用说明)

😏1. 项目介绍

官网:https://proj.org/en/9.4/

项目Github地址:https://github.com/OSGeo/PROJ

proj 库是一个开源的库,主要用于地理坐标系之间的转换和地图投影。它被广泛应用于地理信息系统(GIS)和其他需要坐标转换和地图投影的应用中。

基本概念:

1.坐标系:地球上的位置可以用不同的坐标系表示,如经纬度(WGS84)和投影坐标系(如UTM)。

2.地图投影:将地球的三维表面映射到二维平面上(如地图)的方法。不同的投影方法适用于不同的应用场景。

3.坐标转换:将一种坐标系中的点转换到另一种坐标系中,通常涉及复杂的数学计算。

主要功能:

1.坐标转换:支持多种地理坐标系之间的转换,如从WGS84到UTM,或者从地理坐标系到地心坐标系。

2.地图投影:支持多种地图投影方式,如墨卡托投影、兰伯特正形投影等。

3.坐标操作:支持各种坐标操作,如偏移、旋转等。

😊2. 环境配置

Ubuntu上使用可以直接apt安装:

bash 复制代码
sudo apt install libproj-dev

程序g++编译:

bash 复制代码
g++ -o main main.cpp -lproj

😆3. 使用说明

WGS84转UTM示例:

cpp 复制代码
#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示例:

cpp 复制代码
#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;
}

以上。

相关推荐
Jahzo7 小时前
openclaw本地化部署体验与踩坑记录--windows
开源·全栈
冬奇Lab11 小时前
一天一个开源项目(第39篇):PandaWiki - AI 驱动的开源知识库搭建系统
人工智能·开源·资讯
HelloGitHub12 小时前
这个年轻的开源项目,想让每个人都能拥有自己的专业级 AI 智能体
开源·github·agent
Kagol1 天前
🎉OpenTiny NEXT-SDK 重磅发布:四步把你的前端应用变成智能应用!
前端·开源·agent
冬奇Lab1 天前
OpenClaw 源码精读(2):Channel & Routing——一条消息如何找到它的 Agent?
人工智能·开源·源码阅读
冬奇Lab1 天前
一天一个开源项目(第38篇):Claude Code Telegram - 用 Telegram 远程用 Claude Code,随时随地聊项目
人工智能·开源·资讯
sunny8651 天前
Claude Code 跨会话上下文恢复:从 8 次纠正到 0 次的工程实践
人工智能·开源·github
肆忆_1 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
strayCat232551 天前
Clawdbot 源码解读 7: 扩展机制
人工智能·开源
不想写代码的星星1 天前
虚函数表:C++ 多态背后的那个男人
c++