GeoTIFF Support
GeoTIFF 是一种广泛采用的格式,用于存储地理参考栅格数据,它将地理空间元数据直接嵌入到 TIFF 文件中。本文档记录了 GeoTools 读取和写入 GeoTIFF 文件的实现,可通过 gt-geotiff 模块获得。
架构概述
GeoTools 中的 GeoTIFF 实现建立在 Java ImageIO 库的基础上,用于基本 TIFF 处理,同时添加了对地理空间元数据解释的支持。该模块旨在与更广泛的 GeoTools coverage API 集成。
读取 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();读取过程
读取参数
您可以通过提供参数来控制读取过程:
// 定义要读取的数据子集(降低分辨率)
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();写入过程
写入参数
您可以通过提供参数来控制写入过程:
// 配置压缩
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 文件可以通过多种方式存储坐标参考系统信息:
- 用于常见 CRS 定义的标准 GeoTIFF GeoKeys
- 用于自定义投影的用户定义参数
- 带有嵌入 ESRI WKT 字符串的引文
读取 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 文件。
访问元数据
您可以通过读取器访问 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 文件可能包含内部或外部概览(数据的较低分辨率版本),以便在较小比例尺下更快渲染。
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 文件。
在 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 模块集成,提供完整的地理空间数据处理解决方案。
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 库的其余部分无缝集成。
有关相关主题的其他信息,请参阅:
- GeoPackage Support 用于单个文件中的矢量和栅格数据
- Shapefile Support 用于 Shapefile 格式的矢量数据
- Image Mosaic System 用于将多个栅格文件作为单个 coverage 处理