Skip to content

GeoTIFF Support ​

GeoTIFF 是一种广泛采用的格式,用于存储地理参考栅格数据,它将地理空间元数据直接嵌入到 TIFF 文件中。本文档记录了 GeoTools 读取和写入 GeoTIFF 文件的实现,可通过 gt-geotiff 模块获得。

架构概述 ​

GeoTools 中的 GeoTIFF 实现建立在 Java ImageIO 库的基础上,用于基本 TIFF 处理,同时添加了对地理空间元数据解释的支持。该模块旨在与更广泛的 GeoTools coverage API 集成。

SVG
100%

读取 GeoTIFF 文件 ​

GeoTiffReader 类负责读取 GeoTIFF 文件并将其转换为 GridCoverage2D 对象。读取器自动解释 GeoTIFF 元数据,包括坐标参考系统、变换参数和 NoData 值。

基本用法 ​

// 通过格式工厂创建读取器
File file = new File("example.tif");
GeoTiffFormat format = new GeoTiffFormat();
GeoTiffReader reader = format.getReader(file);

// 读取 coverage
GridCoverage2D coverage = reader.read(null);

// 完成后始终释放读取器
reader.dispose();

读取过程 ​

SVG
100%

读取参数 ​

您可以通过提供参数来控制读取过程:

// 定义要读取的数据子集(降低分辨率)
final ParameterValue<GridGeometry2D> gg = AbstractGridFormat.READ_GRIDGEOMETRY2D.createValue();
final GeneralBounds envelope = reader.getOriginalEnvelope();
final Dimension dim = new Dimension();
dim.setSize(reader.getOriginalGridRange().getSpan(0) / 4,
            reader.getOriginalGridRange().getSpan(1) / 4);
final Rectangle rasterArea = ((GridEnvelope2D) reader.getOriginalGridRange());
rasterArea.setSize(dim);
final GridEnvelope2D range = new GridEnvelope2D(rasterArea);
gg.setValue(new GridGeometry2D(range, envelope));

// 应用概览策略
final ParameterValue<OverviewPolicy> policy = AbstractGridFormat.OVERVIEW_POLICY.createValue();
policy.setValue(OverviewPolicy.NEAREST);

// 使用参数读取
GridCoverage2D coverage = reader.read(new GeneralParameterValue[]{gg, policy});

写入 GeoTIFF 文件 ​

GeoTiffWriter 类负责将 GridCoverage2D 对象写入 GeoTIFF 文件,保留坐标参考系统和其他空间元数据。

基本用法 ​

// 通过格式工厂创建写入器
File outputFile = new File("output.tif");
GeoTiffFormat format = new GeoTiffFormat();
GeoTiffWriter writer = format.getWriter(outputFile);

// 写入 coverage
writer.write(coverage, null);

// 完成后始终释放写入器
writer.dispose();

写入过程 ​

SVG
100%

写入参数 ​

您可以通过提供参数来控制写入过程:

// 配置压缩
GeoTiffWriteParams writeParams = new GeoTiffWriteParams();
writeParams.setCompressionMode(GeoTiffWriteParams.MODE_EXPLICIT);
writeParams.setCompressionType("LZW");
writeParams.setTilingMode(GeoTiffWriteParams.MODE_EXPLICIT);
writeParams.setTiling(512, 512);

// 设置写入参数
ParameterValue<GeoToolsWriteParams> wParams =
    AbstractGridFormat.GEOTOOLS_WRITE_PARAMS.createValue();
wParams.setValue(writeParams);

// 在 GeoTIFF 旁边写入世界文件
ParameterValue<Boolean> tfw = GeoTiffFormat.WRITE_TFW.createValue();
tfw.setValue(true);

// 使用参数写入 coverage
writer.write(coverage, new GeneralParameterValue[]{wParams, tfw});

坐标参考系统处理 ​

GeoTIFF 文件可以通过多种方式存储坐标参考系统信息:

  1. 用于常见 CRS 定义的标准 GeoTIFF GeoKeys
  2. 用于自定义投影的用户定义参数
  3. 带有嵌入 ESRI WKT 字符串的引文
SVG
100%

读取 CRS ​

读取 GeoTIFF 文件时,GeoTiffReader 从元数据中提取 CRS 信息:

// 从 GeoTIFF 获取 CRS
GeoTiffReader reader = new GeoTiffReader(file);
CoordinateReferenceSystem crs = reader.getCoordinateReferenceSystem();

如果 GeoTIFF 没有 CRS 信息,您可以提供默认值:

// 提供默认 CRS 作为提示
CoordinateReferenceSystem defaultCRS = CRS.decode("EPSG:4326");
Hints hints = new Hints(Hints.DEFAULT_COORDINATE_REFERENCE_SYSTEM, defaultCRS);
GeoTiffReader reader = new GeoTiffReader(file, hints);

写入 CRS ​

写入 GeoTIFF 文件时,GeoTiffWriter 将 CRS 信息编码为 GeoTIFF 元数据:

// 来自 GridCoverage2D 的 CRS 将被编码在输出 GeoTIFF 中
writer.write(coverage, null);

CRS2GeoTiffMetadataAdapter 类负责从 GeoTools CRS 转换为 GeoTIFF 元数据。它识别 CRS 的类型(地理或投影)并编码适当的参数。

GeoTIFF 元数据结构 ​

GeoTIFF 将地理空间元数据嵌入到 TIFF 文件结构中。理解此结构有助于处理 GeoTIFF 文件。

SVG
100%

访问元数据 ​

您可以通过读取器访问 GeoTIFF 元数据:

GeoTiffReader reader = new GeoTiffReader(file);
GeoTiffIIOMetadataDecoder metadata = reader.getMetadata();

// 获取变换信息
double[] modelTransformation = metadata.getModelTransformation();
TiePoint[] tiePoints = metadata.getModelTiePoints();
PixelScale pixelScale = metadata.getModelPixelScale();

// 获取 NoData 值
Double noData = metadata.getNoData();

// 获取特定的 GeoKeys
String projectionKey = metadata.getGeoKey(GeoTiffPCSCodes.ProjectionGeoKey);

高级功能 ​

概览和分辨率级别 ​

GeoTIFF 文件可能包含内部或外部概览(数据的较低分辨率版本),以便在较小比例尺下更快渲染。

SVG
100%

GeoTiffReader 根据请求的分辨率自动选择适当的概览级别。您可以使用 OVERVIEW_POLICY 参数控制此行为:

// 设置概览策略
ParameterValue<OverviewPolicy> policy = AbstractGridFormat.OVERVIEW_POLICY.createValue();
policy.setValue(OverviewPolicy.QUALITY); // 选项: QUALITY, SPEED, NEAREST, IGNORE

// 使用策略读取
coverage = reader.read(new GeneralParameterValue[]{policy});

遮罩和 ROI 支持 ​

GeoTIFF 文件可以具有标识有效数据区域的关联遮罩波段。GeoTiffReader 自动检测并使用这些遮罩来创建感兴趣区域(ROI)。

// 检查 coverage 是否具有来自遮罩的 ROI
GridCoverage2D coverage = reader.read(null);
ROI roi = CoverageUtilities.getROIProperty(coverage);
if (roi != null) {
    // coverage 具有源自遮罩的 ROI
}

遮罩可以是内部的(GeoTIFF 内部)或外部的(单独的文件)。GeoTiffReader 使用 MaskOverviewProvider 处理这两种类型。

NoData 值 ​

GeoTIFF 文件可以定义 NoData 值来指示不存在实际数据的像素。读取器解释这些值并将它们附加到生成的 coverage:

// 从 coverage 访问 NoData 信息
GridCoverage2D coverage = reader.read(null);
NoDataContainer noData = CoverageUtilities.getNoDataProperty(coverage);
if (noData != null) {
    double noDataValue = noData.getAsSingleValue();
    // 使用 NoData 值
}

您可以使用 WRITE_NODATA 参数控制是否写入 NoData 值:

ParameterValue<Boolean> writeNoData = GeoTiffFormat.WRITE_NODATA.createValue();
writeNoData.setValue(true);
writer.write(coverage, new GeneralParameterValue[]{writeNoData});

地面控制点 ​

某些 GeoTIFF 文件使用地面控制点(GCP)进行地理参考,而不是使用仿射变换。GeoTiffReader 可以提取并解释这些点:

// 检查读取器是否具有地面控制点
GeoTiffReader reader = new GeoTiffReader(file);
GroundControlPoints gcps = reader.getGroundControlPoints();
if (gcps != null) {
    List<TiePoint> tiePoints = gcps.getTiePoints();
    CoordinateReferenceSystem gcpCrs = gcps.getCoordinateReferenceSystem();
    // 使用 GCP
}

云优化 GeoTIFF (COG) 支持 ​

云优化 GeoTIFF (COG) 是一种格式规范,用于针对 HTTP 高效访问进行优化的 GeoTIFF 文件,特别是对于云存储。GeoTools 通过专门的流和读取器实现支持读取 COG 文件。

SVG
100%

在 GeoTools 中使用 COG 文件:

// 远程 COG 文件的 URL
URL cogUrl = new URL("https://example.com/data.tif");

// GeoTiff 格式将检测并使用 COG 的适当读取器
GeoTiffFormat format = new GeoTiffFormat();
if (format.accepts(cogUrl)) {
    GeoTiffReader reader = format.getReader(cogUrl);
    GridCoverage2D coverage = reader.read(null);
    // 使用 coverage
}

COG 文件也可以用作 ImageMosaic 中的颗粒:

// 在 ImageMosaic 中使用 COG 文件
ImageMosaicReader mosaicReader = new ImageMosaicFormat().getReader(mosaicDir);
GridCoverage2D mosaic = mosaicReader.read(null);

与其他 GeoTools 模块集成 ​

GeoTIFF 实现与其他 GeoTools 模块集成,提供完整的地理空间数据处理解决方案。

SVG
100%

Coverage 处理 ​

读取 GeoTIFF 后,您可以使用 Coverage Processing API 进行重投影、重采样和筛选等操作:

// 重投影 coverage
GridCoverage2D coverage = reader.read(null);
CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:3857");
Operations ops = new Operations(null);
GridCoverage2D reprojected = (GridCoverage2D) ops.resample(coverage, targetCRS);

ImageMosaic 集成 ​

GeoTIFF 文件可以用作 ImageMosaic 中的颗粒,允许您创建多个 GeoTIFF 文件的无缝镶嵌:

// 从 GeoTIFF 文件创建 ImageMosaic
ImageMosaicReader mosaicReader = new ImageMosaicFormat().getReader(mosaicDir);
GridCoverage2D mosaic = mosaicReader.read(null);

ImageMosaic 模块通过 CogGranuleAccessProvider 对云优化 GeoTIFF 颗粒提供特殊支持。

结论 ​

GeoTools 中的 GeoTIFF 模块提供对读取和写入 GeoTIFF 格式的地理空间栅格数据的全面支持。它处理坐标参考系统、变换参数、概览、遮罩和其他 GeoTIFF 特定功能,并与 GeoTools 库的其余部分无缝集成。

有关相关主题的其他信息,请参阅: