GIS遥感数据工程【免费下载链接】gdalGDAL is an open source MIT licensed translator library for raster and vector geospatial data formats.项目地址https://gitcode.com/gh_mirrors/gd/gdal点击查看免费下载AAIGrid 是 GDAL 内置的栅格驱动用于读写 Arc/Info ASCII Grid.asc格式。该格式是 Arc/Info Grid 栅格的纯文本交换格式常以.asc文件加一个可选的.prj投影文件成对出现通常由 Arc/Info 的ASCIIGRID命令生成。通过本指南你将掌握 AAIGrid 的完整读写能力、驱动内置的数据类型自动探测逻辑、三个关键配置选项AAIGRID_DATATYPE、FORCE_CELLSIZE、DECIMAL_PRECISION的实战用法以及从源码与测试层面理解驱动行为与常见边界情况。驱动概览与适用场景AAIGrid 驱动支持读取与写入并支持读取仿射地理配准变换affine georeferencing transform以及部分投影信息。它适合以下典型场景与 ArcGIS / ArcInfo 之间交换单波段栅格数据用gdal_translate或 Python API 快速将 GeoTIFF 等格式转为可读的 ASCII 文本网格处理 Golden Surfer 等第三方软件生成的特殊 ASCII Grid 变体含dx/dy参数需要将 NODATA 值原样保留并保持与波段数据类型一致。从驱动注册代码frmts/aaigrid/aaigriddataset.cpp可以看到该驱动的能力元数据元数据项值驱动名AAIGrid长名Arc/Info ASCII Grid默认扩展名asc支持创建数据类型Byte、UInt16、Int16、Int32、Float32打开选项DATATYPE可选Int32/Float32/Float64创建选项FORCE_CELLSIZE、DECIMAL_PRECISION、SIGNIFICANT_DIGITS虚拟 I/O/vsimem、/vsigzip 等支持该驱动默认随 GDAL 编译构建built-in by default无需额外依赖。测试文件位于 autotest/gdrivers/aaigrid.py测试数据位于 autotest/gdrivers/data/aaigrid。AAIGrid 文件结构头信息与数据体AAIGrid 文件由头信息块和逐行栅格数据两部分组成。一个典型的文件示例如下取自测试数据 autotest/gdrivers/data/aaigrid/pixel_per_line.ascncols 15 nrows 12 xllcorner 0.100000E06 yllcorner 0.650000E06 cellsize .500E02 nodata_value -99999 .000E00 .000E00 ...各头字段的含义与驱动解析行为如下ncols/nrows栅格列数、行数。驱动通过 ParseHeader() 解析并用GDALCheckDatasetDimensions()校验尺寸合法性xllcorner/yllcorner左下角坐标栅格像元为面状像元对应 GDAL 的GDALMD_AREA_OR_POINTArea语义。驱动在 ParseHeader() 中将其转换为 GDAL 的左上角起始仿射变换yorig yllcorner nrows * cellsize且yscale取负xllcenter/yllcenter左下角像元中心坐标点状像元对应GDALMD_AREA_OR_POINTPoint。驱动在解析时会减去半个像元尺寸得到角点坐标ParseHeader()cellsize像元尺寸。驱动假定像元为正方形dfCellDX dfCellDY cellsizedx/dy非正方形像元时分别表示 X、Y 方向的像元尺寸见下文FORCE_CELLSIZE章节NODATA_value无数据值读取时会以与波段数据相同的格式保留详见「NODATA 保留与数据类型探测」章节。头字段是大小写不敏感的驱动注册与Identify()使用STARTS_WITH_CI不区分大小写匹配ncols、nrows、xllcorner、yllcorner、cellsize、dx、dy等关键字见 Identify()。实际测试数据 autotest/gdrivers/data/aaigrid/pixel_per_line.asc 中nodata_value即为小写可正常识别。读取行为与打开选项自动识别与打开流程AAIGDataset::Open()先调用Identify()检查文件头部是否出现ncols、nrows、xllcorner等关键字且头信息至少 40 字节随后由CommonOpen()完成完整打开流程CommonOpen()主要步骤包括解析头信息得到栅格尺寸、像元尺寸与坐标原点构建 GDAL 仿射变换寻找真实数据起始位置跳过头信息块自动探测数据类型见下一节创建AAIGRasterBand波段对象尝试加载同名.prj投影文件先尝试.prj在大小写敏感文件系统上失败时再尝试.PRJ见 CommonOpen()初始化 PAMTryLoadXML()并检查外部概览overview。AAIGRasterBand在构造时为每一行记录文件偏移panLineOffset数组读取时通过Seek()Getc()按行定位支持随机块读取IReadBlock()。同时CommonOpen()对声明的尺寸做了安全校验若ncols/nrows超过 1000 万、或像素总数超过 10 亿且文件实际大小不足以容纳每个像元至少 2 字节将报错Too large raster dimension ... compared to file size防止异常分配内存对应测试test_aaigrid_open_file_with_large_dimension_but_small。数据类型自动探测与 AAIGRID_DATATYPE默认情况下GDAL 返回的 AAIGRID 数据集数据类型是自动探测的对于含浮点值的网格返回Float32否则返回Int32。探测逻辑结合了 NODATA 值格式与栅格数据内容具体见 ParseHeader() 与 CommonOpen()解析NODATA_value时若其含有小数点、逗号、为 NaN、或超出 32 位整数范围INT_MIN~INT_MAX则判定为Float32若绝对值小于FLT_MIN或大于FLT_MAX如2.2250738585072014e-308这样的DBL_MIN则升级为Float64若头信息不足以判定则扫描真实数据块一旦发现.、,、e、E字符即判定为浮点型CommonOpen()无数据值时浮点值会经MapNoDataToFloat()转换确保 NoData 与 Float32 表达一致并夹紧到 float 范围、保留 ±inf 与 NaNaaigriddataset.cpp。自动探测的准确性可由测试验证test_aaigrid_6NODATA 含小数点 →Float32、test_aaigrid_6bisNODATA 为整数 →Int32、test_aaigrid_15NODATA 等于DBL_MIN→Float64。当需要显式指定数据类型时可通过两种方式1. 配置选项配置选项作用于所有打开操作AAIGRID_DATATYPEFloat642. 打开选项open option作用于单次打开gdal.Open(float64.asc, open_options[DATATYPEFloat64])二者的可选值均为Int32、Float32、Float64。源码中配置选项优先、打开选项兜底CommonOpen()若传入了三者之外的非法值驱动会发出Unsupported value for AAIGRID_DATATYPE警告并回退为Int32。建议当 NODATA 或数据值超出单精度 float 精度范围时务必显式设置AAIGRID_DATATYPEFloat64否则自动探测可能降为Float32丢失精度。测试 test_aaigrid_10 演示了通过配置选项与打开选项将默认探测为 Float32 的float64.asc强制按 Float64 读取并能精确还原-1.234567890123的 NODATA 值与数据极值。NODATA 保留与特殊取值读取时网格中的 NODATA 值以与波段数据相同的格式保留。驱动支持以下特殊情形NODATA_value null这是 D12 软件特有的写法。读取时按数据类型映射为-FLT_MAXFloat32或-DBL_MAXFloat64测试见 test_aaigrid_null 与 test_aaigrid_null_float64NODATA 为 NaN数据体中以nan开头也能被识别为数据而非头信息CommonOpen()测试见 test_aaigrid_nodata_nan数据体以nan开头正常读取test_aaigrid_starting_with_nan逗号作小数分隔符某些区域设置下使用逗号驱动同样支持对应 test_aaigrid_comma测试数据 pixel_per_line_comma.asc。写入行为与创建选项AAIGrid 驱动通过CreateCopy()实现写入CreateCopy()本质是「复制创建」从源数据集读取数据并写出 ASCII 网格。写入时有如下约束与默认行为仅支持单波段多波段输入会报错AAIG driver doesnt support %d bands. Must be 1 band.源数据类型Byte、Int16、UInt16、Int32按整数写出其他类型按浮点写出并以%.20g作为默认格式见下文地理参考若源数据集有投影会尝试写出同名的.prj文件ESRI WKT 格式写入的像元坐标为左下角yllcorner与 GDAL 的左上角语义自动换算且支持 south-up 栅格gt.yscale 0测试见 test_aaigrid_write_south_up_rasterNODATA 写出若源波段有 NODATA 值会写入NODATA_value行整数数据按整数写出浮点数据按当前精度格式写出CreateCopy()浮点小数点的兜底为保证生成的浮点文件可被正确识别驱动确保整行输出中至少出现一个小数点——若某值格式化为纯整数且非 inf/NaN会自动追加.0对应 issue #6060测试 test_aaigrid_14。写入基本用法gdal_translate -of AAIGrid input.tif output.asc或 Python APIfrom osgeo import gdal src gdal.Open(input.tif) out gdal.GetDriverByName(AAIGrid).CreateCopy( output.asc, src, options[FORCE_CELLSIZENO, DECIMAL_PRECISION3] )FORCE_CELLSIZE处理非正方形像元当写入的像元不是正方形X 与 Y 方向地理尺寸不同时默认会输出dx与dy参数替代cellsize。这类文件可以在 Golden Surfer 中使用但大多数其他 ASCII Grid 读取程序包括 ArcGIS不支持dx/dy参数。判断逻辑位于 CreateCopy()当|xscale yscale|或|xscale - yscale|小于1e-7时视为正方形像元、输出cellsize否则输出dx/dy。驱动在写出dx/dy变体时还会发出警告Producing a Golden Surfer style file with DX and DY instead of CELLSIZE since the input pixels are non-square. Use the FORCE_CELLSIZETRUE creation option to force use of DX for even though this will be distorted. Most ASCII Grid readers (ArcGIS included) do not support the DX and DY parameters.创建选项取值YES/NOTRUE/FALSE亦可通过CPLTestBool解析。FORCE_CELLSIZEYES强制以 X 方向像元尺寸写入cellsize即使 Y 方向尺寸不同这会造成一定形变更稳妥的替代方案是先将输入重采样为正方形像元再写入避免任何兼容性问题。测试 test_aaigrid_7 使用 nonsquare.vrt像元 60×50验证了非正方形像元的 CreateCopy 行为。DECIMAL_PRECISION 与 SIGNIFICANT_DIGITS控制浮点输出精度写入浮点值时驱动默认使用%.20g格式约 20 位有效数字可最大限度保留 double 精度。可通过两个创建选项自定义创建选项取值说明DECIMAL_PRECISION非负整数指定输出的小数位数内部以%.Nf格式输出例如DECIMAL_PRECISION3输出 3 位小数如-99999.000SIGNIFICANT_DIGITS非负整数指定输出的有效数字位数内部以%.Ng格式输出例如SIGNIFICANT_DIGITS3输出 3 位有效数字如-1e05两者的精度格式构造见 CreateCopy()。需要说明的是DECIMAL_PRECISION来自 C 标准库printf语义官方文档建议参考 printf 参考手册了解其精确行为。冲突处理若同时指定两者驱动发出警告Conflicting precision arguments, using DECIMAL_PRECISION并以DECIMAL_PRECISION为准CreateCopy()。这两个选项的 NODATA 写出精度也有专门测试test_aaigrid_9DECIMAL_PRECISION2写浮点数据test_aaigrid_11SIGNIFICANT_DIGITS2写浮点数据test_aaigrid_12DECIMAL_PRECISION3时 NODATA 输出为-99999.000test_aaigrid_13SIGNIFICANT_DIGITS3时 NODATA 输出为-1e05。实践建议默认%.20g精度最高但文件更大若追求文件紧凑且对精度要求不高可设置DECIMAL_PRECISION6或SIGNIFICANT_DIGITS7与 Float32 精度匹配来压缩输出体积。驱动能力汇总与限制能力说明读取支持含仿射地理配准与部分投影依赖.prj写入CreateCopy支持单波段地理参考支持.prj读取 / 写出虚拟 I/O支持/vsimem/等虚拟文件系统test_aaigrid_8外部概览支持通过oOvManager初始化CommonOpen()投影支持范围相当有限仅能通过.prj文件ESRI 风格 WKT读取部分投影关于投影支持需要特别注意驱动通过importFromESRI()解析.prj文件仅覆盖常见的 ESRI 投影定义地理坐标单位为秒UnitsDS时还会自动将坐标除以 3600 换算为度CommonOpen()。官方文档注明如有额外可用的.prj样例可提供给维护者以扩充支持列表。.prj与主文件大小写不匹配的情况也有测试覆盖test_aaigrid_5测试数据 case_sensitive.ASC 与 case_sensitive.PRJ。此外AAIGrid 驱动源码与 GRASS ASCII Grid 驱动GRASSASCIIGrid、ISGInternational Service for the Geoid驱动共享同一实现文件 frmts/aaigrid/aaigriddataset.cpp通过GridFormat枚举区分见 aaigriddataset.h但三者是独立的驱动。Arc/Info二进制Grid 格式请使用 raster.aig 驱动文档 对应的 AIG 驱动。源码导航从文档到实现若希望深入阅读驱动实现建议按以下顺序驱动注册与元数据frmts/aaigrid/aaigriddataset.cpp文件识别Identifyfrmts/aaigrid/aaigriddataset.cpp头信息解析与数据类型判定ParseHeader()打开主流程CommonOpen()按行读取IReadBlock()写入主流程与精度选项CreateCopy()类声明frmts/aaigrid/aaigriddataset.h自动化测试autotest/gdrivers/aaigrid.py测试数据在 autotest/gdrivers/data/aaigrid。小结AAIGrid 驱动以极小的实现成本为 GDAL 提供了 Arc/Info ASCII Grid 格式的双向支持读取时自动识别头字段、自动探测数据类型并保留 NODATA写入时通过FORCE_CELLSIZE解决非正方形像元兼容问题、通过DECIMAL_PRECISION/SIGNIFICANT_DIGITS精确控制浮点输出精度。掌握了这些选项与源码行为即可在 ArcGIS 生态与 GDAL 工作流之间无缝交换 ASCII 网格数据。赞分享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遥感数据工程GDAL栅格数据模型深度解析GDAL栅格数据模型深度解析 引言 在地理信息系统GIS和遥感数据处理领域栅格数据是最基础且重要的数据格式之一。GDALGeospatial DataGIS遥感数据工程CANN ops-math 算子 aclnnInplaceMaskedFillTensor 两段式接口开发指南CANN ops math 算子 aclnnInplaceMaskedFillTensor 两段式接口开发指南 aclnnInplaceMaskedFillTeGIS遥感数据工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考