Format Support
本页概述了 GeoTools 支持的地理空间数据格式以及如何在库中实现格式支持。GeoTools 支持广泛的矢量和栅格格式,专注于标准化的开放规范。
有关特定数据存储的信息,请参阅 Data Stores。
格式支持架构
GeoTools 为格式支持实现了一致的架构,通过特定于格式的实现实现统一的 API,同时适应每种格式的独特特性。
类层次结构
格式支持通过提供不同格式一致接口的类层次结构实现:
矢量数据格式
Shapefile
Shapefile 是 Esri 开发的广泛使用的矢量数据格式。GeoTools 提供对读取和写入 Shapefile 的全面支持。
核心组件
ShapefileDataStore: 提供对 Shapefile 数据访问的主类ShapefileDataStoreFactory: 创建 Shapefile 数据存储ShapefileFeatureSource: 提供对来自 Shapefile 的要素的访问DbaseFileWriter: 将属性写入 DBF 文件
功能和特性
- 支持所有几何类型(Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon)
- 通过 DBF 文件读取和写入属性
- 用于高效查询的可选空间索引(
.qix文件) - 用于国际化文本的可自定义字符编码支持
- 用于提高性能的内存映射选项
- 支持用于坐标参考系统的
.prj文件 - 支持用于索引文件的
.shx文件
限制
- 单个文件的 2GB 文件大小限制
- DBF 格式中的属性名称限制为 10 个字符
- 每个文件单一几何类型
- 有限的数据类型(不支持 UUID、XML、数组等)
GeoPackage 矢量
GeoPackage 是一种开放、基于标准、平台独立、可移植、自描述、紧凑的地理空间信息传输格式。它基于 SQLite,同时支持矢量和栅格数据。
核心组件
GeoPackage: 用于处理 GeoPackage 文件的主类GeoPkgDataStore: 提供对 GeoPackage 要素数据的访问GeoPkgDialect: 用于 GeoPackage SQLite 数据库的 SQL 方言GeoPkgDataStoreFactory: 创建 GeoPackage 数据存储
功能和特性
- 基于 SQLite 的矢量数据存储
- 使用 SQLite 的 R-Tree 实现进行空间索引
- 高级数据类型,包括日期、时间、枚举
- 基于 SQL 的筛选和查询
- 支持 GeoPackage 扩展
- 能够在一个文件中存储矢量和栅格数据
- 用于描述内容的元数据表
GeoPackage 结构
栅格数据格式
GeoTIFF
GeoTIFF 是一种公共领域元数据标准,允许地理参考信息嵌入到 TIFF 文件中。它是 GIS 应用程序中最广泛使用的栅格数据格式。
核心组件
GeoTiffReader: 读取 GeoTIFF 文件GeoTiffWriter: 写入 GeoTIFF 文件GeoTiffFormat: 格式描述和访问GeoTiffMetadata2CRSAdapter: 将 GeoTIFF 元数据转换为 CRS
功能和特性
- 读取和写入地理参考栅格数据
- 支持嵌入的坐标参考系统
- 支持地面控制点(GCP)
- 用于高效渲染的概览(金字塔)支持
- 用于减小文件大小的压缩选项
- 支持各种像素类型和波段
- 透明处理世界文件和投影文件
- 支持 GDAL 元数据标签和 PAM 数据集
读取过程
GeoPackage 栅格
GeoPackage 还通过其基于图块的存储模型支持栅格数据,该模型专为高效访问和 Web 地图而设计。
核心组件
GeoPackageReader: 从 GeoPackage 文件读取栅格数据TileEntry和TileMatrix: 表示图块结构TileReader: 读取单个图块
功能和特性
- 栅格数据的基于图块的存储
- 用于在不同比例尺下高效显示的多个缩放级别(金字塔)
- 紧凑的存储格式
- 与 Web 地图框架的兼容性
- 矢量和栅格数据的统一格式
使用不同格式
读取矢量数据
矢量数据读取在各格式之间遵循一致的模式:
// Shapefile
File file = new File("data.shp");
ShapefileDataStore store = new ShapefileDataStore(file.toURI().toURL());
SimpleFeatureSource source = store.getFeatureSource();
SimpleFeatureCollection features = source.getFeatures();
// GeoPackage
Map<String, Object> params = new HashMap<>();
params.put("dbtype", "geopkg");
params.put("database", "data.gpkg");
DataStore store = DataStoreFinder.getDataStore(params);
String typeName = store.getTypeNames()[0];
SimpleFeatureSource source = store.getFeatureSource(typeName);
SimpleFeatureCollection features = source.getFeatures();读取栅格数据
同样,栅格数据读取遵循一致的模式:
// GeoTIFF
File file = new File("data.tif");
GeoTiffReader reader = new GeoTiffReader(file);
GridCoverage2D coverage = reader.read(null);
// GeoPackage Raster
File file = new File("data.gpkg");
GeoPackageReader reader = new GeoPackageReader(file, null);
String coverageName = reader.getGridCoverageNames()[0];
GridCoverage2D coverage = reader.read(coverageName, null);格式特定参数和选项
Shapefile 参数
| 参数 | 类型 | 描述 |
|---|---|---|
url | URL | .shp 文件的 URL |
namespace | URI | 要素类型的命名空间 URI |
memory mapped buffer | Boolean | 启用/禁用内存映射 |
cache and reuse memory maps | Boolean | 缓存和重用内存映射 |
create spatial index | Boolean | 自动创建空间索引 |
charset | Charset | DBF 文件的字符编码 |
timezone | TimeZone | 日期字段使用的时区 |
enable spatial index | Boolean | 如果可用则使用空间索引 |
GeoPackage 参数
| 参数 | 类型 | 描述 |
|---|---|---|
dbtype | String | 必须是 "geopkg" |
database | File | GeoPackage 文件 |
user | String | 数据库用户 |
passwd | String | 数据库密码 |
namespace | URI | 要素类型的命名空间 URI |
Batch insert size | Integer | 单批次中要插入的要素数量 |
GeoTIFF 参数
| 参数 | 类型 | 描述 |
|---|---|---|
INPUT_TRANSPARENT_COLOR | Color | 要设置为透明的颜色 |
SUGGESTED_TILE_SIZE | String | 建议的图块大小 |
WRITE_TIFF_TAGS | Boolean | 是否写入 GeoTIFF 标签 |
SOURCE_URL | URL | GeoTIFF 的源 URL |
COMPRESSION | String | 压缩类型(例如,"LZW") |
COMPRESSION_QUALITY | Float | 压缩质量级别 |
各种格式中的日期/时间处理
每种格式都有自己的处理日期和时间值的方法:
Shapefile
- 使用固定宽度的 DBF 格式
- 日期以 YY-MM-DD 格式存储
- 没有对时间或时间戳的本机支持
- 通过
timezone参数进行时区处理
// 为 Shapefile 配置时区
ShapefileDataStoreFactory factory = new ShapefileDataStoreFactory();
Map<String, Serializable> params = new HashMap<>();
params.put("url", file.toURI().toURL());
params.put("timezone", TimeZone.getTimeZone("UTC"));
DataStore dataStore = factory.createDataStore(params);GeoPackage
- 使用 SQLite 日期/时间类型
- 遵循 ISO-8601 格式:
YYYY-MM-DDTHH:MM:SS.SSSZ - 完全支持日期、时间和时间戳
- 时区处理内置在 ISO 格式中
// GeoPackage 中的日期格式化
static final String DATE_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";格式支持扩展
GeoTools 格式支持架构设计为可扩展的。要添加对新格式的支持:
矢量格式扩展
- 实现
DataStoreFactorySpi用于格式发现 - 扩展
ContentDataStore用于特定于格式的数据存储实现 - 实现适当的
FeatureSource和FeatureReader接口
栅格格式扩展
- 扩展
AbstractGridFormat用于格式描述和能力 - 扩展
AbstractGridCoverage2DReader用于读取栅格数据 - (可选)扩展
AbstractGridCoverageWriter用于写入栅格数据