GDAL PCIDSK 驱动完全指南:读写 PCI Geomatics 数据库文件(.pix)
GIS遥感数据工程【免费下载链接】gdalGDAL is an open source MIT licensed translator library for raster and vector geospatial data formats.项目地址https://gitcode.com/gh_mirrors/gd/gdal点击查看免费下载PCIDSKPCI Geomatics Database File是 PCI EASI/PACE 遥感影像处理软件使用的数据库格式本指南围绕 GDAL 官方驱动文档 展开完整讲解该驱动支持的数据类型、像元组织方式、金字塔overview、地理参考与 RPC 元数据、矢量段读写以及INTERLEAVING、COMPRESSION、TILESIZE等全部创建选项并结合仓库源码与自动化测试深入剖析其底层实现。读完本文你将能够熟练地用 GDAL 打开、创建、转换和检查 PCIDSK 文件并理解驱动内部如何组织块block、段segment与元数据。PCIDSK 格式与驱动概览PCIDSK 是 PCI Geomatics 的 EASI/PACE 软件用于影像分析的数据库文件文件扩展名通常为.pix。GDAL 的 PCIDSK 驱动官方 shortnamePCIDSK被标记为built_in_by_default即默认编译进 GDAL 核心同时也可作为插件编译见 frmts/pcidsk/CMakeLists.txt 中的add_gdal_driver与PLUGIN_CAPABLE_IF NOT GDAL_USE_JPEG_INTERNAL逻辑。该驱动同时支持读取与写入主要特性包括全部像素数据类型与数据组织方式像元交错pixel interleaved、波段交错band interleaved、文件交错file interleaved以及分块tiled方式均可读取写入时统一按官方文档的约定处理。调色板/颜色查找表LUT查找表段当前被忽略但PCT伪彩色表段会被视为与波段关联读取后以颜色表形式呈现。元数据文件级与波段级元数据会被正确关联到影像或波段上。地理参考支持地理变换与投影但对基准面datum和椭球体ellipsoid的某些细节支持存在局限。GCP 与 RPCGCP 段被忽略RPC 段会被转换为 GDAL 风格RFC 22的 RPC 元数据返回。内部金字塔文件内已有的金字塔影像可以被正确读取但新请求构建的金字塔会以外部.ovr文件形式生成。矢量段驱动同样支持读取与写入 PCIDSK 内部的矢量段属于栅格/矢量一体驱动的典型代表。依据来源PCIDSK 官方驱动文档 开篇描述。驱动识别与注册驱动通过文件头魔数完成识别。frmts/pcidsk/pcidskdrivercore.cpp 中的PCIDSKDriverIdentify()实现如下int PCIDSKDriverIdentify(GDALOpenInfo *poOpenInfo) { return poOpenInfo-nHeaderBytes 512 memcmp(poOpenInfo-pabyHeader, PCIDSK , 8) 0; }即要求文件前 512 字节可读且以 8 字节魔数PCIDSK 开头。识别成功后驱动注册以下核心能力见同文件PCIDSKDriverSetCommonMetadata()栅格与矢量双能力GDAL_DCAP_RASTER、GDAL_DCAP_VECTOR均为YES并支持创建图层GDAL_DCAP_CREATE_LAYER与字段GDAL_DCAP_CREATE_FIELD默认扩展名.pix可创建的栅格数据类型Byte UInt16 Int16 Float32 CInt16 CFloat32虚拟文件系统支持GDAL_DCAP_VIRTUALIOYES配合 vsi_pcidsk_io.cpp 中基于VSIFOpenL/VSIFSeekL/VSIFReadL等 VSI 接口实现的IOInterfaces因此/vsimem/、/vsizip/等虚拟路径均可直接使用更新能力GDAL_DCAP_UPDATEYES支持更新GeoTransform、SRS、数据集/波段元数据、栅格值与要素GDAL_DMD_UPDATE_ITEMS矢量能力OGR SQL 与 SQLite 两种 SQL 方言、Integer Real String IntegerList字段类型、Z 几何支持GDAL_DCAP_Z_GEOMETRIESYES。栅格读取数据类型、块结构与位图段波段与块block的组织打开文件时驱动通过 pcidskdataset2.cpp 的PCIDSK2Dataset::Open()调用 PCIDSK SDK 的PCIDSK::Open()随后由LLOpen()依次创建波段对象、位图段波段、矢量图层并挂接金字塔。每个波段对应 SDK 中的PCIDSKChannel。栅格数据的实际读写以块为单位普通通道的块尺寸由poChannel-GetBlockWidth()/GetBlockHeight()决定见PCIDSK2Band构造函数读取块时IReadBlock() 调用poChannel-ReadBlock(...)若通道类型为 1 位CHN_BIT还会将 1 bit 像元上采样为 0/1 的 8 bit 值再返回给上层位图段bitmap segment也会作为波段暴露出来且带NBITS1的IMAGE_STRUCTURE元数据见PCIDSK2Band中GDALMD_NBITS, 1的设置这在 autotest/gdrivers/pcidsk.py 的test_pcidsk_online_1中通过md[NBITS] 1得到验证。数据类型的映射GDAL 数据类型与 PCIDSK 通道类型之间的转换由PCIDSKTypeToGDAL()完成支持的创建类型在驱动核心中声明为Byte UInt16 Int16 Float32 CInt16 CFloat32。SDK 层对应的通道类型常量包括CHN_8U、CHN_16U、CHN_16S、CHN_32RFloat32、CHN_C16SCInt16、CHN_C32RCFloat32等参见 gdal_edb.cpp 中的类型映射使用方式。元数据、颜色表与 NoData文件级与波段级元数据PCIDSK 驱动将元数据写入文件默认域default domain非默认域如AltDomain的元数据则会通过 PAM.aux.xml机制旁路保存。这一点在PCIDSK2Band::SetMetadata()中明确实现当传入非空域时直接委托给GDALPamRasterBand::SetMetadata()。autotest/gdrivers/pcidsk.py 的test_pcidsk_5完整验证了元数据读写闭环创建 400×600 的 8 位单波段文件 →SetMetadata([ABCDEF,GHIJKL])与SetMetadataItem→ 关闭重开后逐项断言默认域与AltDomain的值都能正确回读。PCT 颜色表与 Class_ 分类元数据驱动读取颜色表的逻辑位于PCIDSK2Band::CheckForColorTable()pcidskdataset2.cpp其规则为优先读取通道元数据DEFAULT_PCT_REF指向的 PCT 段若无该元数据且文件只有一个栅格波段则默认将唯一的 PCT 段视为该波段的颜色表若仍未找到 PCT 段则扫描通道的Class_n_Color元数据形如(RGB:red green blue)动态构造颜色表同时Class_n_name元数据会被转换为波段的类别名称category namesGetCategoryNames()实现见同文件第 167 行附近。写颜色表则通过SetColorTable()落盘为 PCT 段读取时GetColorInterpretation()会返回GCI_PaletteIndex。测试test_pcidsk_5验证了颜色表写入、重开回读与SetColorTable(None)清除的全过程。NoData 值NoData 通过数据集元数据项NO_DATA_VALUE存取测试test_pcidsk_6展示了SetMetadataItem(NO_DATA_VALUE, -9999)写入后重开读取GetNoDataValue() -9999再经SetNoDataValue(-1234)更新的完整链路。地理参考与 RPC 元数据地理变换与投影驱动实现GetGeoTransform()/SetGeoTransform()pcidskdataset2.cpp。文档明确指出地理参考受支持但在基准面与椭球体的支持上存在一些局限——当无法用 PCIDSK 自身的地理参考段Georef 段SDK 实现见 sdk/segment/cpcidskgeoref.cpp表达时驱动会回退到 PAM。Web MercatorEPSG:3857等常见投影在test_pcidsk_web_mercator中得到了专门验证gdal.Translate(..., options-of PCIDSK -a_srs EPSG:3857)后GetSpatialRef().IsSame()断言通过。RPC有理多项式系数段文档约定RPC segments will be returned as GDAL style RPC metadata。ProcessRPC()pcidskdataset2.cpp会遍历文件中的 BIN 段寻找PCIDSKRPCSegment将其系数转换为 RFC 22 风格的 RPC 元数据域包括偏移与缩放LINE_OFF、LINE_SCALE、SAMP_OFF、SAMP_SCALE、LONG_OFF、LONG_SCALE、LAT_OFF、LAT_SCALE、HEIGHT_OFF、HEIGHT_SCALE多项式系数X_NUM/X_DEN/Y_NUM/Y_DEN各 20 个GetXNumerator()、GetYNumerator()等若系数数量不足 20 会清空 RPC 元数据并报错。读取 RPC 的验证见test_pcidsk_online_rpc打开样例demo.PIX后断言ds.GetMetadata(RPC) is not None。内部金字塔overview与外部 .ovr文档明确了两条规则读取文件内部已有的金字塔影像会被正确读出。PCIDSK2Band::RefreshOverviewList()pcidskdataset2.cpp遍历poChannel-GetOverviewCount()并将每个金字塔通道包装为PCIDSK2BandGetOverviewCount()/GetOverview()在无内部金字塔时回退到GDALPamRasterBand路径即读取外部.ovr/.aux。创建新请求的金字塔不会写入文件内部而是外部构建为.ovr文件。test_pcidsk_external_ovr验证BuildOverviews(NEAR, [2])后存在test.pix.ovr且GetOverviewCount() 1test_pcidsk_external_ovr_rrd则验证设置USE_RRDYES时生成.aux金字塔。内部金字塔读取的校验数据checksum在test_pcidsk_4、test_pcidsk_tile_v1_overview、test_pcidsk_tile_v2_overview中均有断言。金字塔构建入口为PCIDSK2Dataset::IBuildOverviews()其中对需要新增的金字塔调用 SDK 的poFile-CreateOverviews(...)见 pcidskdataset2.cpp。矢量段栅格/矢量一体数据源PCIDSK 文件可同时容纳栅格影像与矢量段驱动将其统一为一个GDALDataset图层数即矢量段数。主要事实依据打开模式test_ogr_pcidsk_4验证只含栅格的.pix文件在只读模式下无法用 OGR 打开test_ogr_pcidsk_5验证以更新模式打开时可行而test_pcidsk_15则验证纯栅格、栅格矢量、纯矢量、空文件四种组合都能正确往返 CreateCopy。几何类型映射矢量段的LAYER_TYPE元数据决定图层几何类型ogrpcidsklayer.cppWHOLE_POLYGONS→wkbPolygon25DARCS/TOPO_ARCS→wkbLineString25DPOINTS/TOPO_NODES→wkbPoint25DTABLE→wkbNone因此该驱动天然支持 Z 几何GDAL_DCAP_Z_GEOMETRIESYES。字段类型映射SDK 字段类型FieldTypeFloat/Double/Integer/String/CountedInt分别映射为 OGR 的OFTReal/OFTInteger/OFTString/OFTIntegerList字段名RingStart有特殊处理识别为环起点标记。创建图层ICreateLayer()通过poFile-CreateSegment(pszLayerName, , PCIDSK::SEG_VEC, 0L)创建SEG_VEC矢量段单个文件可容纳的图层数上限在test_ogr_pcidsk_too_many_layers中以 1023 层验证超出即失败。要素操作test_ogr_pcidsk_1覆盖了创建数据源、创建图层与字段、写入要素、SetFeature更新、DeleteFeature删除、带 SRSEPSG:4326/32631的几何写入test_ogr_pcidsk_online_1/2则验证了真实多边形样例的几何一致性与test_ogrsf完整性检查。创建选项详解官方文档给出了三个创建选项下面是结合驱动核心元数据pcidskdrivercore.cpp与 SDK 实现sdk/core/pcidskcreate.cpp的完整说明。INTERLEAVING像元组织方式取值含义说明PIXEL像元交错各波段同一像元相邻存放按像素点顺序排列BIPBAND波段交错每个波段数据连续存放BSQ默认值FILE文件交错各波段分别存于独立的文件/数据区INTERLEAVINGFILE对应 SDL 的 FILE 组织TILED分块影像按方块分块存储便于局部访问与压缩注意官方文档的明确约定PCIDSK 文件总是以像素交错pixel interleaved方式生成即使其他组织方式均可读取。SDK 的pcidskcreate.cpp中创建选项字符串的解析顺序依次为FILE、PIXEL、BAND、TILED、NOZERO第 104 行并在文件头偏移 360 处写入 8 字节交错标识fh.Put(interleaving, 360, 8)。驱动源码pcidskdataset2.cpp中INTERLEAVING缺省值为BAND但最终 SDK 实际生成的是像素交错文件测试test_pcidsk_8验证了INTERLEAVINGFILE的创建路径。COMPRESSION压缩方式取值默认值说明NONE✅不压缩RLE–游程编码压缩JPEG–JPEG 压缩可附带 1–100 的质量值如COMPRESSIONJPEG40关键约束除NONE外的压缩只能与TILED交错方式组合使用文档原文values other than NONE may only be used with TILED interleaving驱动元数据中也标注了compression - (INTERLEAVINGTILED only)。JPEG 质量值直接拼接在选项字符串中如JPEG40表示质量 40。驱动创建代码的注释指出其当前未单独暴露 JPEG 质量参数Currently no support for jpeg compression quality因此质量以COMPRESSIONJPEGQ这种紧凑写法传递。测试覆盖test_pcidsk_12(_v1/_v2)验证COMPRESSIONRLE配合 TILED 创建test_pcidsk_13验证COMPRESSIONJPEG创建后重开校验 checksum4645。TILESIZE分块尺寸仅当INTERLEAVINGTILED时生效默认值为127即 127×127 的方块。例如TILESIZE32生成 32×32 的分块测试test_pcidsk_11系列同时覆盖了默认与TILESIZE32两种配置。SDK 内部对 TILED 通道还区分版本TILEVERSION1旧版 tile 组织与TILEVERSION2默认对应 sdk/channel/ctiledchannel.cpp 的实现两种版本的读写在test_pcidsk_11_v1、test_pcidsk_11_v2、test_pcidsk_tile_v1/v2等用例中均有覆盖。其他隐藏选项除官方文档列出的三个选项外驱动核心元数据还声明了TILEVERSION默认2以及带编号的BANDDESCn选项——创建时传入BANDDESC1...可设置第 n 个波段的描述见 pcidskdataset2.cpp 的解析逻辑。驱动能力清单官方文档以语义标签列出的能力如下能力状态supports_createcopy✅ 支持 CreateCopy无损复制测试见test_pcidsk_2、test_pcidsk_3supports_create✅ 支持 Create新建文件supports_georeferencing✅ 支持地理参考基准面/椭球支持存在局限supports_virtualio✅ 支持虚拟文件系统VSI底层实现SDK 结构与文件布局内嵌 PCIDSK SDK驱动不是从零解析格式而是通过随仓库分发的 PCIDSK SDK位于 frmts/pcidsk/sdk完成底层读写。SDK 按功能拆分为core/文件打开/创建pcidskopen.cpp、pcidskcreate.cpp、块文件cpcidskblockfile.cpp、互斥锁、缓冲区等channel/通道实现——像素交错cpixelinterleavedchannel.cpp、波段交错cbandinterleavedchannel.cpp、外部通道cexternalchannel.cpp、分块通道ctiledchannel.cppsegment/段实现——矢量段cpcidskvectorsegment.cpp、PCTcpcidskpct.cpp、LUTcpcidsklut.cpp、地理参考cpcidskgeoref.cpp、RPC 模型cpcidskrpcmodel.cpp、多项式模型、GCP2 段等blockdir/块目录与块层blockdir.cpp、blocktiledir.cpp、blocktilelayer.cpp等。构建层面frmts/pcidsk/CMakeLists.txt驱动以PCIDSK_INTERNAL宏编译内嵌 SDK并在使用外部 JPEG 库时链接JPEG::JPEG以支持 JPEG 压缩的 tile 读写。文件布局要点notes.txt 记录了 SysBMap系统块映射的组织结构可作为理解格式底层设计的参考512 字节头部包含VERSION 1、8 字节影像数量、5 字节绝对块数、8 字节已用块数块映射表项28 字节/条4 字节 SysBData 段号、8 字节绝对块索引、8 字节影像号-1 表示未分配、8 字节链中下一绝对块-1 表示链尾磁盘块映射表中的每块为 8K16 个 512 字节扇区虚拟分块影像128 字节头部记录影像宽高、tile 宽高、tile 数据类型与压缩类型Tilemap每 tile 12 字节记录虚拟文件内偏移、Tile Size map每 tile 8 字节记录数据大小与 Tile Data 依次存放。EDB外部数据库访问驱动还实现了EDBFile接口gdal_edb.cpp允许 PCIDSK SDK 把另一个 GDAL 数据集当作 EDBExternal DataBase通道来读写即通过GDAL_EDBOpen()打开外部数据集并暴露GetWidth/GetHeight/GetChannels/GetType/ReadBlock/WriteBlock等接口实现跨数据源的通道对接。命令行快速上手以下命令可直接在构建好 GDAL 的环境中使用# 将任意 GDAL 支持的栅格转换为 PCIDSK默认像素交错 gdal_translate -of PCIDSK input.tif output.pix # 指定分块组织与 JPEG 压缩质量 40 gdal_translate -of PCIDSK -co INTERLEAVINGTILED -co TILESIZE127 \ -co COMPRESSIONJPEG40 input.tif output.pix # 无损复制并保持地理变换与投影 gdal_translate -of PCIDSK utm.tif utm.pix # 读取文件信息含 RPC 元数据、内部金字塔 gdalinfo output.pix # 构建外部金字塔生成 output.pix.ovr gdaladdo -r nearest output.pix 2 4 8 # 查看矢量段内容 ogrinfo output.pix对应的自动化验证均可在 autotest/gdrivers/pcidsk.py栅格侧与 autotest/ogr/ogr_pcidsk.py矢量侧中找到读者可直接以pytest autotest/gdrivers/pcidsk.py方式在本地复现测试结果。使用注意事项小结读取面广、写入归一四种交错方式均可读但生成的文件总是像素交错如需 TILED务必同时设置INTERLEAVINGTILED。压缩前置条件RLE/JPEG 仅在 TILED 下可用JPEG 是有损压缩质量值 1–100 直接缀在COMPRESSIONJPEG后如JPEG40。金字塔落点读内部金字塔没问题但新建金字塔会生成外部.ovr或配置USE_RRD时生成.aux。GCP 不可用GCP 段被忽略若原始数据依赖 GCP 请改用其他中间格式保留 GCP。矢量打开限制纯栅格文件用只读方式无法通过 OGR 打开需以更新模式访问栅格与矢量可共存于同一.pix文件。驱动实现入口栅格与矢量一体化的核心实现位于 pcidskdataset2.cpp矢量图层实现位于 ogrpcidsklayer.cpp驱动注册与识别逻辑位于 pcidskdrivercore.cpp。赞分享GIS遥感数据工程【免费下载链接】gdalGDAL is an open source MIT licensed translator library for raster and vector geospatial data formats.项目地址https://gitcode.com/gh_mirrors/gd/gdal点击查看免费下载相关推荐GDAL EDIGEO 驱动完全指南读取法国 PCI 数字地籍交换格式GDAL EDIGEO 驱动完全指南读取法国 PCI 数字地籍交换格式 本指南以 GDAL 仓库自带的 EDIGEO 驱动文档 https://link.giGIS遥感数据工程GDAL XYZ 栅格驱动完全指南读写 ASCII Gridded XYZ 规则格网数据GDAL XYZ 栅格驱动完全指南读写 ASCII Gridded XYZ 规则格网数据 GDAL 内置的 XYZ 驱动 ASCII Gridded XYGIS遥感数据工程CANN ops-math Im2col 算子深度解析滑动窗口图像到列的 NPU 实现与调用指南CANN ops math Im2col 算子深度解析滑动窗口图像到列的 NPU 实现与调用指南 Im2colImage to Column是卷积类网络在GIS遥感数据工程上一篇PeerTube 多语言翻译指南基于 Weblate 的协作流程、翻译文件体系与规范要点下一篇react-jsonschema-form Chakra-UI 主题定制指南深入理解 uiSchema 的 chakra 选项创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考