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();
相关推荐
东方芷兰24 分钟前
算法笔记 04 —— 算法初步(下)
c++·笔记·算法
xinghuitunan42 分钟前
时间转换(acwing)c/c++/java/python
java·c语言·c++·python
TechNomad1 小时前
C++访问MySQL数据库
数据库·c++·mysql
Emplace1 小时前
ABC381E题解
c++·算法
ctrigger2 小时前
AI回答:Linux C/C++编程学习路线
linux·c语言·c++
h^hh3 小时前
洛谷 P3405 [USACO16DEC] Cities and States S(详解)c++
开发语言·数据结构·c++·算法·哈希算法
Dreams°1234 小时前
【透过 C++ 实现数据结构:链表、数组、树和图蕴含的逻辑深度解析】
开发语言·数据结构·c++·mysql
wanjiazhongqi5 小时前
链表和STL —— list 【复习笔记】
数据结构·c++·笔记·链表
-sky-15 小时前
2.21作业
开发语言·c++·算法
li星野5 小时前
std::thread的同步机制
开发语言·c++·学习