目录
一.下载并编译
首先,根据下面博客下载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库的编译和使用,希望能帮助到你。