一、下载proj包

下载地址:proj

二、通过命令行端用MinGW编译

1、首先在工程目录(proj工程目录)下新建一个build文件夹。
2、打开VS的命令行工具:计算机左下角找到vs2019点开往下拉即可找到。
3、切换到工程目录的build目录下:
此处,比如我的工程目录在D:\MCworkspace\PROJ-master\build,则可按如下命令进行切换:

//D盘切换
D:
//MCworkspace目录切换
cd MCworkspace
//以此类推

如图:

vs2017使用libkafka vs2017使用proj库_javascript

4、输入命令行:

// 指定编译器MinGW
cmake -G "MinGW Makefiles" ..

vs2017使用libkafka vs2017使用proj库_git_02


编译结束后,如图显示便为成功cmake。

注意:此步骤会下载https://github.com/google/googletest/archive/release-1.11.0.zip,可能会解压失败,是访问GitHub的问题,多试几次或者使用VPN就可以解决了。

5、输入命令行:

// 相当于linux下的make
mingw32-make.exe

vs2017使用libkafka vs2017使用proj库_javascript_03


vs2017使用libkafka vs2017使用proj库_git_04


编译时间较长,耐心等待。如图便make完毕。

6、编译成功后,除了库文件的生成,还需要注意proj以前的版本还会生成头文件——proj_api.h,但现在版本更新了,在源码中就已经包含了对应的头文件——proj.h。所以只需要编译生成的库文件,分别为动态链接库——libproj_9_1.dll,静态链接库——libproj.dll.a。分为位于build目录下如图位置:

vs2017使用libkafka vs2017使用proj库_c++_05


注意:如果通过IDE直接进行编译会生成库文件,但是有可能会缺少proj.db文件,导致后续会出现“pj_obj_create: Cannot find proj.db”问题。

三、环境配置

1、右键此电脑点击属性

vs2017使用libkafka vs2017使用proj库_git_06


2、点集环境变量→新建

vs2017使用libkafka vs2017使用proj库_windows_07


vs2017使用libkafka vs2017使用proj库_javascript_08


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

vs2017使用libkafka vs2017使用proj库_git_09


vs2017使用libkafka vs2017使用proj库_javascript_10


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

运行结果:

vs2017使用libkafka vs2017使用proj库_javascript_11