当前位置: 首页 > news >正文

GDAL能正确运行的代码:使用不同ZOOM读取瓦片数据,转换为PNG

我用AI搜索了很久,总算完成了这个代码。

  • 工作思路

无人机在空中飞行,需要匹配地面影像,确认自己的真实位置。

  • 瓦片数据

使用QGIS下载瓦片地图-CSDN博客

  • 代码

能编译运行,能正确产生不同ZOOM的图片。

#include <stdio.h> #include <stdlib.h> #include "gdal.h" #include "gdal_utils.h" #define MAPTILE_FILE "wuxi.mbtiles" #define POINT_LONGITUDE 120.337 #define POINT_LATITUDE 31.505 #define AREA_SIZE 0.010 static GDALDatasetH openMapFile(const int zoom) { #if 1 char param1[32]; sprintf(param1, "ZOOM_LEVEL=%d", zoom); const char* openOpts[] = {param1, NULL}; // 3. 使用GDALOpenEx打开数据集 GDALDatasetH hSrcDS = GDALOpenEx( MAPTILE_FILE, // 文件名 GDAL_OF_RASTER | GDAL_OF_READONLY, // 只读方式打开栅格数据 NULL, // 不限制驱动 openOpts, // 传入我们设置的打开选项 NULL // 无关联文件 ); #else GDALDatasetH hSrcDS = GDALOpen(MAPTILE_FILE, GA_ReadOnly); #endif return hSrcDS; } static int convertToPng(const char* file, const GDALDatasetH hSrcDS, const GDALTranslateOptions* psOptions) { // 6. 执行裁剪和格式转换 GDALDatasetH hDstDS = GDALTranslate(file, hSrcDS, psOptions, NULL); if (hDstDS) { printf("成功将 %s 裁剪并保存为 %s\n", MAPTILE_FILE, file); return -1; } else { printf("转换失败!\n"); } return 0; } static GDALTranslateOptions* initTransOptions() { // 2, 将边界值转换为字符串,并加入到参数数组中 char szMinLon[32], szMaxLat[32], szMaxLon[32], szMinLat[32]; snprintf(szMinLon, sizeof(szMinLon), "%.6f", (POINT_LONGITUDE-AREA_SIZE/2)); snprintf(szMaxLat, sizeof(szMaxLat), "%.6f", (POINT_LATITUDE +AREA_SIZE/2)); snprintf(szMaxLon, sizeof(szMaxLon), "%.6f", (POINT_LONGITUDE+AREA_SIZE/2)); snprintf(szMinLat, sizeof(szMinLat), "%.6f", (POINT_LATITUDE -AREA_SIZE/2)); // 3. 构建 参数数组 // 重新构建包含边界值的参数数组 // 示例范围:围绕北京的区域 (经度: 116.3 ~ 116.5, 纬度: 39.8 ~ 40.0) // 注意:-projwin 的顺序是左上角 (minLon, maxLat) 到右下角 (maxLon, minLat) const char* const apszArgvFull[] = { "-projwin", szMinLon, szMaxLat, szMaxLon, szMinLat, "-projwin_srs", "EPSG:4326", "-of", "PNG", NULL }; // 4. 创建 GDALTranslateOptions 对象 GDALTranslateOptions* psOptions = GDALTranslateOptionsNew((char**)apszArgvFull, NULL); if (!psOptions) { printf("解析 GDALTranslateOptions 参数失败!\n"); return NULL; } return psOptions; } int main() { // 1. 注册所有 GDAL 驱动 GDALAllRegister(); GDALTranslateOptions* psOptions = initTransOptions(); if (!psOptions) { return -1; } for (int zoom=8; zoom<=16; zoom++) { // 5. 打开源数据集 (MBTiles) GDALDatasetH hSrcDS = openMapFile(zoom); if (hSrcDS == NULL) { printf("无法打开源文件: %s(zoom=%d)\n", MAPTILE_FILE, zoom); continue; } char file[32]; sprintf(file, "zoom%d.png", zoom); convertToPng(file, hSrcDS, psOptions); GDALClose(hSrcDS); } // 7. 清理资源 GDALTranslateOptionsFree(psOptions); GDALClearMemoryCaches(); GDALDestroy(); // Why core dump ? return 0; }
  • 编译脚本
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${HOME}/map_gdal/lib:${HOME}/map_proj/lib export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:${HOME}/map_gdal/lib/pkgconfig rm core.* reset SRC_FILE=test2.cpp EXE_FILE=test if [ -f ${EXE_FILE} ]; then rm ${EXE_FILE} fi g++ ${SRC_FILE} \ -o ${EXE_FILE} \ $(pkg-config --cflags --libs gdal) ./${EXE_FILE}
http://www.jsqmd.com/news/1166227/

相关文章:

  • 2026黑龙江四家除草剂供应商|行业选购总结 - 最新行业资讯
  • 基于腾讯混元Hy3模型构建智能体:从核心机制到实践指南
  • 广州黄金回收 赚点零花钱的隐藏渠道 认准清奢六家店 - 新芸鼎珠宝首饰
  • 上交所/深交所合约代码规则解析:6位与8位编码的3个核心差异点
  • 阿里云国际站代理折扣全攻略:如何通过官方代理节省成本
  • TMC7300与PIC18F86K90在有刷直流电机控制中的优化应用
  • TLA2518与PIC18F2610的多通道数据采集方案
  • 提示词工程×代码生成:Claude Code精准输出秘籍,92%开发者忽略的4个上下文锚点
  • STM32 SPI 模式0/3 实战:W25Q64 Flash 读写时序分析 3 步法
  • 重庆旧金避坑盘点,远离小作坊,选择持证实体回收店 - 每日生活报
  • 文本到有声视频生成:模态条件控制与交互优化实战指南
  • SPI总线4种模式(CPOL/CPHA)详解:从时序图到STM32 HAL库配置
  • 家庭电池起火/冒烟事故的消防统计与分析:哪些原因最致命?【2026年】
  • 球球大作战 JAVA项目
  • VSCode Verilog 开发环境:3款Linter工具(xvlog/iverilog/verilator)性能与精度对比
  • 深度解析:高校 AI 通识课现成教学包推荐,EDU360 Cloud AI 通识课2.0教学运行包特点解析
  • 【Springboot毕设全套源码+文档】基于SpringBoot的高校校园网故障管理系统(丰富项目+远程调试+讲解+定制)
  • Compressor.js图像压缩:如何在浏览器中高效处理用户上传的图片?
  • RS485 总线故障排查:因上下拉电阻导致的 Modbus 通讯异常与 3 步修复
  • 2026年7月最新青岛美度官方售后客户服务热线与维修网点地址汇总 - 亨得利钟表维修中心
  • C++实现灰度共生矩阵(GLCM)进行图像纹理分析与工业应用实战
  • RVC、GPT-SoVITS、SVC 3款AI声音克隆方案对比:从5秒素材到商用音质的实测
  • 别再盲目打卡一万步!研究发现:每天走够这个数,健康性价比最高!
  • 参量阵浅剖仪 GeoPass100 解析:ROV/AUV集成3大要点与数据融合方案
  • 闭包的概念与应用
  • 7天实战AI原生游戏:LLM NPC与神经渲染管线集成指南
  • STM32F4 DMA 双缓冲区模式实战:ADC 连续采样 1024 点零 CPU 中断处理
  • 理解力债:AI 生成代码背后被忽视的“隐形成本”
  • 2026实测视频去水印提取工具教程:电脑手机免费在线软件汇总
  • CSAPP Data Lab 13个位运算函数:从 bitXor 到 float_f2i 的完整解题思路