当前位置:

首页 > 编程开发 > c++如何解析TIFF图像中的GeoTIFF地理位置信息标签【深度】

c++如何解析TIFF图像中的GeoTIFF地理位置信息标签【深度】

c++如何解析TIFF图像中的GeoTIFF地理位置信息标签【深度】 如何用 libtiff 读取 GeoTIFF 的 GeoKeyDirectoryTag 和 GeoDoubleParamsTag 如果你以为GeoTIFF的地理信息藏在常规的EXIF里,那可就错了。它的核心机制是通过一组特殊的TI

c++如何解析TIFF图像中的GeoTIFF地理位置信息标签【深度】

c++如何解析TIFF图像中的GeoTIFF地理位置信息标签【深度】

如何用 libtiff 读取 GeoTIFF 的 GeoKeyDirectoryTagGeoDoubleParamsTag

如果你以为GeoTIFF的地理信息藏在常规的EXIF里,那可就错了。它的核心机制是通过一组特殊的TIFF标签来嵌入的。其中,GeoKeyDirectoryTag(标签号34735)扮演着“总目录”的角色,定义了坐标系、投影参数以及键值映射关系。而具体的数值,则存放在两个辅助标签里:GeoDoubleParamsTag(34736)负责存储浮点参数,比如标准纬线、中央经线;GeoAsciiParamsTag(34737)则存放字符串,例如椭球体名称、单位名称。需要明确的是,libtiff库本身并不会自动解析这些标签,一切都需要我们手动提取并按规范解码。

具体操作时,有几个关键点不容忽视:

  • 首先,使用TIFFGetField(tif, TIFFTAG_GEOKEYDIRECTORY, &count, &dir)来获取GeoKeyDirectoryTag的原始数据,它是一个ushort数组。这个数组的前4个元素是固定的头信息,包括版本、修订号、主键数量和扩展键数量。从第5个元素开始,每4个元素构成一组,分别对应KeyID(键ID)、TagLocation(标签位置)、Count(数量)和ValueOffset(值偏移)。
  • 这里有个解码的核心规则:当TagLocation等于0时,表示键值直接存储在第4个字段(ValueOffset)中,但这仅限于short类型的数据。如果TagLocation是34736,那么ValueOffset就是一个索引,指向GeoDoubleParamsTag数组中的具体位置;如果是34737,则指向GeoAsciiParamsTag字符串中的偏移量。
  • 务必进行完整性校验:检查获取到的count是否大于等于4,并且整个数组的长度能否被4整除。如果不符合,那很可能文件已损坏,或者它根本就不是一个标准的GeoTIFF文件。

为什么 TIFFTAG_GEOKEYDIRECTORY 读出来全是 0?

这个问题困扰过不少开发者。最常见的原因,是TIFF文件使用了BigTIFF格式,而你使用的旧版libtiff可能对GeoKeyDirectoryTag的支持不完整,或者在编译时没有启用LIBTIFF_BIGTIFF_SUPPORT宏。另一个比较隐蔽的原因,是图像数据被压缩了(比如用了LZW或ZIP算法)。在某些libtiff版本中,如果没有先调用TIFFSetDirectory(tif, dirnum)切换到主图像目录,就直接读取自定义标签,可能会失败。

遇到这种情况,可以按以下步骤系统排查:

立即学习“C++免费学习笔记(深入)”;

  • 先用命令行工具tiffinfo your.tif确认文件中是否确实包含GeoKeyDirectoryTag,并查看其长度是否非零。这是判断问题出在文件还是代码的第一步。
  • 检查你链接的libtiff库版本,建议使用4.5.0或更高版本,其对GeoTIFF和BigTIFF的支持更为完善。
  • 在代码中,确保在TIFFOpen()打开文件之后,立即调用TIFFSetDirectory(tif, 0)切换到第一个目录(即使是单页图像也建议这么做)。
  • 如果上述方法都失败了,那就得考虑“手动档”操作了:尝试使用TIFFReadCustomDirectory()函数,手动定位并解析标签在文件中的偏移量(这需要你从IFD文件头开始手动计算跳转)。

如何把 GCS_WGS_84PCS_NAD83_UTM_zone_10N 转成 EPSG 代码?

GeoTIFF规范里定义了一系列键,如GTModelTypeGeoKey(模型类型,键号2048)、GTRasterTypeGeoKey(栅格类型,键号2049)、GeographicTypeGeoKey(地理类型,键号2049)等,它们的值对应着预定义的常量。但问题是,这些常量并不直接等于EPSG代码。你需要一个映射表来进行转换——目前最可靠的方式,是在代码里硬编码一些常用的组合,而不是依赖运行时的网络查询,那样会引入不确定性和延迟。

映射的逻辑其实很清晰:

  • 如果GTModelTypeGeoKey的值是ModelTypeProjected(表示是投影坐标系),并且ProjectedCSTypeGeoKey的值是PCS_NAD83_UTM_zone_10N(其数值等于26910),那么对应的EPSG代码就是26910。
  • 如果GTModelTypeGeoKey的值是ModelTypeGeographic(表示是地理坐标系),并且GeographicTypeGeoKey的值是GCS_WGS_84(其数值等于4326),那么EPSG代码就是4326。
  • 需要特别注意:并非所有的GeoKey值都有对应的EPSG代码。例如,遇到自定义的投影坐标系时,你就需要结合ProjLinearUnitsGeoKey(投影线性单位)、ProjStdParallel1GeoKey(第一标准纬线)等一系列参数,来重新构建完整的WKT(Well-Known Text)描述字符串。

说到常量定义,libgeotiff库的geotiff.h头文件里已经定义好了所有这些键和值。但libgeotiff是一个独立的库,不会随libtiff自动链接。如果你不想引入这个额外的依赖,一个更轻量的办法是直接去查阅libgeotiff的源码,把需要的常量定义复制到自己的项目里。

解析出的坐标系参数为何和 QGIS 显示不一致?

这可能是最让人头疼的问题之一。其根本原因在于,GeoTIFF里存储的GeoKey参数,描述的是“模型空间”的坐标系信息,而决定图像在地图上具体位置的,是另一组用于“栅格定位”的标签。很多开发者只读取了GeoKey,却忽略了ModelTransformationTag(33550)或ModelPixelScaleTag(33551)加上ModelTiepointTag(33552)这些基础几何标签,导致计算出来的坐标完全对不上。

要准确定位,必须协同使用以下几组标签:

  • ModelPixelScaleTag(33551):一个包含3个double值的数组,分别表示X、Y、Z方向上一个像素所代表的真实世界单位(可能是度,也可能是米)。
  • ModelTiepointTag(33552):一个至少包含6个double值的数组,其格式为[i, j, k, x, y, z]。其中(i, j, k)是图像上的像素坐标(通常i和j是0,k也是0),(x, y, z)是对应的真实世界地理坐标。
  • 将两者结合,就能构造一个简单的仿射变换:X_geo = tie_x + i * scale_xY_geo = tie_y - j * scale_y(注意Y坐标通常是减号,因为图像坐标的原点在左上角,而地理坐标的原点在左下角)。

真正复杂的情况出现在多Tiepoint(多个地面控制点)或者非正交缩放(图像有旋转或剪切)的时候。这时就必须使用ModelTransformationTag,它是一个包含16个元素的double矩阵,用于进行完整的齐次坐标变换。这里还有一个细节陷阱:必须确认矩阵的存储顺序是行优先还是列优先,根据GeoTIFF规范,它要求的是列优先顺序,这一点在计算时千万不能搞错。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
Mac怎么设置在特定地理位置自动关机
Mac怎么设置在特定地理位置自动关机

Mac不支持原生地理围栏关机,但可通过快捷指令结合通讯录中已命名的“公司”等地点触发AppleScript关机,需启用定位服务并授权完全磁盘访问,执行前无提醒,未保存文档将丢失。你是否希望Mac在离开办公室或回到家进入特定区域时能自动关机,以此避免设备长时间闲置耗电,或者防止敏感信息泄露呢?遗憾的是

圆通速递查单号官网
圆通速递查单号官网

圆通速递查单号官网在哪里? 不少朋友都在寻找圆通快递的官方物流查询入口。别急,这就为你揭晓答案,并带你详细了解它的核心功能与服务。 圆通速递的官方网站地址是:https://www.yto.net.cn/。记住这个地址,所有官方服务都从这里开始。 官网核心功能 来到官网,你会发现它的运单查询服务是全

德邦快递运输情况更新
德邦快递运输情况更新

想第一时间掌握德邦快递包裹的最新动向吗?最可靠的途径就是访问其官方网站:https://www.deppon.com/。在这个官方平台上,您只需输入运单号码,就能获得最精准、最及时的物流动态,实现从发货到收货的全流程透明追踪。 对于寄件人或收件人来说,能清晰掌握包裹的每一步行程,无疑让人安心不少。今

yandex引擎入口官网
yandex引擎入口官网

Yandex搜索引擎官方入口为https://yandex.com,具备界面简洁响应迅速、本地化服务深度整合、多媒体内容直达、隐私保护机制透明、多终端协同体验一致五大特点。 直接访问Yandex搜索引擎的官网入口,是不少用户实际使用时的第一个疑问。下面,我们就来详细梳理一下它在2026年的核心面貌和

C++类构造与析构函数详解
C++类构造与析构函数详解

C++类构造与析构函数详解 C++这门语言,可以说是从C语言这棵大树上衍生出的高级果实,如今的应用普及度有目共睹。作为一种静态类型的通用编程语言,它厉害的地方在于融合了多种编程哲学——无论是传统的面向过程,还是主流的面向对象,乃至数据抽象、泛型编程这些高级概念,它都能很好地支持。正因为这份卓越的扩展

C++中std::upper
C++中std::upper

C++中std::upper_bound用法解析 在C++标准模板库(STL)的算法工具箱里,upper_bound() 绝对算得上是一把精准的“探针”。它的核心任务很明确:在一个已经排好序的区间 [first, last) 内,帮你快速定位到第一个**严格大于**指定值 value 的那个元素。这

今日头条怎么关闭同城推荐
今日头条怎么关闭同城推荐

想要关掉今日头条的同城推荐,分三步走:一、在设置→隐私→个性化推荐设置里,关掉“基于所在位置个性化推荐”;二、在手机系统权限里,禁止头条获取定位;三、清理一下APP里跟位置相关的缓存数据,再重启应用。 你有没有发现,最近刷今日头条,老是刷到同城的新闻或者附近商家的推广?其实,这多半是因为“同城推荐”

C++常对象与成员解析
C++常对象与成员解析

C++中“常”概念全景解析:从对象、成员到指针与引用 在C++的世界里,“常量性”是一个强大的保障机制。它不仅仅是一个const关键字那么简单,而是构建健壮、安全程序的重要基石。今天,我们就来系统梳理一下围绕“常”的一系列概念:常成员、常对象、常指针与常引用。理解它们,是写出高质量C++代码的关键一

Mac如何关闭专注模式的地理位置触发
Mac如何关闭专注模式的地理位置触发

如果想在 Mac 上彻底关掉专注模式的地理位置触发,步骤其实很明确:先到“专注模式”设置里,把基于位置自动触发的条目禁用或直接删除;然后再进入“隐私与安全性→定位服务→系统服务”,关闭“重要地点”。这两步都做完,专注模式就不会再因为位置变化而自动启用了。你想在Mac上关闭专注模式的地理位置触发功能,

using namespace 使用中遇到的问题怎么解决
using namespace 使用中遇到的问题怎么解决

命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。