PROJ库的编译和使用

目录

一.下载并编译

二.配置静态、动态库以及引用头文件

        1.头文件目录

        2.静态库添加

        3.动态库

三.示例代码


一.下载并编译

首先,根据下面博客下载Cmake、proj并完成tiff和cmake、proj的编译工作。

Win11下基于cmake-3.26.3 完美编译 proj-9.2.0 源码_proj编译-CSDN博客

        1.注意:在最后进行cmake对proj源文件生成源码的过程中,最后一步在下载

        'https://github.com/google/googletest/archive/release-1.11.0.zip'的时候可能由于网络、代理或者是链接失效等问题导致cmake没办法下载。

这时候我们需要自己在浏览器输入这个网址将压缩包下载后,重命名为“release-1.11.0.zip”,并将安装包放到你所设置的build中的build\googletest-download\googletest-prefix\src路径下,再重新进行configure就可以正常编译了。

        2.接着我们需要配置环境变量(这一步其实就是在配置proj.db文件)

  • 打开环境变量配置

  • 点集环境变量→新建

     

  • 找到2中build文件里的proj.db文件位置,复制其路径到此处:
     

  • 重启电脑使配置生效

二.配置静态、动态库以及引用头文件

通过上述步骤,我们就可以得到编译好的proj文件了,接下来我们就需要如何将proj配置到我们的工程中。

这里我所用的环境为:

IDE:VS2022

系统:WIN10

首先我们建立一个空的项目,并添加.c文件,接着配置VS静态链接库+动态链接库+头文件目录

        1.头文件目录

        添加方法:工程---属性---配置属性---c/c++---常规---附加包含目录(Additional Include Directories):加上头文件存放目录。
注意:(1)路径必须指向头文件所在的子文件夹,而不能直到父文件夹就结束(2)每个路径不需要加上双引号,输入了之后,vs会自动加上双引号,如果自己加可能vs无法识别双引号(3)如果是多个路径,使用分号“;”隔开。(4)在代码处引用这个头文件,#include "xxx.h"

        2.静态库添加

        添加方法:添加文件引用的lib静态库路径:工程---属性---配置属性---链接器---常规---附加库目录(Additional Library Directory:加上lib文件存放目录。

         然后添加工程引用的lib文件名:工程---属性---配置属性---链接器---输入---附加依赖项(Additional Dependencies):加上lib文件名。

        3.动态库

        把引用的dll放到工程的可执行文件所在的目录(工程文件夹)下如不添加,编译连接不会报错,运行报错:无法找到***.dll文件。

        所有都配置好之后我们就可以引用proj库来进行编译了

三.示例代码

以下是示例代码:

#include <stdio.h>
#include <proj.h>
#include<iostream>
using namespace std;

int main(void) {
    PJ_CONTEXT* C;//用于处理多线程程序
    PJ* P;//初始化投影目标
    PJ* norm;//初始化投影目标
    PJ_COORD a, b;//初始化投影坐标

    /* or you may set C=PJ_DEFAULT_CTX if you are sure you will     */
    /* use PJ objects from only one thread                          */
    C = proj_context_create();//创建多线程,由于本示例为单线程,此处为展示作用

    P = proj_create_crs_to_crs(C,
        "EPSG:4326",//源投影
        "+proj=utm +zone=32 +datum=WGS84", //目标投影
        NULL);//创建在线程C内两个投影关系之间的相互转换

    if (0 == P) {
        cout << "Failed to create transformation object." << stderr << endl;
        return 1;
    }//如果P中两个投影的字符串不符合proj定义,提示转换失败
    /* This will ensure that the order of coordinates for the input CRS */
    /* will be longitude, latitude, whereas EPSG:4326 mandates latitude, */
    /* longitude */
    norm = proj_normalize_for_visualization(C, P);//在线程C内使投影目标P和norm拥有相同的坐标格式,此处为经纬度
    if (0 == norm) {
        cout << " Failed to normalize transformation object." << stderr << endl;
        return 1;
    }//norm为0,说明格式同步失败
    proj_destroy(P);//释放投影
    P = norm;//投影赋值

    /* a coordinate union representing Copenhagen: 55d N, 12d E    */
    /* Given that we have used proj_normalize_for_visualization(), the order of
    /* coordinates is longitude, latitude, and values are expressed in degrees. */
    a = proj_coord(12, 55, 0, 0);//设定待转换的投影坐标,此处分别为经度,纬度,高程,时间
    /* transform to UTM zone 32, then back to geographical */
    b = proj_trans(P, PJ_FWD, a);//投影转换,fwd代表源投影转换成目标投影,INV代表目标投影转换为源投影
    cout << "East: " << b.enu.e << "; North:" << b.enu.n << endl;;//经纬度转化为xy坐标

    b = proj_trans(P, PJ_INV, b);//xy坐标转化为经纬度坐标
    cout << "Longitude: " << b.lp.lam << "; Latitude: " << b.lp.phi << endl;;//lam为经度,phi为纬度

    /* Clean up */
    proj_destroy(P);
    proj_context_destroy(C); /* may be omitted in the single threaded case */
    return 0;
}

运行成功结果如下图所示:

以上就是整个proj库的编译和使用,希望能帮助到你。

  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值