GIS遥感数据工程【免费下载链接】gdalGDAL is an open source MIT licensed translator library for raster and vector geospatial data formats.项目地址https://gitcode.com/gh_mirrors/gd/gdal点击查看免费下载导读KMLSuperOverlay 是 GDAL 内置built-in的栅格驱动负责把任意单/三/四波段栅格切分成带透明度的影像金字塔瓦片并自动生成可供 Google Earth 等 KML 客户端按视点Region/LOD动态加载的 KML Super-Overlay 描述文件输出.kml或打包为.kmz。本文从驱动能力声明、底层切瓦片与金字塔生成算法、全部创建选项、读取侧的多形态 KML 解析逻辑入手结合源码与自动化测试给出可直接复用的gdal_translate/gdal.CreateCopy()实战方案。读完本文你将掌握用 GDAL 把影像发布为 KML 影像金字塔的标准流程与参数调优方法。驱动概览与能力声明KMLSuperOverlay 驱动在官方文档 kmlsuperoverlay.rst 中登记的短名为KMLSuperoverlay属于随 GDAL 一起编译的默认驱动。其核心实现集中在 frmts/kmlsuperoverlay/kmlsuperoverlaydataset.cpp并声明了以下三方面能力CreateCopy支持通过GDALCreateCopy语义从已有栅格数据集创建 KML/KMZ 输出地理参考Georeferencing输出 KML 中写入经纬度边界框与仿射变换读取时能还原 GeoTransform 与 WGS84 投影VirtualIO声明支持/vsimem、/vsizip、/vsicurl等虚拟文件系统接口。驱动注册代码位于 kmlsuperoverlaydataset.cpp 的GDALRegister_KMLSUPEROVERLAY()其中明确GDAL_DMD_LONGNAME为 Kml Super OverlayGDAL_DMD_EXTENSIONS为kml kmz声明为纯栅格驱动GDAL_DCAP_RASTER YESpfnIdentify/pfnOpen/pfnCreateCopy/pfnDelete分别绑定到KmlSuperOverlayReadDataset::Identify、Open、KmlSuperOverlayCreateCopy与一个空的删除实现KmlSuperOverlayDatasetDelete允许对MEM:::之类的目标执行 Delete。在构建层面frmts/kmlsuperoverlay/CMakeLists.txt 显示该驱动无需任何第三方依赖NO_DEPS并且支持以插件形式PLUGIN_CAPABLE单独编译默认随主程序通过 gdalallregister.cpp 中的GDALRegister_KMLSUPEROVERLAY()自动注册。提示运行gdalinfo --formats | grep -i kml或 Python 中gdal.GetDriverByName(KMLSUPEROVERLAY)可确认当前环境是否启用该驱动。创建流程从源栅格到 KML 影像金字塔KmlSuperOverlayCreateCopy()kmlsuperoverlaydataset.cpp是整个写入侧的入口其处理流程可归纳为五个阶段输入校验源栅格波段数必须为 1、3 或 4否则返回失败输出文件扩展名必须是kml或kmz否则报 File extension should be kml or kmz.。坐标准备读取源数据集 GeoTransform得到 north/south/east/west 四至若源数据是投影坐标系IsProjected()则通过OGRCreateCoordinateTransformation把四个角点实时转换到 WGS84 经纬度并采用OAMS_TRADITIONAL_GIS_ORDER经度在前轴序。金字塔层级计算以较长边为准不断对边长除 2 直到不超过 400 像素得到最大缩放级别maxzoom与基础瓦片尺寸随后逐层生成zoomxpixels/zoomypixels每层对应的每像素度数。逐层逐瓦片写出从maxzoom往下到 0 层按zoom/ix/iy.kml目录结构创建子 KML并用GenerateTiles()把源窗口重采样写入 JPEG/PNG 瓦片见下节。收尾如果是 KMZ则通过/vsizip/把doc.kml、各层 KML 与瓦片统一打包最后重新打开输出数据集并返回句柄。目录与文件命名约定从测试 autotest/gdrivers/kmlsuperoverlay.py 的test_kmlsuperoverlay_3断言可以看出输出布局以两层金字塔为例tmp.kml # 根 KML含 Region/LOD 与指向 0/0/0.kml 的 NetworkLink 0/0/0.kml # 最顶层zoom0子 KML引用 0.jpg 1/0/0.jpg 1/0/0.kml # zoom1 的瓦片与子 KML 1/0/1.jpg 1/0/1.kml 1/1/0.jpg 1/1/0.kml 1/1/1.jpg 1/1/1.kml每个子 KML 命名规则为{zoom}/{ix}/{iy}.kml同名目录下的图片瓦片命名为{iy}.jpg或{iy}.pngfileExt由所选 FORMAT 决定目录逐层创建先建zoom目录再建zoom/ix目录VSIMkdir(dir, 0775)根 KML 固定引用0/0/0.kml并使用viewRefreshModeonRegion让 KML 客户端按视口自动拉取子层。GenerateTiles()瓦片重采样与透明处理GenerateTiles()kmlsuperoverlaydataset.cpp负责把源栅格的对应窗口读入内存 MEM 数据集后交给瓦片驱动写盘关键逻辑包括若选择 JPEG 且源为 4 波段则自动降为 3 波段JPEG 不支持 Alpha非 JPEG 时若波段数小于 4会自动追加一个 Alpha 波段Alpha 值为 255不透明或 0无数据透明逐行读取源数据比较GetNoDataValue()标记透明像素若读取失败也按无数据处理调用瓦片驱动的CreateCopy()前通过配置项GDAL_OPEN_AFTER_COPYNO与QUIET_DELETE_ON_CREATE_COPYNO阻止 CreateCopy 后的自动重开与静默删除避免副作用。根 KML 与子 KML 的生成GenerateRootKml()源码 L158-L231输出符合 KML 2.2 命名空间的kml文档包含Document、名称/描述、hideChildrenStyle样式、一个带LatLonAltBoxLodminLodPixels tilesize/2maxLodPixels-1的NetworkLinkhref 指向0/0/0.kml。GenerateChildKml()源码 L237-L459为每个瓦片输出GroundOverlay含LatLonBox或gx:LatLonQuad、可选的 altitude 信息以及指向下一层 4 个子瓦片../../{zoom1}/{cx}/{cy}.kml的NetworkLink列表。源码注释特别指出当覆盖范围达到国家/大陆尺度时若使用gx:LatLonQuad会导致 Google Earth 中贴图位置不准因此当四角恰好构成正矩形lowerleftT upperleftT lowerrightT upperrightT ...时优先写LatLonBox否则才退化为gx:LatLonQuad。LOD 设定zoom0 时minLodPixels1存在子 KML 的层maxLodPixels2048若某瓦片没有子层则不设上限maxLodPixels-1保证父层不会过早消失。创建选项详解驱动注册时通过GDAL_DMD_CREATIONOPTIONLIST源码 L2882-L2908声明了 6 个创建选项与KmlSuperOverlayCreateCopy()中的CSLFetchNameValueDef解析一一对应选项类型默认值说明FORMATstring-selectJPEG瓦片输出格式JPEG、PNG或AUTONAMEstring输出文件主名写入Documentname的叠加层名称DESCRIPTIONstring空写入Documentdescription的描述文本ALTITUDEfloat无离地高度米含义取决于 ALTITUDEMODEALTITUDEMODEstring-selectclampToGround高度解释方式见下方取值表FIX_ANTIMERIDIANbooleanNO是否修复跨越反经线180°导致的 Google Earth 显示问题FORMAT 取值细节JPEG瓦片统一输出.jpg若源为 4 波段会丢 Alpha 变成 3 波段PNG瓦片统一输出.png保留/补建 Alpha 通道AUTO逐瓦片调用DetectTransparency()源码 L464-L537扫描该瓦片是否含透明像素完全不含透明 → 用 JPEG.jpg并置isJpegDrivertrue含透明或半透明像素 → 用 PNG.png若瓦片全部透明既不含不透明像素则直接continue跳过该瓦片不为空洞区域生成无意义文件——对应测试test_kmlsuperoverlay_8验证的大范围空白区不产生多余子 KML/PNG行为。ALTITUDEMODE 取值表与源码分支一致取值行为clampToGround贴地忽略 ALTITUDE源码中直接置空两者absolute绝对海拔必须提供 ALTITUDE缺省时警告并默认ALTITUDE0relativeToSeaFloor相对海床输出gx:altitudeModeclampToSeaFloor吸附海床忽略 ALTITUDE其他值警告 Ignoring unhandled value of ALTITUDEMODE 并忽略其中absolute与clampToGround写入标准altitudeModerelativeToSeaFloor/clampToSeaFloor写入 Google 扩展命名空间下的gx:altitudeMode。FIX_ANTIMERIDIAN 行为当栅格跨越反经线且东经小于西经east west时开启该选项会执行east 360修正同时在各子 KML 的LatLonAltBox与 GroundOverlay 边界中同样把东侧坐标 360保证 KML 边界 east ≥ west。对应测试test_kmlsuperoverlay_5会逐一解析所有 KML 中的 LatLonAltBox断言east west。典型触发场景是使用中央经线 100° 的 Web Mercator 投影源数据如测试中的 EPSG:3994。实战示例gdal_translate 与 Python CreateCopy命令行方式# 基本用法输出 KML 目录金字塔PNG 瓦片带透明度 gdal_translate -of KMLSUPEROVERLAY \ -co FORMATPNG \ input.tif output.kml # 打包为 KMZ内部自动走 /vsizip/ gdal_translate -of KMLSUPEROVERLAY \ -co FORMATAUTO \ -co NAMEMy Overlay \ -co DESCRIPTIONAirborne imagery 2025 \ input.tif output.kmz # 跨反经线影像 绝对高度模式 gdal_translate -of KMLSUPEROVERLAY \ -co FORMATJPEG \ -co FIX_ANTIMERIDIANYES \ -co ALTITUDEMODEabsolute -co ALTITUDE5000 \ meridian_input.tif output.kmlgdal_translate -of KMLSUPEROVERLAY会调用驱动注册表找到KMLSUPEROVERLAY走GDALCreateCopy路径因此上述-co选项与下文 Python 选项完全一致。Python / GDAL API 方式from osgeo import gdal src gdal.Open(input.tif) # 1 / 3 / 4 波段Byte 类栅格 drv gdal.GetDriverByName(KMLSUPEROVERLAY) # 输出为 KMZAUTO 格式有透明的瓦片用 PNG纯不透明瓦片用 JPEG ds drv.CreateCopy( output.kmz, src, options[ FORMATAUTO, NAMEMy Overlay, DESCRIPTIONgenerated by GDAL, FIX_ANTIMERIDIANNO, ], ) print(ds.GetMetadataItem(NAME)) # 可读回 My Overlay print(ds.GetRasterBand(1).GetOverviewCount()) # 返回金字塔概览层数 ds None src None注意事项源栅格像素类型不限驱动声明支持 Byte/Int16/UInt16/Int32/UInt32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64但瓦片统一以GDT_UInt8写盘浮点源会按 UInt8 重采样输出路径支持/vsimem/、/vsizip/、/vsicurl/等 VSI 路径对应GDAL_DCAP_VIRTUALIO能力自动化测试即大量使用/vsimem/kmlout.kmz这类虚拟路径Windows 上使用超长路径时测试用例会先拼上\\?\前缀对应 NEWS 中 fix creating datasets using extended-length path on Windows (#12601) 的修复。读取侧三种 KML 结构的识别与解析驱动不仅能写也能读。KmlSuperOverlayReadDataset::Identify()源码 L1694-L1738按以下特征识别文件.kmz直接进入打开流程返回 -1 交由 Open 处理.kml且头部含kml标记头部最多摄取 10 KB 后再次判断中同时出现NetworkLinkRegionLink或DocumentRegionGroundOverlay或GroundOverlayIconhrefLatLonBox或gx:LatLonQuad。Open()源码 L2615-L2849则依次尝试三种结构测试 kmlsuperoverlay.py 的test_kmlsuperoverlay_6/7分别覆盖了后两类单文档多瓦片KmlSingleDocRasterDataset适用于doc.kml一次性列出所有层级瓦片的结构典型如开源地形的kml_image_L{level}_{j}_{i}.{png|jpg}命名模式。驱动会解析全部href逐级推断每层最右下瓦片坐标、整体尺寸与全局边界并按nTileSize默认为 1024若瓦片非正方形拼出完整栅格BuildOverviews()再把各层级组织为概览带。经典 Super-OverlayKmlSuperOverlayReadDataset即本驱动自己写出的根 KML → NetworkLink → 子 KML递归结构。驱动通过KmlSuperOverlayComputeDepth()沿 NetworkLink 链下钻统计金字塔深度据此计算nFactor1 nDepth从而把最顶层瓦片尺寸放大为完整分辨率nRasterXSize nFactor * icon宽并构建若干层概览m_apoOverviewDS。子数据集经LinkedDataset双向链表缓存上限 64 个LRU 淘汰读取时按Region边界与请求窗口的交集动态决定打开哪些子 KML。单 GroundOverlayKmlSingleOverlayRasterDataset适用于仅含一个GroundOverlay的简单 KML如 QGIS 相关 issue 的用例。此时直接以Icon.href指向的影像为源构建 VRT 数据集并套用从LatLonBox/gx:LatLonQuad解析出的 GeoTransform。读取结果统一表现为WGS84 地理坐标系SRS_WKT_WGS84_LAT_LONG、每像素 UInt8、四波段 RGBA单波段或三波段不足时补齐假 Alpha并尽可能暴露Document中的NAME/DESCRIPTION元数据测试test_kmlsuperoverlay_4验证写回后可读回。若 GroundOverlay 引用带调色板PCT的单波段图还会展开调色板并保留GCI_PaletteIndex与颜色表对应test_kmlsuperoverlay_single_overlay_document_pct与 NEWS 中的相关修复。测试验证与已知注意点仓库内 autotest/gdrivers/kmlsuperoverlay.py 提供了完整的回归测试矩阵可直接作为行为契约参考test_kmlsuperoverlay_1/2KMZ 与 KML 的 CreateCopy 往返校验源为small_world.tifFORMATPNGtest_kmlsuperoverlay_3投影源utm.tif自动转 WGS84校验输出四至与完整目录树test_kmlsuperoverlay_4NAME/DESCRIPTION/ALTITUDE/ALTITUDEMODE 组合以及概览带校验和30111与 VRT 包装读一致性test_kmlsuperoverlay_5FIX_ANTIMERIDIANYES下所有 LatLonAltBox 的 east ≥ westtest_kmlsuperoverlay_6单文档多瓦片 KMZkmlimage.kmz的 GeoTransform 与概览校验test_kmlsuperoverlay_7/single_overlay_*/gx_latlonquad单 GroundOverlay、Document/Folder 变体与gx:LatLonQuad矩形识别test_kmlsuperoverlay_8FORMATAUTO下空白区不生成冗余瓦片。另外两点使用注意安全边界驱动在打开 KML 时会用CPLHasPathTraversal()校验href/Icon引用防止路径穿越源码多处 Path traversal detected 分支。同时 doc/source/user/security.rst 明确指出 KMLSuperOverlay 属于内部再调用 GDALOpen() 驱动其他驱动的类别——因为读取时会动态打开内嵌的 PNG/JPEG 与子 KML处理不可信输入时应保持与其他 GDAL 驱动一致的谨慎策略。能力边界驱动不支持原生Create()仅CreateCopy也不提供Delete的实际文件删除语义删除实现为空仅允许对虚拟目标执行。若要把生成的 KML 部署到网络建议直接将.kmz上传或把doc.kml与zoom/ix/iy目录树整体发布到 Web 服务器KML 客户端通过viewRefreshModeonRegion按需拉取对应层级的瓦片与子 KML实现大影像的渐进式浏览。小结KMLSuperOverlay 驱动以一条gdal_translate -of KMLSUPEROVERLAY命令即可完成大影像 → KML 影像金字塔的发布其核心价值在于自动计算 LOD 层级、按视点惰性加载的 NetworkLink 结构、JPEG/PNG/AUTO 三种瓦片格式策略含空白瓦片裁剪与 Alpha 透明、投影源到 WGS84 的实时转换以及反经线修正读取侧则兼容经典 Super-Overlay、单文档多瓦片与单 GroundOverlay 三种 KML 形态做到自产自销并兼容外部工具如 Google Earth、QGIS生成的叠加层。结合 自动化测试 与 注册/实现源码可以在自己的项目中稳定复现、验证并扩展这一能力。赞分享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 CPHD 驱动实战基于 sarkit 的测试数据生成与多维栅格读取全解析GDAL CPHD 驱动实战基于 sarkit 的测试数据生成与多维栅格读取全解析 本指南围绕 GDAL 仓库中 CPHDCompensated PhaseGIS遥感数据工程Mapshaper 中的 KML / KMZ 读写格式特性、CLI 用法与源码实现解析Mapshaper 中的 KML / KMZ 读写格式特性、CLI 用法与源码实现解析 KML 是 Google 为 Google Earth 设计的 XMLGISCLI数据可视化Roc 编译器单态化快照测试解析闭包捕获、闭包提升与静态分发mono_static_dispatch_closureRoc 编译器单态化快照测试解析闭包捕获、闭包提升与静态分发mono_static_dispatch_closure 本篇技术指南围绕 Roc 编译器一GIS遥感数据工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考