proj库配置与使用(window11,vs2019,x64)

前置安装依赖

1.SQLite3 安装 亲测

(97条消息) SQLite3源码下载与编译(开发环境:Win10+VS2022)_sqlite3 下载_林夕07的博客-CSDN博客

2.TIFF 亲测

(97条消息) Win11下基于cmake-3.26.3 完美编译 TIFF-4.5.0源码_tiff 编译_GIS子枫的博客-CSDN博客

安装他的方法,最后到编译才会报错:error MSB3073: 命令"setlocal。解决方法如下

最后生成的tiff在c盘

3.curl 编译 亲测

编译很难,就直接在window上安装

(97条消息) Windows上安装Curl工具_windows curl 工具_Janson666的博客-CSDN博客

proj安装

方法一 亲测可以cmake生成,但是编译会出现Link报错,不会解决

(97条消息) PROJ 9.1.1源码下载编译(Win10+VS2022)_proj下载_林夕07的博客-CSDN博客

config的时候看报啥错 就 把路径整上去

cmke报错记得别看warning,看error

编译link报错,可以

删除了proj链接器中的CURL_ENABLED,哪个项目报错关于curl就删除CURL_ENABLED宏

方法二,我是照着配置Visual Studio C++环境中GDAL、SQLite与PROJ库的方法 - 知乎 (zhihu.com)

同时结合之前安装的一些前置库,还是在编译阶段报错

无法解析的外部符号 __imp__curl_easy_init_QWQ_Plus的博客-CSDN博客

这些用处都没有,还是报错。

最后我把proj把动态库弄成静态库了再把test network删除 可以编译成功了

测试案例的时候发现上面的静态库方案不对,还是改成了动态库

最终!!!!!!!!!!!!!!!!!!

删除了proj链接器中的CURL_ENABLED 宏就可以编译通过了,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

练习案例

复制代码
#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;
}

生成目录下添加tiff.dll和Proj那个dll

EXE文件项目报错点

最后我生成的EXE项目到其他电脑运行无法找打proj.db。于是我知道缺少这个环境变量了

于是我把proj.db放到exe输出目录下。以及在主函数设定环境变量

复制代码
boost::filesystem::path currentPath=boost::filesystem::current_path();
boost::process::environment env=boost::this_process::environment();
env["PROJ_LIB"]=currentPath.string();
相关推荐
程序喵大人12 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
by2099913 小时前
vector 的模拟实现:扩容与边界的详细阐述(下)
c++·经验分享·vector·动态数组
余额瞒着我当琳16 小时前
红黑树的实现--红黑树的概念、规则、效率、结构、旋转、查找、验证
数据结构·c++·算法
青少儿编程课堂16 小时前
AC自动机多模式串匹配精讲:校园关键词巡检实战解析
c++·python·算法·bfs·信息学竞赛
longlongzihan17 小时前
LeetCode 5. 最长回文子串:从暴力匹配到中心扩展的思维演进
c++·算法·leetcode
多弗朗皮卡丘17 小时前
C++继承
c++·继承
汉克老师18 小时前
GESP2026年9月认证C++七级( 第三部分编程题(2、括号序列))精讲
c++·gesp·小学生·学c++编程
jimy120 小时前
虚函数vtable,链接时看到构造函数,linker把符号地址写入vtable(三)
开发语言·c++
潼心1412o21 小时前
C++初阶(长期更新)第9讲:string(上)
开发语言·c++
朝朝辞暮i21 小时前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2