vcpkg安装配置gdal进行坐标转换及ERROR 6: Unable to load PROJ.4 library (proj.dll)解决方法
因为需要把采集到的经纬度坐标数据转换为投影坐标系数据,因此使用gdal进行坐标转换。我使用的是vs2019,百度了一下自己下载源码编译有点复杂,需要先编译SQLite、PROJ等等。因此,我直接使用vcpkg进行一键自动编译,一行代码搞定。(其实这里的因果关系因该颠倒一下,我使用vcpkg已经有一段时间了,一般需要在win10下配置什么库的时候都会优先考虑vcpkg,而搜索gdal源码编译是因为使用过程中遇到了bug,然后才发现原来vs2019配置gdal这么麻烦。)
vcpkg安装gdal很简单,直接在vcpkg目录下打开PowerShell窗口,然后输入.\vcpkg install gdal:x64-windows静静等待它配置好即可。完成后,在\vcpkg\buildtrees目录下就可以看到gdal文件夹了。我用的是debug版本,在\gdal\src-x64-windows-debug\gdal-2.4.1目录下,其文件组织是这样的:
没错,里面没有include文件夹,也没有lib和bin文件夹(不知道是gdal2.4.1版本的问题还是vcpkg自动编译的问题),总体感觉有点混乱,所以没法直接把对应文件夹路径添加到vs工程里对应的目录下。
我的使用需求是,将WGS84坐标系下的经纬度坐标转换为横轴墨卡托投影(UTM)下的坐标。百度了gdal坐标转换,有相关的实现代码,但是他们都没有说要include什么文件,因此对于怎么配置gdal环境,我有点不知所措。
(中间经过了从gdal官网看类关系图什么的过程。。。
我的配置是这样的:在vs中,把\gdal\src-x64-windows-debug\gdal-2.4.1路径添加到vc++的库目录下,把\gdal\src-x64-windows-debug\gdal-2.4.1目录下的ogr和gcore两个文件夹的路径添加到vc++的包含目录下;然后在链接器->输入->附加依赖项中添加gdal_i.lib。然后,在我的电脑的环境变量-用户变量里,新建一个名为GDAL_DATA变量,变量值为X:\XXX\gdal\src-x64-windows-debug\gdal-2.4.1\data(其中X,XXX为自己gdal安装的盘名和路径名)参考自这里。这样,整个环境变量就配置好了。下面贴上网上找的一段测试坐标转换代码(来自这里):
OGRSpatialReference oSourceSRS, oTargetSRS;
OGRCoordinateTransformation* poCT;
double x, y;
oSourceSRS.importFromEPSG(4326);//WGS84
oTargetSRS.importFromEPSG(2327);//Xian 1980/Gauss-Kruger zone 13
poCT = OGRCreateCoordinateTransformation(&oSourceSRS,
&oTargetSRS);
x = 10.0;
y = 10.0;
if (poCT == NULL || !poCT->Transform(1, &x, &y))
printf("Transformation failed.\n");
else
printf("(%f,%f) -> (%f,%f)\n",
10.0,
10.0,
x, y);
需要引用的头文件有两个:
#include "gdal_priv.h"
#include "ogr_core.h"
运行,会报错:ERROR 6: Unable to load PROJ.4 library (proj.dll), creation of OGRCoordinateTransformation failed.
意思是找不到proj.dll,于是我在gdal文件夹下搜了一下,也找不到这个dll文件。这会儿我就很纳闷了,vcpkg不是应该会自动下载编译配置的吗,怎么我在工程里配置了,还是不能用,而且还找不到这个依赖的dll。百度了一下,这个是proj4这个库的,于是我就用vcpkg search了一下,找到了。又用vcpkg download,提示我已经安装好了。于是我去vcpkg的buildtree下找了一下,还真的已经装好了。在proj4的debug版文件夹下,我搜到了一个叫proj_d.dll的文件(这里来一个小小的科普,_d表示debug版本)。我需要的应该就是它了!于是我把它复制到vs工程目录下,再次运行,还是报错。于是我又改了一下这个dll的名字,把_d去掉了,改成它要找的proj.dll。然后终于运行成功了!
我的第一篇CSDN博客,写的比较糙。突然想写一篇博客的原因主要是发现网上好像没有这类问题的解决方法,于是就在此记录一下,也许可以帮助到跟我遇到一样问题的小伙伴~毕竟自己从博客上获得过很多帮助了。
更多推荐
所有评论(0)