一、下载proj包
下载地址:proj
二、通过命令行端用MinGW编译
1、首先在工程目录(proj工程目录)下新建一个build文件夹。
2、打开VS的命令行工具:计算机左下角找到vs2019点开往下拉即可找到。
3、切换到工程目录的build目录下:
此处,比如我的工程目录在D:\MCworkspace\PROJ-master\build,则可按如下命令进行切换:
//D盘切换
D:
//MCworkspace目录切换
cd MCworkspace
//以此类推
如图:
4、输入命令行:
// 指定编译器MinGW
cmake -G "MinGW Makefiles" ..
编译结束后,如图显示便为成功cmake。
注意:此步骤会下载https://github.com/google/googletest/archive/release-1.11.0.zip,可能会解压失败,是访问GitHub的问题,多试几次或者使用VPN就可以解决了。
5、输入命令行:
// 相当于linux下的make
mingw32-make.exe
编译时间较长,耐心等待。如图便make完毕。
6、编译成功后,除了库文件的生成,还需要注意proj以前的版本还会生成头文件——proj_api.h,但现在版本更新了,在源码中就已经包含了对应的头文件——proj.h。所以只需要编译生成的库文件,分别为动态链接库——libproj_9_1.dll,静态链接库——libproj.dll.a。分为位于build目录下如图位置:
注意:如果通过IDE直接进行编译会生成库文件,但是有可能会缺少proj.db文件,导致后续会出现“pj_obj_create: Cannot find proj.db”问题。
三、环境配置
1、右键此电脑点击属性
2、点集环境变量→新建
3、找到2中build文件里的proj.db文件位置,复制其路径到此处:
4、重启电脑使配置生效。
5、将3中的动态或静态库文件,以及头文件复制到项目中配置好即可运行代码。
Proj相关文档(包含proj开发文档):proj官方文档
四、示例代码
#include <stdio.h>
#include <proj.h>
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;
}
运行结果: