Proj 理空间坐标转换库安装及c++引用该库(linux系统)

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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Python 中,可以使用 pyproj 来进行坐标转换。使用 pyproj 需要先安装它,可以使用以下命令进行安装: ``` pip install pyproj ``` 安装完成后,就可以在 Python 程序中使用 pyproj 了。下面是一个使用 pyproj 进行坐标转换的示例代码: ```python import pyproj # 定义投影坐标系 p1 = pyproj.Proj(init='epsg:4326') # WGS84 坐标系 p2 = pyproj.Proj(init='epsg:3857') # Web Mercator 坐标系 # 定义待转换的坐标 x, y = 120.123, 30.456 # 进行坐标转换 x2, y2 = pyproj.transform(p1, p2, x, y) print(x2, y2) # 输出转换后的坐标 ``` 在这个示例中,我们将 WGS84 坐标系下的坐标 (120.123, 30.456) 转换为 Web Mercator 坐标系下的坐标。p1 和 p2 分别表示原坐标系和目标坐标系。使用 pyproj.transform() 函数可以进行坐标转换,它需要传入原坐标系、目标坐标系和待转换的坐标。最后,转换后的坐标会被输出。 注意,在进行坐标转换时,需要确保原坐标系和目标坐标系是可以相互转换的。通常情况下,两个坐标系是可以相互转换的, ### 回答2: Python 中使用 `proj` 参数是为了进行坐标转换。`proj` 是一个经纬度坐标转换,可以将不同坐标系之间的位置进行转换。 在 Python 中,可以使用 `pyproj` 来进行坐标转换。`pyproj` 是一个非常常用的,它提供了各种坐标转换的方法和函数。 首先,需要安装 `pyproj` 。可以使用 `pip install pyproj` 命令进行安装安装完成后,可以使用以下代码进行坐标转换: ```python from pyproj import Proj # 定义源坐标系 source_proj = Proj(init='epsg:4326') # 定义目标坐标系 target_proj = Proj(init='epsg:3857') # 定义源坐标 lon, lat = 120.123, 30.456 # 进行坐标转换 x, y = pyproj.transform(source_proj, target_proj, lon, lat) # 输出转换后的坐标 print(f'转换后的坐标为:{x}, {y}') ``` 在上面的代码中,首先定义了源坐标系和目标坐标系,`epsg:4326` 表示 WGS84 坐标系,`epsg:3857` 表示 Web Mercator 坐标系。然后定义了源坐标的经度和纬度,使用 `pyproj.transform` 函数进行转换。最后输出转换后的坐标。 这样,就可以利用 `proj` 参数进行坐标转换。使用 `pyproj` 提供的方法,可以方便地进行不同坐标系之间的转换。 ### 回答3: 在Python中,可以使用proj参数进行坐标转换proj参数是一个字符串,用于定义坐标系统的投影方式和坐标单位。 proj参数可以通过多种方式指定。一种常见的方式是使用EPSG代码,这是一种国际标准的坐标系统编号。例如,EPSG:4326表示WGS 84坐标系统,EPSG:3857表示Web墨卡托投影坐标系统。在Python中,可以通过proj参数将一种坐标系统坐标转换为另一种坐标系统的坐标。 要使用proj参数进行坐标转换,首先需要安装PyProj。PyProj是一个用于地坐标转换的Python,可以通过pip安装安装完成后,可以使用pyproj.Proj函数创建一个Proj对象,将proj参数传递给该函数。 创建Proj对象后,可以使用该对象的transform方法进行坐标转换。transform方法接受两个参数,分别是源坐标系和目标坐标系的Proj对象。例如,要将WGS 84坐标转换为Web墨卡托投影坐标,可以创建两个Proj对象,分别代表这两个坐标系,然后使用transform方法进行转换。 下面是一个示例代码,演示了如何使用proj参数进行坐标转换: ```python import pyproj # 创建两个Proj对象,分别代表WGS 84坐标系和Web墨卡托投影坐标系 wgs84 = pyproj.Proj(proj='latlong', datum='WGS84', ellps='WGS84') webmercator = pyproj.Proj(proj='merc', datum='WGS84', ellps='WGS84', lat_ts=0.0, lon_0=0.0, x_0=0.0, y_0=0, units='m', k=1.0, nadgrids='@null', no_defs=True) # 坐标转换 lon, lat = 116.4074, 39.9042 # WGS 84坐标 x, y = pyproj.transform(wgs84, webmercator, lon, lat) # 转换为Web墨卡托投影坐标 print(x, y) ``` 以上就是使用proj参数进行坐标转换的方法。通过使用Proj对象和transform方法,可以方便地实现不同坐标系统之间的坐标转换

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值