SLAM 中地理计算库 GeographicLib 极简入门 (Ubuntu 18.04 c++例子)
地理计算库 GeographicLib 极简入门
- 时间:
20210412
文章目录
- 1. 文档
- 2. 安装
- 3. 项目集成
- 4. 极简的例子
1. 文档
- GeographicLib - 官方文档
- GeographicLib::LocalCartesian - 官方文档
2. 安装
克隆源码并编译安装 GeographicLib 。 (码云镜像更快,已有较多人转储,不用自己导入,如需自己导入,参考gitee文档)。
git clone https://gitee.com/masonqin/geographiclib.git cd geographiclib mkdir build && cd build cmake .. #无报错 make #无报错 sudo make install #无报错
3. 项目集成
编写 CMakeLists.txt,非常简单的老三句。
find_package (GeographicLib REQUIRED) include_directories(${GeographicLib_INCLUDE_DIRS}) target_link_libraries(<可执行程序> ${GeographicLib_LIBRARIES})
代码集成,最常用的功能,使用局部坐标系转换,从 经纬高 到 ENU 。
#include <GeographicLib/LocalCartesian.hpp> //包含头文件 //经纬度原点初始化 GeographicLib::LocalCartesian geo_converter; geo_converter.Reset(latitude, longitude, altitude); //经纬度转ENU geo_converter.Forward(latitude, longitude, altitude, local_E, local_N, local_U);
初始化原点用了 Reset 函数,Forward 用于将经纬高转换成米制坐标[E,N,U] 。俩函数都是调用 geo_converter 对象的成员函数,geo_converter 就是 GeographicLib::LocalCartesian 的实例。
- GeographicLib::LocalCartesian 简介,官方文档
- 功能就是把椭球体下的地理坐标系坐标转为ENU局部系下的坐标。
- Reset 函数的作用是重置原点,LocalCartesian构造函数是默认在(0,0,0)也就是地心。
- Forward (lat, lon, alt, x, y, z)函数就是把经纬高转换为ENU,前三个传入,后三个传出。
- GeographicLib::LocalCartesian 简介,官方文档
4. 极简的例子
新建 geographiclib_demo 文件夹,在里面新建 CMakeLists.txt 和 main.cpp。
main.cpp ,经纬度数据转ENU米制坐标,数据文件为lonlat.csv,格式为**[纬度,经度,高度]**。
#include <iostream> #include <vector> #include <string> #include <fstream> #include <sstream> #include <GeographicLib/LocalCartesian.hpp> //header filetypedef std::vector<std::vector<double>> dataMat_NxN;void ReadCSV(std::string str_csv_file, dataMat_NxN &data_NxN) {std::ifstream in_file(str_csv_file, std::ios::in);std::string std_line;while (getline(in_file, std_line)){std::stringstream ss(std_line);std::string data_each;std::vector<double> data_array;while (getline(ss, data_each, ',')){data_array.push_back(atof(data_each.c_str()));}data_NxN.push_back(data_array);} }void WriteDat(std::string str_dat_file, dataMat_NxN &data_NxN) {std::ofstream out_file(str_dat_file, std::ios::out);for (int i = 0; i < data_NxN.size(); ++i){for (int j = 0; j < data_NxN[i].size(); ++j){out_file << data_NxN[i][j]<<" ";}out_file << "\n";} }int main() {std::cout << "Demo program of GeographicLib." << std::endl;// geo origin initGeographicLib::LocalCartesian geo_converter;// data structure definedataMat_NxN geo_data;dataMat_NxN ENU_data;// read data from filestd::string str_geo_data = "../lonlat.csv";//lat,lon,hReadCSV(str_geo_data, geo_data);if (geo_data.size() > 0){if (geo_data[0].size() == 3){geo_converter.Reset(geo_data[0][0], geo_data[0][1], geo_data[0][2]);for (int i = 0; i < geo_data.size(); ++i){double local_E, local_N, local_U;// convert[lat,lon,hgt] to ENUgeo_converter.Forward(geo_data[i][0], geo_data[i][1], geo_data[i][2], local_E, local_N, local_U);std::vector<double> data_each;data_each.emplace_back(local_E);data_each.emplace_back(local_N);data_each.emplace_back(local_U);ENU_data.emplace_back(data_each);std::cout << "i=" << i << std::endl;}}}std::string str_ENU_data = "../enu.dat";//e,n,uWriteDat(str_ENU_data, ENU_data);return 0; }
CMakeLists.txt 文件
cmake_minimum_required(VERSION 3.10) project(geographiclib_demo)set(CMAKE_CXX_STANDARD 14)find_package (GeographicLib REQUIRED) include_directories(${GeographicLib_INCLUDE_DIRS})add_executable(geographiclib_demo main.cpp) target_link_libraries(geographiclib_demo ${GeographicLib_LIBRARIES})
编译 & 执行
git clone https://gitee.com/jqf64078/geographiclib_demo.git cd geographiclib_demo mkdir build && cd build cmake .. make ./geographiclib_demo
转换ENU米制坐标结果绘制,matlab 绘制。
enu_data = load('enu.dat'); plot(enu_data(:,1),enu_data(:,2));grid on;xlabel('East'),ylabel('North');
csv 文件格式,程序只是简单地定义 [纬度,经度,高度] 如下所示的格式进行读取。
lat, lon, h,
lat, lon, h,
lat, lon, h,
…
SLAM 中地理计算库 GeographicLib 极简入门 (Ubuntu 18.04 c++例子)相关推荐
- linux界面美化 简书,Ubuntu 18.04 装机及美化
Ubuntu 系统安装及美化教程,以及一些实用软件推荐 一.Ubuntu 18.04 装机 安装教程以 Ubuntu18.04 为例,但安装方法也适用于其他版本的安装 装机步骤 下载 Ubuntu 镜 ...
- linux界面美化 简书,Ubuntu 18.04 LTS 界面美化方法
Ubuntu 系统是一款非常入门级的Linux操作系统, 简单易用 , 软件源也比较丰富, 大多数软件工具可以直接下载安装使用,对于不会编程的小白来说,省去了不少折腾时间. 当我们第一次安装Ubunt ...
- 如何在 Ubuntu 18.04 LTS 中配置 IP 地址?
在 Ubuntu 18.04 LTS 上配置 IP 地址的方法与旧方法有很大不同,与以前的版本不同,Ubuntu 18.04 使用Netplan实用程序,它是一个新的命令行网络配置实用程序,用于配置 ...
- Linux终端文件夹管理员,如何在Ubuntu 18.04中以管理员权限打开文件和文件夹
本文向你介绍在Ubuntu 18.04中以管理员权限打开文件和文件夹. 与 Windows 中的资源管理器一样,在 Ubuntu 系统的 Nautilus 文件管理器中,您也可以查看到系统中的所有文件 ...
- 黑科技抢先尝(续) - Windows terminal中WSL Linux 终端的极简美化指南
之前,本人写了两篇文章 黑科技抢先尝 | Windows全新终端初体验(附代码Build全过程) 和 程会玩 | 无需自行编译也能玩转 Windows Terminal,介绍了玩转Windows te ...
- tensorflow平台极简方式_TensorFlow极简入门教程
原标题:TensorFlow极简入门教程 随着 TensorFlow 在研究及产品中的应用日益广泛,很多开发者及研究者都希望能深入学习这一深度学习框架.本文介绍了TensorFlow 基础,包括静态计 ...
- Docker极简入门
原 Docker极简入门 2018年05月22日 20:25:12 阅读数:44 一.Docker概述 Docker通过一个包括应用程序运行时所需的一切的可执行镜像启动容器,包括配置有代码.运行时.库 ...
- Python极简入门教程
前言 为了方便各位小白能轻松入门Python,同时加深自己对Python的理解,所以创造了"Python极简入门教程",希望能帮到大家,若有错误请多指正,谢谢.极简入门教程代表着不 ...
- Seata 极简入门
1. 概述 Seata 是阿里开源的一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务. 1.1 四种事务模式 Seata 目标打造一站式的分布事务的解决方案,最终会提供四种事务 ...
最新文章
- 微信小程序实时获取用户经纬度
- 精选 GitHub 值得收藏的100个前端项目
- 推荐一个AutoCad查看器——Free DWG Viewer试用
- 前端:JS字符串操作函数类库
- min-width:100%和max-width:100%的区别
- SDOI2014 旅行
- 一个奇怪的注意事项TNS-12545 TNS-12560 TNS-00515
- 【VirtualBox】设置NAT端口映射-SSH登录
- UWP开发学习笔记3
- 190628每日一句
- 计算机回收站设置大小,电脑怎么设置回收站容量 电脑回收站的数据文件位置在哪...
- 北漂18届三本毕业生从实习到正式工作的前端开发求职经历
- 实习日记5:过滤器+批量删除+角色管理
- oneos组件系列02:ws2812全彩LED
- 【3小时学会C语言】横向对比/纵向剖析,轻松学习C语言
- Git 初學筆記 - 指令操作教學
- androidP 对反射的限制之黑名单机制
- 鲜为人知的另一面?比尔·盖茨被曝猛料!
- strtok函数的使用
- 计算机硬盘做u盘启动不了,U盘启动找不到硬盘的解决方法