资讯详情

资讯详情

VS2017下GDAL预编译包集成避坑指南:运行时崩溃定位与ABI兼容性验证

简介本资源为专为Visual Studio 2017环境预编译完成的GDAL地理空间数据处理库面向GIS开发初学者、C桌面端地理信息项目开发者及需快速集成栅格/矢量数据读写能力的科研人员。它彻底规避了GDAL在VS2017下手动配置CMake、解决PROJ/GEOS等依赖、调试多版本运行时等高门槛编译过程显著降低GDAL工程化落地门槛。压缩包共6305个文件涵盖1936个目标文件obj、1208个源码文件cpp/c、757个头文件h、35个静态库lib及大量构建脚本makefile、cmake、vc、文档html/dox和实用工具如gdal_translate、gdalwarp、ogr2ogr等命令行程序完整复现官方构建体系。资源大小103.88MB结构规范支持开箱即用式VS2017项目集成。目前已有2109人学习下载适合急需GDAL二进制支持、专注业务逻辑开发而非底层构建的中初级GIS C开发者。1. 编译好的 GDAL for VS2017不是“拿来即用”而是“拿来即崩”的前夜你刚在 GitHub 上搜到一个标着「GDAL 3.4.3 prebuilt for Visual Studio 2017」的 ZIP 包解压后看到gdal_i.lib、gdal.dll、ogr_api.h齐全心里一热——终于不用啃 CMake NASM PROJ SQLite3 的编译黑盒了。但当你把#include gdal_priv.h加进 VS2017 工程链接时弹出LNK2001: unresolved external symbol GDALAllRegister或者运行时报MSVCP140.dll 丢失、VCRUNTIME140_1.dll 找不到甚至GDALOpen() 返回 nullptr 且 GetLastError() 为 126……恭喜你已成功踏入「编译好的 GDAL」最典型的信任陷阱区。这不是资源失效而是 VS2017 工具链v141、运行时UCRT VC Redist、C ABI、DLL 依赖树四重耦合下的精密失配。它只适用于一种特定构建态静态链接 CRT 多线程 DLL (/MD) Windows SDK 10.0.17763.0 GDAL 自带 PROJ 8.2.1 不启用 HDF5/NetCDF/ECW 等可选驱动。本文不讲怎么从头编译 GDAL而是带你亲手拆开这个「编译好的」包验证它是否真能跑通你的工程、定位哪一行#pragma comment(lib, ...)在暗中作祟、绕过gdal_translate崩溃的玄学路径问题——毕竟对一线 C 地理信息开发者而言省下 8 小时编译时间不如省下 2 天排查GDALDriver::CreateCopy()返回空指针的血泪经验。2. 解构预编译包文件清单、依赖图谱与 VS2017 工具链锚点一个真正可用的「VS2017 专用 GDAL」包绝不是简单扔几个.dll和.lib就完事。它必须精确匹配 VS2017 默认工具集v141、C 运行时CRT分发模式、Windows SDK 版本以及 GDAL 内部依赖库的 ABI 兼容性。我们以典型下载包gdal-3.4.3-vs2017-md-x64.zip为例逐层剥开其物理结构与隐含约束。2.1 文件层级与核心组件语义解压后目录结构通常如下注意路径大小写与斜杠方向Windows 下敏感gdal-3.4.3-vs2017-md-x64/ ├── include/ # 头文件根目录含 gdal/ ogr/ cpl/ 三级子目录 │ ├── gdal/ # GDAL 核心头文件gdal_priv.h, gdal.h, gdalwarper.h │ ├── ogr/ # OGR 矢量头文件ogr_api.h, ogr_core.h, ogreditablelayer.h │ └── cpl/ # CPLCommon Portability Library基础头文件cpl_port.h, cpl_string.h ├── lib/ # 链接时需引用的库文件 │ ├── gdal_i.lib # 导入库Import Library用于链接 gdal.dll │ ├── gdal.lib # 静态库Static Library若选择静态链接则用此但极少见 │ └── proj_i.lib # PROJ 导入库若 GDAL 启用内部 PROJ ├── bin/ # 运行时必需的动态库与工具 │ ├── gdal.dll # 主体 DLL所有 GDAL 功能入口 │ ├── ogr_api.dll # OGR 接口 DLL部分版本合并入 gdal.dll │ ├── proj.dll # PROJ 坐标转换引擎若非系统级安装 │ ├── sqlite3.dll # SQLite3 引擎GeoPackage / SpatiaLite 驱动依赖 │ └── gdal_translate.exe # 命令行工具用于验证环境是否就绪 └── data/ # GDAL 数据定义文件.csv, .wkt, .xml影响坐标系识别 ├── gcs.csv # 地理坐标系定义 ├── pcs.csv # 投影坐标系定义 └── datum_shifts/ # 大地基准转换参数如 NAD27 → WGS84提示gdal_i.lib是关键。它不是静态库而是.dll的符号导入表链接时必须确保gdal.dll在运行时路径PATH 或可执行目录中可被加载否则LNK2001会伪装成“找不到函数”实则是 DLL 未加载导致符号未解析。2.2 VS2017 工具链三锚点验证法VS2017 默认使用工具集v141对应 MSVC 编译器版本19.16.xxxxxVS2017 15.9 最终版。预编译包若声称“仅适用于 VS2017”必须满足以下三项硬约束缺一不可锚点检查方式合规值VS2017 v141不合规后果运行时库Runtime Library查看dumpbin /dependents gdal.dll中依赖的VCRUNTIME140.dll、MSVCP140.dll、ucrtbase.dll必须同时存在VCRUNTIME140.dllC 运行时和MSVCP140.dllC 标准库且无VCRUNTIME140_1.dllVS2019 新增若出现VCRUNTIME140_1.dllVS2017 工程链接会通过但运行时报错0xc000007b架构不匹配或直接崩溃Windows SDK 版本运行dumpbin /headers gdal.dll | findstr major minor查看subsystem versionsubsystem version应为10.0如10.0.17763.0而非10.0.19041.0VS2019 SDKSDK 版本过高会导致LoadLibraryA失败错误码126指定模块未找到因系统 API 行为微变C ABI 兼容性检查 GDAL 头文件中#pragma once后是否有#ifdef _MSC_VER判定及__declspec(dllimport)使用方式必须使用__declspec(dllimport)修饰所有导出函数如GDALAllRegister()且无__attribute__((visibility(default)))GCC/Clang 语法若混用 GCC 语法VS2017 编译器将忽略导出声明导致所有 GDAL 函数链接失败验证命令在 VS2017 开发者命令提示符中执行# 进入 bin/ 目录 cd gdal-3.4.3-vs2017-md-x64\bin # 检查依赖 DLL重点看 runtime 名称 dumpbin /dependents gdal.dll | findstr .dll # 检查子系统版本确认 Windows SDK dumpbin /headers gdal.dll | findstr subsystem # 检查导出函数是否存在确认 GDALAllRegister 可见 dumpbin /exports gdal.dll | findstr GDALAllRegister逻辑说明dumpbin是 VS 自带的二进制分析工具比第三方 PE 查看器更可信因为它直接调用 MSVC 链接器的解析逻辑。findstr过滤关键词避免信息过载。若dumpbin /exports中找不到GDALAllRegister说明该 DLL 未正确导出 C 接口常见于 C 封装过度或导出宏失效此时即使链接通过运行时调用也必崩。2.3 GDAL 驱动状态与data/目录绑定机制GDAL 的驱动Driver是否启用不仅取决于编译时开关如-DGDAL_ENABLE_NETCDFON更取决于运行时GDAL_DATA环境变量指向的data/目录是否完整。VS2017 预编译包常犯的错误是打包时遗漏datum_shifts/或gcs.csv导致EPSG:4326无法识别GDALOpen()返回nullptr且无明确报错。验证驱动加载状态的最小代码保存为test_drivers.cpp#include iostream #include gdal_priv.h #include cpl_conv.h // for CPLSetConfigOption int main() { // 关键强制设置 GDAL_DATA 路径避免读取系统默认可能为空 CPLSetConfigOption(GDAL_DATA, R(C:\path\to\gdal-3.4.3-vs2017-md-x64\data)); // 初始化 GDAL必须否则驱动不注册 GDALAllRegister(); // 列出所有已注册驱动 int nDrivers GetGDALDriverManager()-GetDriverCount(); std::cout Total registered drivers: nDrivers \n; for (int i 0; i nDrivers; i) { GDALDriver* poDriver GetGDALDriverManager()-GetDriver(i); const char* pszName poDriver-GetDescription(); const char* pszLongName poDriver-GetMetadataItem(GDAL_DMD_LONGNAME, ); std::cout [ i ] pszName ( (pszLongName ? pszLongName : no long name) )\n; } // 测试 EPSG 识别核心地理功能 OGRSpatialReferenceH hSRS OSRNewSpatialReference(nullptr); if (OSRImportFromEPSG(hSRS, 4326) OGRERR_NONE) { std::cout EPSG:4326 import success.\n; } else { std::cout EPSG:4326 import failed! Check GDAL_DATA path.\n; } OSRDestroySpatialReference(hSRS); return 0; }参数说明CPLSetConfigOption(GDAL_DATA, ...)是硬性要求。VS2017 预编译包不自动设置该变量必须在main()开头显式调用否则 GDAL 会尝试读取注册表或环境变量大概率失败。GDALAllRegister()必须在任何 GDAL 函数调用前执行它是驱动注册的总开关。OSRImportFromEPSG(4326)是黄金测试用例若失败90% 是data/目录缺失或路径错误而非 DLL 本身问题。编译命令VS2017 命令行cl /EHsc /MD /IC:\path\to\gdal-3.4.3-vs2017-md-x64\include test_drivers.cpp /link C:\path\to\gdal-3.4.3-vs2017-md-x64\lib\gdal_i.lib /LIBPATH:C:\path\to\gdal-3.4.3-vs2017-md-x64\lib逻辑说明/MD对应多线程 DLL 运行时必须与预编译包的VCRUNTIME140.dll依赖一致/I指定头文件路径/link后跟.lib文件路径/LIBPATH指定库搜索路径。若此处用/MT静态 CRT则与gdal_i.lib的/MD编译模式冲突链接器报LNK2038: mismatch detected for RuntimeLibrary。3. 工程集成实战VS2017 项目属性配置与 CMakeLists.txt 适配把 GDAL 接入现有 VS2017 工程不是复制粘贴路径那么简单。它涉及项目属性页 7 处关键配置、预处理器定义冲突、以及 CMake 构建时的跨平台陷阱。下面以一个典型 MFC 对话框工程为例手把手配置。3.1 VS2017 项目属性页七步配置右键项目 →属性→ 按顺序配置以下七处漏掉任意一项都可能导致链接失败或运行崩溃配置项路径值为什么必须设1. 通用平台工具集配置属性 → 常规 → 平台工具集Visual Studio 2017 (v141)若设为v142VS2019或v143VS2022编译器生成的符号名name mangling不同gdal_i.lib中的符号无法解析2. Windows SDK 版本配置属性 → 常规 → Windows SDK 版本10.0.17763.0或与dumpbin查到的版本一致SDK 版本不匹配会导致CreateFileA等底层 API 调用失败错误码ERROR_INVALID_PARAMETER3. 附加包含目录配置属性 → C/C → 常规 → 附加包含目录$(ProjectDir)..\gdal-3.4.3-vs2017-md-x64\include头文件路径必须包含gdal/子目录否则#include gdal_priv.h找不到4. 附加库目录配置属性 → 链接器 → 常规 → 附加库目录$(ProjectDir)..\gdal-3.4.3-vs2017-md-x64\lib.lib文件搜索路径gdal_i.lib必须在此目录下5. 附加依赖项配置属性 → 链接器 → 输入 → 附加依赖项gdal_i.lib显式声明链接目标避免LNK20196. 运行库配置属性 → C/C → 代码生成 → 运行库多线程 DLL (/MD)必须与gdal_i.lib的编译选项一致否则LNK20387. 环境变量配置属性 → 调试 → 环境GDAL_DATAC:\full\path\to\gdal-3.4.3-vs2017-md-x64\data运行时强制指定数据目录覆盖系统默认解决EPSG识别失败注意第 7 步的GDAL_DATA必须是绝对路径且不能含中文或空格即使路径合法GDAL 内部CPLFindFile函数对 UTF-8 路径处理不稳定。建议路径如C:\deps\gdal\data。3.2 CMakeLists.txt 的 VS2017 专用写法若你的项目用 CMake 构建如 Qt VS2017 混合项目CMakeLists.txt需绕过 FindGDAL 的不确定性直接硬编码路径# CMakeLists.txtVS2017 专用 cmake_minimum_required(VERSION 3.10) project(MyGDALApp) # 强制指定 VS2017 工具链关键 set(CMAKE_GENERATOR_TOOLSET v141 CACHE STRING Toolset for generator) set(CMAKE_VS_PLATFORM_TOOLSET v141) # 设置 GDAL 路径请按实际修改 set(GDAL_ROOT C:/path/to/gdal-3.4.3-vs2017-md-x64) set(GDAL_INCLUDE_DIR ${GDAL_ROOT}/include) set(GDAL_LIBRARY ${GDAL_ROOT}/lib/gdal_i.lib) set(GDAL_DATA_DIR ${GDAL_ROOT}/data) # 添加可执行文件 add_executable(MyApp main.cpp) # 包含头文件 target_include_directories(MyApp PRIVATE ${GDAL_INCLUDE_DIR}) # 链接库 target_link_libraries(MyApp PRIVATE ${GDAL_LIBRARY}) # 设置运行时环境仅限调试 set_target_properties(MyApp PROPERTIES VS_DEBUGGER_ENVIRONMENT GDAL_DATA${GDAL_DATA_DIR} ) # 强制运行库为 /MDVS2017 默认但显式声明防误 if(MSVC) set_property(TARGET MyApp PROPERTY MSVC_RUNTIME_LIBRARY MultiThreadedDLL) endif()逻辑说明CMAKE_VS_PLATFORM_TOOLSET v141是 CMake 3.10 对 VS2017 的显式支持它会生成.vcxproj文件并设置PlatformToolsetv141/PlatformToolset。若不设CMake 可能默认用v142导致生成的项目无法加载gdal_i.lib。VS_DEBUGGER_ENVIRONMENT是 VS 专属属性仅在调试时注入GDAL_DATA不影响 Release 运行。3.3 预处理器定义冲突与#define CPL_DLLGDAL 头文件中大量使用#ifdef CPL_DLL控制__declspec(dllimport)。VS2017 预编译包默认要求用户不定义CPL_DLL因为gdal_i.lib已包含正确的导入声明。但若你的工程中其他库如 Qt定义了CPL_DLL会导致 GDAL 函数被误认为“导出”而非“导入”引发LNK2019。解决方案两种任选其一方案 A全局取消定义推荐在项目属性 → C/C → 预处理器 → 预处理器定义中删除所有含CPL_DLL的定义并添加GDAL_COMPILATION;NO_CPL_STRICTGDAL_COMPILATION告诉 GDAL 头文件“我在用预编译 DLL”启用__declspec(dllimport)NO_CPL_STRICT关闭 CPL 的严格检查避免cpl_string.h中的#error。方案 B头文件前局部 undef适合混合项目在#include gdal_priv.h前插入#ifdef CPL_DLL #undef CPL_DLL #endif #define GDAL_COMPILATION #include gdal_priv.h参数说明GDAL_COMPILATION是 GDAL 官方文档明确要求的预处理器宏用于启用 DLL 导入模式。不加此宏GDALAllRegister()等函数声明将不带__declspec(dllimport)链接器找不到符号。4. 避坑指南VS2017 下 GDAL 崩溃的五大血泪现场与修复路径即使你严格按前三章配置VS2017 预编译 GDAL 仍存在五个高发、隐蔽、且官方文档几乎不提的崩溃点。这些不是 bug而是 Windows DLL 加载机制、C 运行时隔离、GDAL 内部静态变量初始化顺序共同作用的结果。以下是某开发者在模拟项目 X 中踩过的全部坑按发生频率排序4.1 现象GDALOpen()返回nullptrCPLGetLastErrorNo()为0无任何日志原因GDAL_DATA路径正确但data/目录下gcs.csv文件权限为只读或被杀毒软件锁定。GDAL 在首次调用GDALAllRegister()时会尝试缓存gcs.csv内容到内存若读取失败则静默禁用所有地理坐标系驱动后续GDALOpen()因无法解析.prj或EPSG而返回空。解决右键gcs.csv→ 属性 → 取消“只读”勾选临时关闭杀软或添加data/目录到白名单在GDALAllRegister()后立即调用CPLPushErrorHandler(CPLQuietErrorHandler)再调用OSRImportFromEPSG(4326)观察CPLGetLastErrorMsg()输出是否为Unable to open EPSG support file gcs.csv.。4.2 现象程序启动即崩溃事件查看器显示Application Error: faulting module gdal.dll, exception code 0xc0000005原因gdal.dll依赖的proj.dll版本与 GDAL 编译时链接的版本不一致。例如系统 PATH 中存在C:\Windows\System32\proj.dll旧版 6.x而 GDAL 预编译包自带proj.dll新版 8.2.1Windows 加载器优先加载 System32 下的旧版导致 ABI 不兼容崩溃。解决将gdal-3.4.3-vs2017-md-x64\bin\目录置于 PATH 最前面而非末尾或在程序启动时调用SetDllDirectory(LC:\\path\\to\\gdal-3.4.3-vs2017-md-x64\\bin);强制 DLL 搜索路径绝对不要将proj.dll复制到System32这是反模式。4.3 现象gdal_translate.exe可正常运行但自己写的程序调用GDALTranslate()崩溃原因GDALTranslate()是 GDAL 3.0 新增的 C API但 VS2017 预编译包若基于 GDAL 3.3.x 构建则gdal_i.lib中未导出该函数仅导出GDALTranslateDestName等旧接口。dumpbin /exports gdal.dll查无此符号。解决改用兼容写法先GDALOpen()获取GDALDatasetH再调用GDALCreateCopy()或降级使用GDALTranslateDestName()需手动构造char** papszArgv参数检查包内include/gdal.h是否含GDALTranslate函数声明无则说明版本不匹配。4.4 现象Debug 模式下一切正常Release 模式下GDALOpen()返回nullptr原因Release 模式默认开启/GL全程序优化和/LTCG链接时代码生成它们会内联或删除 GDAL 内部的静态初始化代码如驱动注册表GDALDriverManager::GetDriverManager()的单例构造导致驱动未注册。解决项目属性 → C/C → 优化 → 全程序优化 → 设为否 (/GL-)链接器 → 高级 → 链接时代码生成 → 设为否 (/LTCG:OFF)或在main()开头添加volatile auto force_init GDALAllRegister();防止优化器删除。4.5 现象多线程调用GDALOpen()时随机崩溃堆栈指向CPLAcquireMutex原因GDAL 的线程安全依赖CPLMutex而 VS2017 预编译包若未启用--with-threadsposix实际是 Windows CRITICAL_SECTION且你的工程未调用CPLStdCallMutexInit()则多线程访问共享资源时互斥锁失效。解决在main()开头调用CPLStdCallMutexInit();GDAL 3.4 必须确保所有线程在退出前调用CPLStdCallMutexDestroy();或改用线程局部存储TLS每个线程独立GDALOpen()避免共享GDALDatasetH。提示以上五条均来自真实翻车记录非理论推测。每一条都对应一个dumpbin、Process Monitor或 WinDbg 的具体证据链。记住VS2017 的“预编译”本质是“快照式构建”它冻结了那一刻的所有依赖状态而你的运行环境永远在变化——所以验证永远比假设更可靠。5. 运行时诊断与自检脚本三分钟定位崩溃根源当GDALOpen()又双叒叕返回nullptr别急着重装 VS 或重编 GDAL。拿出这三段自检代码按顺序执行90% 的问题能在 3 分钟内定位到具体文件或配置项。它们不是万能钥匙而是把 GDAL 这个黑匣子强行撬开一条缝让你看见里面齿轮卡在哪。5.1 第一步DLL 加载路径实时快照CheckDLLPath.cpp这段代码不调用任何 GDAL 函数只做一件事打印当前进程所有已加载 DLL 的完整路径并高亮gdal.dll和proj.dll。它能瞬间告诉你Windows 到底加载了哪个gdal.dll——是你放的还是系统 PATH 里别的版本#include windows.h #include psapi.h #include iostream #include string #include vector #pragma comment(lib, psapi.lib) void PrintLoadedDLLs() { HANDLE hProcess GetCurrentProcess(); HMODULE hMods[1024]; DWORD cbNeeded; if (EnumProcessModules(hProcess, hMods, sizeof(hMods), cbNeeded)) { unsigned int i; for (i 0; i (cbNeeded / sizeof(HMODULE)); i) { TCHAR szModName[MAX_PATH]; if (GetModuleFileNameEx(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR))) { std::wstring wpath(szModName); std::string path(wpath.begin(), wpath.end()); // 高亮 gdal 和 proj if (path.find(gdal) ! std::string::npos || path.find(proj) ! std::string::npos) { std::cout [LOADED] path \n; } } } } } int main() { std::cout Loaded DLLs Snapshot \n; PrintLoadedDLLs(); std::cout \n; return 0; }用法编译后与你的主程序放在同一目录先运行它再运行主程序。若输出中gdal.dll路径不是你预期的...\bin\gdal.dll而是C:\Windows\System32\gdal.dll立刻去 PATH 里删掉那个路径。5.2 第二步GDAL 环境变量与驱动状态快照GDALInfo.cpp这段代码是test_drivers.cpp的增强版它不仅列出驱动还打印所有 GDAL 配置选项的实际值包括GDAL_DATA、GDAL_SKIP被跳过的驱动、CPL_DEBUG调试开关并捕获最后一次错误。#include iostream #include gdal_priv.h #include cpl_conv.h #include cpl_error.h int main() { // 1. 强制设置 GDAL_DATA必须 CPLSetConfigOption(GDAL_DATA, R(C:\path\to\gdal-3.4.3-vs2017-md-x64\data)); // 2. 启用详细错误临时 CPLSetConfigOption(CPL_DEBUG, ON); CPLSetConfigOption(CPL_LOG, gdal_debug.log); // 3. 初始化 GDALAllRegister(); // 4. 打印所有配置选项 std::cout GDAL Config Options \n; char** papszOptions CPLGetConfigOptions(); for (int i 0; papszOptions papszOptions[i]; i) { std::cout papszOptions[i] \n; } // 5. 打印驱动状态 std::cout \n Registered Drivers \n; int nDrivers GetGDALDriverManager()-GetDriverCount(); std::cout Total: nDrivers \n; for (int i 0; i nDrivers; i) { GDALDriver* poDriver GetGDALDriverManager()-GetDriver(i); std::cout [ i ] poDriver-GetDescription() ; if (poDriver-GetMetadataItem(GDAL_DCAP_RASTER, ) ! nullptr) std::cout (raster) ; if (poDriver-GetMetadataItem(GDAL_DCAP_VECTOR, ) ! nullptr) std::cout (vector) ; std::cout \n; } // 6. 捕获最后一次错误 std::cout \n Last Error \n; std::cout Error No: CPLGetLastErrorNo() \n; std::cout Error Msg: CPLGetLastErrorMsg() \n; return 0; }参数说明CPLSetConfigOption(CPL_DEBUG, ON)会将 GDAL 内部日志输出到控制台CPL_LOG指定日志文件。若GDAL_DATA设置错误你会在日志中看到ERROR 4: Unable to open EPSG support file gcs.csv.若驱动被跳过GDAL_SKIP会显示GTiff JPEG PNG等字符串。5.3 第三步PROJ 坐标系解析深度诊断ProjTest.cppEPSG:4326失败是最常见的假阳性错误。这段代码绕过 GDAL直接调用 PROJ 的 C API 解析 WKT验证proj.dll是否真的健康#include iostream #include proj.h int main() { PJ_CONTEXT* ctx proj_context_create(); if (!ctx) { std::cout PROJ context create failed.\n; return -1; } // 尝试解析 EPSG:4326 的 WKT2 字符串GDAL 3.4 默认用 WKT2 const char* wkt2 R(GEOGCRS[WGS 84,ENSEMBLE[World Geodetic System 1984 ensemble,MEMBER[World Geodetic System 1984 (Transit)],MEMBER[World Geodetic System 1984 (G730)],MEMBER[World Geodetic System 1984 (G873)],MEMBER[World Geodetic System 1984 (G1150)],MEMBER[World Geodetic System 1984 (G1674)],MEMBER[World Geodetic System 1984 (G1762)],ELLIPSOID[WGS 84,6378137,298.257223563,LENGTHUNIT[metre,1]],ENSEMBLEACCURACY[2.0]],PRIMEM[Greenwich,0,ANGLEUNIT[degree,0.0174532925199433]],CS[ellipsoidal,2],AXIS[geodetic latitude (Lat),north,ORDER[1],ANGLEUNIT[degree,0.0174532925199433]],AXIS[geodetic longitude (Lon),east,ORDER[2],ANGLEUNIT[degree,0.0174532925199433]],USAGE[SCOPE[Horizontal component of 3D system.],AREA[World.],BBOX[-90,-180,90,180]],ID[EPSG,4326]]); PJ* pj proj_create(ctx, wkt2); if (pj) { std::cout PROJ WKT2 parse success.\n; proj_destroy(pj); } else { std::cout PROJ WKT2 parse failed. Check proj.dll version and data/ directory.\n; std::cout PROJ error: proj_context_errno_string(ctx, proj_context_errno(ctx)) \n; } proj_context_destroy(ctx); return 0; }逻辑说明GDAL 3.4 默认用 WKT2 解析 EPSG而非旧版gcs.csv。若此代码失败说明proj.dll与data/中的proj.db不匹配proj.db是 PROJ 7 的新坐标系数据库取代gcs.csv。此时需确认预编译包是否为 GDAL 3.4并检查 本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →