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

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍地图投影和坐标转换proj库配置使用。
无专精则不能成,无涉猎则不能通。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 项目介绍
    • :blush:2. 环境配置
    • :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安装:

sudo apt install libproj-dev

程序g++编译:

g++ -o main main.cpp -lproj

😆3. 使用说明

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;
}

在这里插入图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/779303.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mars3d加载wms服务或者wmts服务注意事项

1.wms只支持4326、3857、4490的标准切片&#xff0c;其他坐标系不支持 Mars3D三维可视化平台 | 火星科技 2.wmts同理&#xff0c;Mars3D三维可视化平台 | 火星科技 3.对应级别tilematrix找到的瓦片tilerow&tilecol这两个参数使用常见报错无效参考&#xff1a; 【Mars3d】…

VSCode设置字体大小

方法1&#xff1a;Ctrl 和 Ctrl -&#xff0c;可以控制整个VSCode界面的整体缩放&#xff0c;但是不会调整字体大小 方法2&#xff1a;该方法只能设置编辑器界面的字号&#xff0c;无法改变窗口界面的字号。 &#xff08;1&#xff09;点开左下角如下图标&#xff0c;进入…

商贸物流大脑:大模型+数据要素赋能智慧物流数据平台

项目背景与意义 物流行业快速发展&#xff0c;数据量急剧增加&#xff0c;随着电子商务、智能制造等领域的快速发展&#xff0c;物流行业面领着前所未有的挑战和机遇&#xff0c;如效率低下、资源配置不均、信息不透明等问题。随着全球化和电子商务的快速发展&#xff0c;数据…

【Linux进阶】文件系统8——硬链接和符号连接:ln

在Linux下面的链接文件有两种&#xff0c; 一种是类似Windows的快捷方式功能的文件&#xff0c;可以让你快速地链接到目标文件&#xff08;或目录)&#xff1b;另一种则是通过文件系统的inode 链接来产生新文件名&#xff0c;而不是产生新文件&#xff0c;这种称为硬链接&…

Vue + SpringBoot:el-upload组件单文件、多文件上传实战解析

文章目录 单文件上传后端前端 多文件上传后端前端 单文件上传 后端 PostMapping("/uploadDxfFile") public R uploadDxfFile(RequestParam(value "file", required true) MultipartFile multipartFile) throws Exception {// 文件校验工作if (multipar…

【C语言小知识】缓冲区

缓冲区 当我们使用printf()将数据显示在屏幕上&#xff0c;或者使用scanf()函数将数据输入到电脑里&#xff0c;我们是否会产生些许疑问&#xff1f;为何输入的字符会直接显示到屏幕上等等。这里需要介绍一个C语言中的一个关键概念——缓冲区。 当我们使用老式系统进行运行代码…

机器学习之保存与加载

前言 模型的数据需要存储和加载&#xff0c;这节介绍存储和加载的方式方法。 存和加载模型权重 保存模型使用save_checkpoint接口&#xff0c;传入网络和指定的保存路径&#xff0c;要加载模型权重&#xff0c;需要先创建相同模型的实例&#xff0c;然后使用load_checkpoint…

创维汽车开展年中总结会:创新创造·勇开拓 智慧经营·攀高峰

2024年7月3日&#xff0c;回顾上半年的工作成果&#xff0c;总结经验教训&#xff0c;明确下半年的发展方向和重点任务&#xff0c;创维汽车于山西省晋中市榆次区山西联合创维体验中心开展年中总结会。 创维集团、创维汽车创始人黄宏生&#xff1b;开沃集团联合创始人、首席执…

每日一更 EFK日志分析系统

需要docker和docker-compose环境 下面时docker-compose.yaml文件 [rootnode1 docker-EFK]# cat docker-compose.yaml version: 3.3services:elasticsearch:image: "docker.elastic.co/elasticsearch/elasticsearch:7.17.5"container_name: elasticsearchrestart: …

process.env 管理 Vue 项目的环境变量(Vue项目中环境变量的配置及调用)

简述&#xff1a;在构建 Vue 应用时&#xff0c;管理配置是开发中的一个重要部分。不同的环境&#xff08;如开发、测试和生产&#xff09;往往需要不同的配置&#xff0c;例如 API、 基础 URL、第三方服务的密钥等。使用环境变量可以帮助我们更好地管理这些配置。这里将介绍如…

2 极/2 零 (2P2Z) 补偿器

极/2 零 &#xff08;2P2Z&#xff09; 补偿器是模拟 II 型控制器的数字实现。它是一种滤波器&#xff0c;通过考虑两个极点和一个零点&#xff0c;将特定的增益和相位升压引入系统。您必须战略性地选择每个极点和零点的频率位置&#xff0c;这将有助于实现所需的系统性能。在该…

当需要对大量数据进行排序操作时,怎样优化内存使用和性能?

文章目录 一、选择合适的排序算法1. 快速排序2. 归并排序3. 堆排序 二、数据结构优化1. 使用索引2. 压缩数据3. 分块排序 三、外部排序1. 多路归并排序 四、利用多核和并行计算1. 多线程排序2. 使用并行流 五、性能调优技巧1. 避免不必要的内存复制2. 缓存友好性3. 基准测试和性…

手把手教你从零开始构建 AI 视频生成模型

在 GitHub 上发现一篇教程&#xff0c;作者详细介绍了如何使用 Python 语言&#xff0c;从零开始构建一个文本到视频生成模型。 涵盖了从理解理论概念到架构编码&#xff0c;最终实现输入文本提示即可生成视频的全过程。 相关链接 GitHub&#xff1a;github.com/FareedKhan-…

PD协议诱骗芯片,XSP08Q,XSP16应用笔记

XSP08Q是3C数码或小家电产品的Type-C接口控制芯片&#xff0c;它负责和PD充电器通讯&#xff0c;获取充电器的快充电压档位&#xff0c;如5V4A&#xff0c;9V3A&#xff0c;12V2A&#xff0c;15V3A&#xff0c;20V5A等等。 XSP08Q支持PD协议&#xff0c;BC1.2协议&#xff0c;Q…

Rakis: 免费基于 P2P 的去中心化的大模型

是一个开源的&#xff0c;完全在浏览器中运行的去中心化 AI 推理网络&#xff0c;用户无需服务器&#xff0c;打开即可通过点对点网络使用 Llama-3、Mistral、Gemma-2b 等最新开源模型。 你可以通过右上角的 Scale Worker &#xff0c;下载好模型后挂机就能作为节点加入到这个…

【全面讲解下Foxit Reader】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

便携式气象站:探索自然的智慧伙伴

在探索自然奥秘、追求科学真理的道路上&#xff0c;气象数据始终是我们不可或缺的指引。然而&#xff0c;传统的气象站往往庞大而笨重&#xff0c;难以在偏远地区或移动环境中灵活部署。 便携式气象站&#xff0c;顾名思义&#xff0c;是一种小巧轻便、易于携带和安装的气象观测…

农资销售网站-计算机毕业设计源码54432

目录 摘要 Abstract 1绪论 1.1研究背景 1.2研究意义 1.3论文结构与章节安排 2农资销售网站系统分析 2.1可行性分析 2.1.1技术可行性分析 2.1.2经济可行性分析 2.1.3法律可行性分析 2.2系统功能分析 2.2.1功能性分析 2.2.2非功能性分析 2.3系统用例分析 2.4系统流…

比赛获奖的武林秘籍:03 好的创意选取-获得国奖的最必要前提

比赛获奖的武林秘籍&#xff1a;03 好的创意选取-获得国奖的最必要前提 摘要 本文主要介绍了大学生电子计算机类比赛和创新创业类比赛创意选取的重要性&#xff0c;并列举了好的创意选取和坏的创意选取的例子&#xff0c;同时说明了好的创意选取具有哪些特点&#xff0c;同时…

Tkinter布局助手

免费的功能基本可以满足快速开发布局&#xff0c; https://pytk.net/ iamxcd/tkinter-helper: 为tkinter打造的可视化拖拽布局界面设计小工具 (github.com) 作者也把项目开源了&#xff0c;有兴趣可以玩玩