地理计算库 GeographicLib 极简入门
20210412
克隆源码并编译安装 GeographicLib 。 (码云镜像更快,已有较多人转储,不用自己导入,如需自己导入,参考gitee文档)。
git clone https://gitee.com/masonqin/geographiclib.git
cd geographiclib
mkdir build && cd build
cmake .. #无报错
make #无报错
sudo make install #无报错
编写 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_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 file
typedef 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 init
GeographicLib::LocalCartesian geo_converter;
// data structure define
dataMat_NxN geo_data;
dataMat_NxN ENU_data;
// read data from file
std::string str_geo_data = "../lonlat.csv";//lat,lon,h
ReadCSV(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 ENU
geo_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,u
WriteDat(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,
…
正则忽略大小写 – RegexOptions.IgnoreCase 例如: 复制代码 代码如下: Str = R...
本文实例讲述了Laravel框架源码解析之反射的使用。分享给大家供大家参考,具体如...
Elasticsearch 是通过 Lucene 的倒排索引技术实现比关系型数据库更快的过滤。特...
错误描述: 在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报...
4月11日20:30~22:00通过腾讯会议进行了第二次在线学习讨论我把学习笔记整理一下...
项目中用到的一些特殊字符和图标 html代码 XML/HTML Code 复制内容到剪贴板 div ...
DELETEFROMTablesWHEREIDNOTIN(SELECTMin(ID)FROMTablesGROUPBYName) Min的话保...
复制代码 代码如下: % URL="http://news.163.com/special/00011K6L/rss_newstop....
工具:Eclipse,Oracle,smartupload.jar;语言:jsp,Java;数据存储:Oracle。...
上篇文章给大家介绍了 Java正则表达式匹配,替换,查找,切割的方法 ,接下来,...