Proj 理空间坐标转换库安装及c++引用该库(linux系统)_c++ proj-CSDN博客
proj库的使用场景:
在处理GPS坐标时,做一些坐标计算,如果直接使用GPS坐标会导致精度下降,或是不适用计算模型,这时候就需要将GPS坐标转化为平面坐标。
proj的github连接 ,该链接里有跳转proj主页的连接,上面有相关安装教程。
安装PROJ
我使用的centOS7系统,我选择下载源码进行安装,[proj源码GitHub连接](https://github.com/OSGeo/PROJ.git) 我安装那会是proj的版本是9.3.0
proj需要的依赖
Build requirements
- C99 compiler 也就是gcc要达到8.0.0以上,最好是最新版本的gcc
- C++11 compiler
- CMake >= 3.9
- SQLite3 >= 3.11: headers and library for target architecture, and sqlite3 executable for build architecture.
- libtiff >= 4.0 (optional but recommended)
- curl >= 7.29.0 (optional but recommended)
- Gtest >= 1.12.0 googleTest
- 其中,在我c++项目引用编译时候如下错
/opt/rh/devtoolset-10/root/usr/bin/ld: /cm/shared/apps/proj-9.2.0/lib64/libproj.so.25.9.3.0: undefined reference to `TIFFSetTagExtender@LIBTIFF_4.0'
该错误其实是因为libtiff 库版本不是4.0.*版本所导致,所有后面我将libtiff 换为tiff-4.0.10就可以了,对应官网下载连接:libtiff下载连接。依赖版本一定要对应
安装过程:
我根据proj官网在github下载代码,下载后是PROJ文件夹,进入PROJ创建build文件夹进行make,然后再make install
在安装过程中如果遇到问题可以联系我,一般问题都是版本没有对应好。
cmake -DCMAKE_INSTALL_PREFIX=/cm/shared/apps/proj-9.2.0 -DSQLITE3_INCLUDE_DIR=/cm/shared/apps/sqlite3.41.2/include -DSQLITE3_LIBRARY=/cm/shared/apps/sqlite3.41.2/lib/libsqlite3.so -DGTEST_LIBRARY=/cm/shared/apps/gtest/lib64/libgtest.a -DGTEST_MAIN_LIBRARY=/cm/shared/apps/gtest/lib64/ -DGTEST_INCLUDE_DIR=/cm/shared/apps/gtest/include -DCMAKE_CXX_STANDARD=14 ..
其中
-DCMAKE_INSTALL_PREFIX 指定安装路径
-DSQLITE3_INCLUDE_DIR SQLite3的安装路径
-DSQLITE3_LIBRARY SQLite3库连接路径
-DGTEST_LIBRARY Gtest的库连接路径
-DGTEST_MAIN_LIBRARY Gtest的库连接路径
-DGTEST_INCLUDE_DIR Gtest的头文件连接路径
-DCMAKE_CXX_STANDARD 指定14的g++编译,因为Gtest最低需要14
Proj的cmake使用
需要修改CMakeLists.txt文件添加如下:
# 指定PROJ库安装路径
set(CMAKE_PREFIX_PATH "/cm/shared/apps/proj-9.2.0/")
# cmake 自动找到PROJ,因为PROJ也是用cmake标准来编译的
find_package(PROJ REQUIRED CONFIG)
#引入PROJ的头文件
include_directories(${PROJ_INCLUDE_DIR})
add_executable(main;main.cpp)
#连接proj库
target_link_libraries(main PRIVATE PROJ::proj)
简单的案例,也是根据官网的文档创建的一个小小的案例,该案例是将GPS坐标转化为平面坐标:
#include <iostream>
//引用
#include <proj.h>
using namespace std;
int testProj (void) {
PJ_CONTEXT *C;
PJ *P;
PJ *norm;
PJ_COORD a, b ;
//创建上下文
C = proj_context_create();
//由GPS坐标转化为World Equidistant Cylindrical 的平面坐标 在线转化GPS坐标网站https://mygeodata.cloud/cs2cs/
P = proj_create_crs_to_crs (C,
"EPSG:4326",//GPS所用坐标系,EPSG:4326
"EPSG:4087", /* or EPSG:32632 也就是转化平面坐标*/
NULL);
if (0 == P) {
fprintf(stderr, "Failed to create transformation object.\n");
return 1;
}
//这一步就是为了标准输出为经纬度,先是经度,后是纬度,符合习惯
norm = proj_normalize_for_visualization(C, P);
if (0 == norm) {
fprintf(stderr, "Failed to normalize transformation object.\n");
return 1;
}
proj_destroy(P);
P = norm;
//格式化GPS坐标
a = proj_coord(0.460907,2.421540, 0, 0);//输入0.460907,2.421540的GPS坐标
//开始转化
b = proj_trans(P, PJ_FWD, a);
printf("easting: %.5f, northing: %.5f\n", b.enu.e, b.enu.n);
/* Clean up */
proj_destroy(P);
proj_context_destroy(C); /* may be omitted in the single threaded case */
return 0;
}