概述
GeoTools 是一个庞大且功能丰富的开源 Java GIS 工具包,本文就Geotools中的核心类做一个介绍。
简介
GeoTools 是一款开源的 Java GIS 工具库,专为地理空间数据的处理、分析和可视化而设计。它遵循 OGC(开放地理空间联盟)标准,提供了一套完整的 API,广泛应用于桌面 GIS、Web 地图服务及空间分析系统。
GeoTools 采用分层架构,核心模块包括:
数据访问(gt-data):支持多种矢量/栅格格式(如 Shapefile、GeoJSON、PostGIS、GeoTIFF)和数据库(PostGIS、Oracle)的读写,通过 DataStore 接口统一管理数据源。
几何处理(gt-jts):基于
JTS Topology Suite库实现空间计算(如缓冲区、叠加分析),核心类包括 Geometry(点/线/面)和GeometryFactory(几何对象工厂)。地图渲染(gt-render):通过
MapContent管理图层(Layer),结合SLD(样式描述语言)和StreamingRenderer实现高效地图输出,支持抗锯齿优化。坐标参考系统(gt-referencing):提供 CRS 工具类解码坐标系(如 EPSG:4326),MathTransform 实现坐标转换

-
Feature (要素): 地理空间数据的基本单位。代表现实世界中的一个“对象”,例如一条道路、一座建筑或一口井。
-
几何属性 (Geometry): 描述要素的空间位置和形状(点、线、面等),通常使用 JTS Topology Suite (JTS) 库的
com.vividsolutions.jts.geom.Geometry(或较新 GeoTools 版本中的org.locationtech.jts.geom.Geometry) 及其子类(Point,LineString,Polygon等)。 - 属性 (Attributes): 描述要素的非空间信息(名称、类型、长度等)。可以是各种基本类型(String, Integer, Double, Date 等)。
-
几何属性 (Geometry): 描述要素的空间位置和形状(点、线、面等),通常使用 JTS Topology Suite (JTS) 库的
-
FeatureType (要素类型): 定义一类要素的结构(Schema)。它指定:
- 该类型包含哪些属性(名称、类型)。
- 哪个属性是几何属性(默认几何)。
- 坐标系 (CRS)。
- 要素类型的名称。例如
River,City,Building。
-
FeatureCollection (要素集合): 包含多个相同
FeatureType的Feature对象的集合。是进行空间分析、渲染和操作的主要数据容器。 -
DataStore (数据存储): 提供访问地理空间数据源(Shapefile, PostGIS, GeoPackage, WFS 等)的统一接口。负责读取和写入
Feature和FeatureCollection。 - Style (样式): 定义如何渲染要素(颜色、线宽、符号、标签等),通常使用 SLD (Styled Layer Descriptor) 标准。
核心类详细说明
一、数据访问 (gt-main, gt-data, gt-jdbc, gt-ogr, gt-wfs, gt-geopkg 等)
-
DataStore(接口 -org.geotools.api.data.DataStore)- 作用: 核心入口点。代表一个地理空间数据源。提供连接、查询、读取和写入(如果支持)要素数据的方法。
-
关键方法:
-
getTypeNames(): 获取此DataStore中可用的要素类型名称列表。 -
getSchema(String typeName): 获取指定要素类型名称对应的FeatureType。 -
getFeatureSource(String typeName): 获取一个FeatureSource用于读取指定类型的要素。 -
getFeatureStore(String typeName): (如果数据源支持写入) 获取一个FeatureStore(扩展自FeatureSource) 用于读取和写入指定类型的要素。 -
createSchema(SimpleFeatureType featureType): 在数据源中创建新的要素类型结构。 -
dispose(): 关闭并释放DataStore占用的资源。
-
-
实现类 (部分示例):
-
ShapefileDataStore: 读写 ESRI Shapefile。 -
PostGISDataStore: 读写 PostgreSQL/PostGIS 数据库。 -
PropertyDataStore: 读写属性文件目录结构。 -
JDBCDataStore: 抽象基类,用于各种基于 JDBC 的数据库 (如 Oracle Spatial, SQL Server)。 -
GeoPackageDataStore: 读写 OGC GeoPackage 文件。 -
WFSDataStore: 访问 OGC Web Feature Service (WFS)。 -
OGRDataStore: (通过 GDAL/OGR) 访问众多矢量格式 (需安装本地库)。
-
-
DataStoreFinder(类 -org.geotools.data.DataStoreFinder)-
作用: 工厂类。用于查找和创建连接到特定数据源所需的
DataStore实例。 -
关键方法:
-
getAvailableDataStores(): 获取当前类路径下所有可用的DataStoreFactorySpi列表。 -
getDataStore(Map<String, ?> params): 使用一组连接参数 (如"url","dbtype","host","port","database","schema","user","passwd") 查找并实例化合适的DataStore。
-
-
使用示例:
Map<String, Object> params = new HashMap<>(); params.put("dbtype", "postgis"); params.put("host", "localhost"); params.put("port", 5432); params.put("database", "mydb"); params.put("schema", "public"); params.put("user", "postgres"); params.put("passwd", "secret"); DataStore pgDatastore = DataStoreFinder.getDataStore(params);
-
作用: 工厂类。用于查找和创建连接到特定数据源所需的
-
FeatureSource(接口 -org.geotools.api.data.FeatureSource)-
作用: 提供对特定要素类型 (
FeatureType) 的只读访问。是查询和获取要素集合的主要接口。 -
关键方法:
-
getSchema(): 返回此源管理的要素的FeatureType。 -
getFeatures(): 获取该类型的所有要素 (FeatureCollection)。 -
getFeatures(Query query): 根据指定的Query对象获取满足条件的要素子集 (FeatureCollection)。 -
getFeatures(Filter filter): (便捷方法) 根据Filter获取满足条件的要素子集 (FeatureCollection),相当于getFeatures(new Query(getSchema().getTypeName(), filter))。 -
getBounds(),getCount(): 获取要素的空间范围或数量(可能近似)。
-
-
实现类: 通常由具体的
DataStore实现返回其内部类。
-
作用: 提供对特定要素类型 (
-
FeatureStore(接口 -org.geotools.api.data.FeatureStore- 继承自FeatureSource)-
作用: 扩展
FeatureSource,提供对特定要素类型 (FeatureType) 的读写访问。允许添加、修改和删除要素。 -
关键方法 (在
FeatureSource基础上增加):-
addFeatures(FeatureCollection collection): 添加新的要素集合。 -
modifyFeatures(String attributeName, Object attributeValue, Filter filter): 修改满足Filter条件的要素的指定属性值。 -
modifyFeatures(String[] attributeNames, Object[] attributeValues, Filter filter): 修改满足Filter条件的要素的多个属性值。 -
removeFeatures(Filter filter): 删除满足Filter条件的要素。 -
setTransaction(Transaction transaction): 设置事务(用于支持事务的数据源)。
-
-
实现类: 通常由支持写入的
DataStore实现返回其内部类。
-
作用: 扩展
-
FeatureCollection(接口 -org.geotools.api.data.FeatureCollection)-
作用: 代表从
FeatureSource查询返回的一组要素 (Feature)。是进行迭代、渲染、空间分析等操作的主要数据容器。它通常是惰性加载的,意味着要素在需要时才从数据源读取。 -
关键方法:
-
features(): 返回一个FeatureIterator用于遍历集合中的要素。非常重要! 使用后必须调用iterator.close()或使用 try-with-resources 释放底层资源。 -
getSchema(): 返回集合中要素的FeatureType。 -
size(),bounds(): (谨慎使用) 获取要素数量或范围,对于大型数据集可能昂贵或不精确。 -
accepts(FeatureVisitor visitor, ProgressListener progress): 应用FeatureVisitor访问集合中的每个要素。
-
-
常用实现类:
-
DefaultFeatureCollection: 内存中的实现,用于临时存储或组装要素集合。要素完全加载到内存。 -
DataStoreFeatureCollection: 由FeatureSource.getFeatures(...)返回的基于数据源的实现,通常是惰性加载的。
-
-
使用示例 (遍历):
try (FeatureIterator<Feature> features = featureCollection.features()) { while (features.hasNext()) { Feature feature = features.next(); Geometry geom = (Geometry) feature.getDefaultGeometryProperty().getValue(); String name = (String) feature.getProperty("name").getValue(); // ... 处理要素 ... } } // 自动关闭 FeatureIterator
-
作用: 代表从
-
SimpleFeatureType(类 -org.geotools.feature.simple.SimpleFeatureTypeImpl/ 接口org.geotools.api.feature.simple.SimpleFeatureType)-
作用:
FeatureType的具体实现。定义简单要素的结构(Schema)。它指定:- 要素类型名称。
- 属性列表 (
AttributeDescriptor),包括:- 属性名称 (
Name) - 属性类型 (
Class<?>或AttributeType) - 约束 (如可为空?)
- 属性名称 (
- 哪个属性是默认几何属性 (
GeometryDescriptor- 扩展自AttributeDescriptor)。GeometryDescriptor还包含坐标参考系统 (CoordinateReferenceSystem)。
-
创建方式: 通常使用
SimpleFeatureTypeBuilder来构建。 -
关键方法:
-
getName(),getTypeName(): 获取类型名称。 -
getAttributeCount(): 获取属性数量。 -
getDescriptor(int index),getDescriptor(String name): 按索引或名称获取属性描述符。 -
getGeometryDescriptor(): 获取默认几何属性描述符。 -
getCoordinateReferenceSystem(): 获取默认几何的 CRS (通常委托给getGeometryDescriptor().getCoordinateReferenceSystem())。 -
isInline(): (较少常用) 指示类型定义是否内联在数据源中。
-
-
作用:
-
SimpleFeature(接口 -org.geotools.api.feature.simple.SimpleFeature)-
作用:
Feature的具体实现。代表一个符合特定SimpleFeatureType的要素实例。包含实际的几何对象和属性值。 -
关键方法:
-
getType(): 获取此要素对应的SimpleFeatureType。 -
getAttribute(int index),getAttribute(String name): 按索引或名称获取属性值。 -
setAttribute(int index, Object value),setAttribute(String name, Object value): 设置属性值 (如果要素是可变的)。 -
getDefaultGeometry(): 获取默认几何属性值 (通常是Geometry对象)。 -
setDefaultGeometry(Object geometry): 设置默认几何属性值。 -
getID(): 获取要素的唯一标识符 (FID)。 -
getProperties(): 获取所有属性 (Property) 的集合。
-
-
创建方式: 通常使用
SimpleFeatureBuilder来构建。
-
作用:
-
SimpleFeatureBuilder(类 -org.geotools.feature.simple.SimpleFeatureBuilder)-
作用: 用于根据
SimpleFeatureType高效地构建SimpleFeature实例。 -
使用示例:
SimpleFeatureTypeBuilder typeBuilder = new SimpleFeatureTypeBuilder(); typeBuilder.setName("MyFeatureType"); typeBuilder.setCRS(DefaultGeographicCRS.WGS84); // 设置坐标系 typeBuilder.add("geom", Point.class); // 几何属性 typeBuilder.add("name", String.class); // 普通属性 typeBuilder.add("population", Integer.class); SimpleFeatureType featureType = typeBuilder.buildFeatureType(); SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(featureType); GeometryFactory geomFactory = JTSFactoryFinder.getGeometryFactory(); Point point = geomFactory.createPoint(new Coordinate(10, 40)); featureBuilder.add(point); // 对应 geom featureBuilder.add("Metropolis"); // 对应 name featureBuilder.add(1000000); // 对应 population SimpleFeature feature = featureBuilder.buildFeature("fid.1"); // 指定 FID
-
作用: 用于根据
二、几何对象 (gt-jts)
GeoTools 深度依赖 JTS Topology Suite (JTS) 库来处理几何对象。核心接口和类主要来自 JTS:
-
Geometry(接口 -org.locationtech.jts.geom.Geometry)- 作用: 所有几何对象(点、线、面、集合等)的根接口。定义了所有几何类型共有的空间操作和关系判断方法。
-
关键方法 (众多):
-
getEnvelope()/getEnvelopeInternal(): 获取几何的边界框 (Envelope)。 -
getCentroid(): 获取质心。 -
getArea(),getLength(): 计算面积或长度。 -
contains(Geometry g),intersects(Geometry g),touches(Geometry g),crosses(Geometry g),within(Geometry g),overlaps(Geometry g),equals(Geometry g): 空间关系谓词 (非常重要!)。 -
distance(Geometry g): 计算两个几何之间的最短距离。 -
buffer(double distance): 创建缓冲区。 -
union(Geometry g),intersection(Geometry g),difference(Geometry g),symDifference(Geometry g): 空间集合操作。 -
transform(MathTransform transform): (GeoTools 扩展) 在已知MathTransform的情况下进行坐标转换。 -
getCoordinate(),getCoordinates(): 获取坐标点。 -
getGeometryType(): 获取几何类型名称 (如 "Point", "LineString", "Polygon")。 -
getNumGeometries(),getGeometryN(int n): 处理几何集合 (GeometryCollection,MultiPoint,MultiLineString,MultiPolygon)。
-
-
重要子接口/类:
-
Point: 点。 -
LineString: 线串。 -
LinearRing: 闭合的线串 (用于构建面)。 -
Polygon: 多边形 (由外环和可选的内环/孔洞组成)。 -
MultiPoint,MultiLineString,MultiPolygon,GeometryCollection: 几何集合。
-
-
GeometryFactory(类 -org.locationtech.jts.geom.GeometryFactory)-
作用: 工厂类。用于创建各种类型的
Geometry对象。允许指定坐标序列工厂和 SRID。 -
关键方法:
createPoint(Coordinate coordinate)-
createLineString(Coordinate[] coordinates)/createLineString(CoordinateSequence coordinates) -
createLinearRing(Coordinate[] coordinates)/createLinearRing(CoordinateSequence coordinates) createPolygon(LinearRing shell, LinearRing[] holes)-
createMultiPoint(Point[] points)/createMultiPoint(Coordinate[] coordinates)/createMultiPoint(CoordinateSequence coordinates) createMultiLineString(LineString[] lineStrings)createMultiPolygon(Polygon[] polygons)createGeometryCollection(Geometry[] geometries)-
toGeometry(Envelope envelope): 将边界框转换为面。
-
最佳实践: 尽量重用同一个
GeometryFactory实例(例如JTSFactoryFinder.getGeometryFactory())以提高性能。
-
作用: 工厂类。用于创建各种类型的
-
Coordinate(类 -org.locationtech.jts.geom.Coordinate)- 作用: 表示一个具有 X, Y 坐标的点。可选地可以包含 Z (高程) 和 M (测量值) 维度。
-
关键字段:
public double x;,public double y;,public double z;(默认为Double.NaN),public double m;(默认为Double.NaN)。
-
CoordinateSequence(接口 -org.locationtech.jts.geom.CoordinateSequence) 及其实现 (如CoordinateArraySequence,PackedCoordinateSequence)-
作用: 高效存储和管理大量坐标点序列。
Geometry内部使用CoordinateSequence来存储其坐标。不同的实现有不同内存和性能特点。
-
作用: 高效存储和管理大量坐标点序列。
三、地图渲染 (gt-render)
-
Style(接口 -org.geotools.api.style.Style)-
作用: SLD 文档的根对象。定义地图的整体样式,包含一个或多个
FeatureTypeStyle规则和背景设置。 -
关键方法:
featureTypeStyles(): 获取定义如何渲染要素类型的规则列表。
-
作用: SLD 文档的根对象。定义地图的整体样式,包含一个或多个
-
FeatureTypeStyle(接口 -org.geotools.api.style.FeatureTypeStyle)-
作用: 包含一组
Rule,这些规则定义了特定要素类型(或一组要素类型)的渲染规则。一个Style可以包含多个FeatureTypeStyle(例如,为同一要素类型设置不同缩放级别的样式或叠加效果)。 -
关键方法:
rules(): 获取渲染规则列表。
-
作用: 包含一组
-
Rule(接口 -org.geotools.api.style.Rule)-
作用: 定义在特定条件(
Filter)和比例尺范围(MinScaleDenominator,MaxScaleDenominator) 下如何渲染要素。包含一个或多个Symbolizer。 -
关键方法:
-
getFilter(): 获取应用此规则的条件过滤器。 -
getMinScaleDenominator(),getMaxScaleDenominator(): 获取规则生效的比例尺范围。 -
symbolizers(): 获取定义实际绘制符号的Symbolizer列表。
-
-
作用: 定义在特定条件(
-
Symbolizer(接口 -org.geotools.api.style.Symbolizer)- 作用: 定义要素几何的视觉表现。抽象基类。具体的符号化器定义如何绘制点、线、面或文本。
-
关键子接口:
-
PointSymbolizer: 定义点要素的符号(图形标记)。 -
LineSymbolizer: 定义线要素的符号(笔划)。 -
PolygonSymbolizer: 定义面要素的符号(填充和笔划)。 -
TextSymbolizer: 定义要素的文本标注。 -
RasterSymbolizer: (较少用于矢量) 定义栅格数据的渲染。
-
-
SLD(类 -org.geotools.styling.SLD)-
作用: 实用工具类。提供在代码中创建基本
Style的便捷方法,以及解析和写入 SLD XML 文件的方法。 -
关键静态方法:
-
createSimpleStyle(FeatureType schema): 为要素类型创建默认的简单样式。 -
createLineStyle(Color color, float width): 创建简单的线样式。 -
createPolygonStyle(Color fillColor, Color strokeColor, float strokeWidth): 创建简单的面样式。 -
createPointStyle(Graphic graphic): 创建点样式。 -
parse(File sldFile),parse(InputStream sldInputStream): 从 XML 文件或流解析 SLD 文档生成Style对象。 -
writeStyle(Style style, OutputStream out): 将Style对象写入 SLD XML 格式到输出流。
-
-
作用: 实用工具类。提供在代码中创建基本
-
MapContent(类 -org.geotools.map.MapContent)-
作用: 地图渲染的容器和上下文。组织要渲染的图层 (
Layer),设置地图范围 (MapViewport),管理渲染器 (StreamingRenderer) 的配置。 -
关键方法:
-
addLayer(Layer layer): 添加一个图层到地图。 -
getViewport(): 获取/设置地图的视口(范围、坐标系、屏幕大小等)。 -
getCoordinateReferenceSystem(): (便捷) 获取视口的坐标系。 -
setTitle(String title): 设置地图标题。 -
dispose(): 清理资源(非常重要!)。
-
-
作用: 地图渲染的容器和上下文。组织要渲染的图层 (
-
Layer(接口 -org.geotools.map.Layer)-
作用: 代表地图中的一个图层。将数据源 (
FeatureSource或GridCoverage) 与渲染样式 (Style) 关联起来。 -
关键实现类:
-
FeatureLayer: 最常用。用于渲染矢量数据 (FeatureSource+Style)。 -
GridReaderLayer: 用于渲染栅格数据 (GridCoverageReader+Style)。 -
WMSLayer: 用于渲染 OGC Web Map Service (WMS) 图层。
-
-
关键方法:
-
getBounds(): 获取图层数据的范围。 -
getStyle(): 获取/设置图层的样式。 -
preDispose(),dispose(): 清理资源。
-
-
作用: 代表地图中的一个图层。将数据源 (
-
StreamingRenderer(类 -org.geotools.renderer.lite.StreamingRenderer)-
作用: 核心渲染器实现。负责将
MapContent中的图层绘制到 Java2D 的Graphics2D对象上(例如,输出到屏幕、BufferedImage或 PDF 文件)。它针对处理大型数据集进行了优化,采用流式处理和智能渲染策略。 -
关键方法:
-
setMapContent(MapContent mapContent): 设置要渲染的地图内容。 -
paint(Graphics2D graphics, Rectangle paintArea, Envelope mapArea): 执行渲染操作。paintArea是输出设备(如图像)上的区域,mapArea是要渲染的地图范围。 -
setRendererHints(Map<Object, Object> hints): 设置渲染提示,控制渲染行为(如缩放级别容差、标签冲突解决策略等)。
-
-
使用模式:
- 创建
MapContent,添加Layer(s)。 - 创建
StreamingRenderer实例。 - 将
MapContent设置给渲染器 (setMapContent)。 - (可选) 设置渲染提示 (
setRendererHints)。 - 创建目标
Graphics2D(例如,从BufferedImage.getGraphics()获得)。 - 调用
paint(graphics, paintArea, mapArea)进行绘制。 - 释放资源 (
mapContent.dispose())。
- 创建
-
作用: 核心渲染器实现。负责将
四、坐标系转换 (gt-referencing)
-
CRS(类 -org.geotools.referencing.CRS)- 作用: 坐标参考系统 (Coordinate Reference System) 的核心工具类。提供查找、解码、编码、转换和比较 CRS 的功能。
-
关键静态方法:
-
decode(String srs): 最常用! 根据字符串(如 "EPSG:4326", "EPSG:3857", "AUTO:42001" 或 WKT 字符串)解码获取CoordinateReferenceSystem对象。 -
lookupIdentifier(CoordinateReferenceSystem crs, boolean force): 尝试查找给定 CRS 的权威代码(如 "EPSG:4326")。 -
findMathTransform(CoordinateReferenceSystem sourceCRS, CoordinateReferenceSystem targetCRS): 查找从源 CRS 到目标 CRS 的坐标转换MathTransform对象。进行坐标转换的入口点。 -
findMathTransform(CoordinateReferenceSystem sourceCRS, CoordinateReferenceSystem targetCRS, boolean lenient): 同上,lenient为true时允许在缺少精确参数时使用近似转换。 -
getAxisOrder(CoordinateReferenceSystem crs): 获取坐标系的轴顺序 (如EASTING_NORTHING(XY),NORTHING_EASTING(YX),NORTH_EAST(经纬度顺序))。 -
isGeographic(CoordinateReferenceSystem crs): 判断是否是地理坐标系(经纬度)。 -
isProjected(CoordinateReferenceSystem crs): 判断是否是投影坐标系(平面坐标)。 -
equalsIgnoreMetadata(CoordinateReferenceSystem crs1, CoordinateReferenceSystem crs2): 比较两个 CRS 在数学定义上是否等价(忽略名称、范围等元数据)。
-
-
CoordinateReferenceSystem(接口 -org.opengis.referencing.crs.CoordinateReferenceSystem)- 作用: 代表一个坐标参考系统。它定义了如何将坐标解释为地球上的位置。这是 OpenGIS 的通用接口。
-
关键子接口:
-
GeographicCRS: 地理坐标系(基于椭球体,使用经纬度表示位置,单位是角度)。 -
ProjectedCRS: 投影坐标系(将地理坐标投影到平面上,单位是长度,如米)。 -
EngineeringCRS: 工程坐标系(局部坐标系)。 -
VerticalCRS: 垂直坐标系(高程)。 -
CompoundCRS: 复合坐标系(如 2D 水平 + 1D 垂直)。
-
-
关键方法:
-
getName(): 获取 CRS 的名称。 -
getCoordinateSystem(): 获取定义坐标轴数量、顺序、单位和方向的CoordinateSystem对象。
-
-
MathTransform(接口 -org.opengis.referencing.operation.MathTransform)-
作用: 定义从一个坐标参考系统到另一个坐标参考系统的数学转换函数。由
CRS.findMathTransform(...)返回。 -
关键方法:
-
transform(DirectPosition ptSrc, DirectPosition ptDst): 转换单个坐标点 (DirectPosition是一个包含坐标值的轻量级对象)。 -
transform(double[] srcPts, int srcOff, double[] dstPts, int dstOff, int numPts): 高效! 批量转换坐标点数组。这是转换Geometry坐标或大量点数据时最常用的方法。 -
inverse(): 获取此转换的逆转换(如果存在)。 -
isIdentity(): 判断是否是恒等转换(不改变坐标值)。
-
-
使用模式:
CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:4326"); // WGS84 (Lat/Lon) CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:3857"); // Web Mercator MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS); // 转换单个点 DirectPosition2D srcPoint = new DirectPosition2D(sourceCRS, 10, 40); // Lon, Lat DirectPosition2D dstPoint = new DirectPosition2D(); transform.transform(srcPoint, dstPoint); // dstPoint now holds Web Mercator X, Y // 转换几何对象 (JTS Geometry) Geometry targetGeometry = JTS.transform(sourceGeometry, transform);
-
作用: 定义从一个坐标参考系统到另一个坐标参考系统的数学转换函数。由
-
ReferencingFactoryFinder(类 -org.geotools.referencing.ReferencingFactoryFinder)-
作用: 工厂查找器。用于获取创建 CRS 相关对象(如
CRSAuthorityFactory,CoordinateOperationFactory)的工厂实例。CRS类内部使用它。 -
关键静态方法:
-
getCRSAuthorityFactory(String authority, Hints hints): 获取用于解码特定权威机构(如 "EPSG")CRS 代码的工厂。 -
getCoordinateOperationFactory(Hints hints): 获取用于创建坐标转换 (CoordinateOperation/MathTransform) 的工厂。
-
- 通常使用
CRS工具类更便捷。
-
作用: 工厂查找器。用于获取创建 CRS 相关对象(如
五、查询与过滤 (gt-main)
-
Filter(接口 -org.geotools.api.filter.Filter)-
作用: 定义查询条件。用于在
FeatureSource.getFeatures(Filter)或FeatureStore的修改/删除方法中选择要素。表示逻辑表达式(如属性等于值、空间关系等)。 -
关键子接口/类:
-
IncludeFilter/ExcludeFilter: 包含或排除所有要素的特殊过滤器。 -
Id: 根据要素 ID (FID) 选择。 -
PropertyIsEqualTo,PropertyIsNotEqualTo,PropertyIsLessThan,PropertyIsLessThanOrEqualTo,PropertyIsGreaterThan,PropertyIsGreaterThanOrEqualTo,PropertyIsBetween,PropertyIsLike,PropertyIsNull,PropertyIsNil: 属性比较过滤器。 -
BBOX: 边界框过滤器(要素的几何与指定矩形范围相交)。 -
Beyond,DWithin: 距离过滤器(要素几何在指定距离之外/之内)。 -
Contains,Crosses,Disjoint,Equals,Intersects,Overlaps,Touches,Within: 空间关系过滤器 (对应 JTSGeometry的方法)。 -
And,Or,Not: 逻辑组合过滤器。
-
-
创建方式: 强烈推荐使用
FilterFactory(FFactory) 来创建过滤器实例,而不是直接实例化具体类。
-
作用: 定义查询条件。用于在
-
FilterFactory(接口 -org.geotools.api.filter.FilterFactory) /FF(工具类 -org.geotools.api.filter.FilterFactory2的实例,通常通过CommonFactoryFinder.getFilterFactory()获取)-
作用: 工厂类。用于创建所有类型的
Filter、Expression和Function对象。这是构建查询条件的标准方式。 -
关键方法 (部分):
-
property(String name): 创建一个引用要素属性值的属性表达式 (PropertyName)。 -
literal(Object value): 创建一个字面量表达式 (Literal)。 -
equal(Expression expr1, Expression expr2): 创建PropertyIsEqualTo过滤器。 -
less(Expression expr1, Expression expr2): 创建PropertyIsLessThan过滤器。 -
greater(Expression expr1, Expression expr2): 创建PropertyIsGreaterThan过滤器。 -
between(Expression expr, Expression lower, Expression upper): 创建PropertyIsBetween过滤器。 -
like(Expression expr, String pattern): 创建PropertyIsLike过滤器。 -
bbox(Expression geometry, double minx, double miny, double maxx, double maxy, String srs): 创建BBOX过滤器。 -
contains(Expression geometry1, Expression geometry2): 创建Contains空间关系过滤器。 -
intersects(Expression geometry1, Expression geometry2): 创建Intersects空间关系过滤器。 -
within(Expression geometry1, Expression geometry2): 创建Within空间关系过滤器。 -
and(Filter filter1, Filter filter2): 创建逻辑与 (And) 过滤器。 -
or(Filter filter1, Filter filter2): 创建逻辑或 (Or) 过滤器。 -
not(Filter filter): 创建逻辑非 (Not) 过滤器。 -
function(String name, Expression... parameters): 创建函数表达式。
-
-
使用示例:
FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(); // 查找名称以 "A" 开头且人口大于 100 万的城市 Filter filter = ff.and( ff.like(ff.property("name"), "A%"), ff.greater(ff.property("population"), ff.literal(1000000)) ); // 查找与特定几何相交的要素 Geometry searchArea = ...; // 一个多边形 Filter spatialFilter = ff.intersects(ff.property("geom"), ff.literal(searchArea));
-
作用: 工厂类。用于创建所有类型的
-
Query(类 -org.geotools.api.data.Query)-
作用: 封装对
FeatureSource的查询请求。包含要查询的类型名、属性选择、过滤条件、排序、分页等。 -
关键属性/方法:
-
typeName: 要素类型名称(通常在FeatureSource.getFeatures(Query)中设置,构造时可选)。 -
propertyNames: 要检索的属性名称数组(String[])。null或空表示所有属性。 -
filter: 应用的Filter条件。 -
sortBy: 排序方式 (SortBy[])。 -
startIndex: 分页起始索引。 -
maxFeatures: 返回的最大要素数量。 -
getHints(): 获取查询提示(控制数据源行为)。 -
Query.ALL: 表示查询所有要素和所有属性的静态常量。
-
-
使用示例:
Query query = new Query("City"); query.setPropertyNames(new String[]{"name", "population", "geom"}); // 只获取这些属性 query.setFilter(myFilter); query.setSortBy(new SortBy[]{SortBy.NATURAL_ORDER}); // 或 new SortBy[]{ff.sort("population", SortOrder.DESCENDING)}) query.setMaxFeatures(100); // 只取前100条 FeatureCollection collection = featureSource.getFeatures(query);
-
作用: 封装对
六、工具类与工厂
-
CommonFactoryFinder(类 -org.geotools.util.factory.CommonFactoryFinder)-
作用: 查找 GeoTools 核心服务接口(
FilterFactory,StyleFactory,DataAccessFactory,FeatureTypeFactory等)的工厂实现。它是 SPI (Service Provider Interface) 机制的入口点。 -
关键静态方法:
-
getFilterFactory(): 获取FilterFactory实例。 -
getStyleFactory(): 获取StyleFactory(用于构建 SLD 对象树) 实例。 -
getDataStoreFactoryRegistry(): 获取DataStoreFactoryRegistry(包含所有注册的DataStoreFactorySpi,DataStoreFinder使用它)。 -
getFeatureTypeFactory(): 获取FeatureTypeFactory(用于构建FeatureType) 实例。
-
-
使用示例:
FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(); StyleFactory sf = CommonFactoryFinder.getStyleFactory();
-
作用: 查找 GeoTools 核心服务接口(
-
Utilities(类 -org.geotools.util.Utilities)- 作用: 提供各种实用工具方法(哈希码计算、相等比较、断言、空值检查、集合操作等)。在 GeoTools 内部广泛使用。
-
关键静态方法:
-
equals(Object object1, Object object2): 安全的空值感知相等比较。 -
deepEquals(Object object1, Object object2): 深度相等比较。 -
hashCode(Object object): 安全的空值感知哈希码计算。 -
hashCode(Object... objects): 计算多个对象的组合哈希码。 -
ensureNonNull(String name, Object object): 检查对象非空,否则抛出NullPointerException。 -
isBlank(String string): 检查字符串是否为null、空或仅包含空白字符。
-
七、总结与建议
-
数据访问是起点: 理解
DataStore,FeatureSource,FeatureStore,FeatureCollection,SimpleFeatureType,SimpleFeature是处理任何数据的基础。 -
几何是核心: 熟练掌握 JTS 的
Geometry,GeometryFactory,Coordinate对进行空间计算和操作至关重要。 -
渲染需要组合: 地图渲染涉及
MapContent,Layer(特别是FeatureLayer),Style(SLD),Symbolizer和StreamingRenderer的协同工作。 -
坐标转换不可少:
CRS.decode(),CRS.findMathTransform(),MathTransform.transform()是处理不同坐标系数据的必备技能。 -
查询靠过滤器和工厂: 使用
FilterFactory(FF) 构建Filter和Query是高效检索数据的标准方式。 -
工厂查找器是桥梁:
CommonFactoryFinder和DataStoreFinder是获取关键工厂和服务的主要途径。 -
资源管理: 记住关闭
FeatureIterator,FeatureCollection(某些实现),DataStore,MapContent等资源 (close()或dispose()) 以避免资源泄漏。 - 查阅 Javadoc 和示例: GeoTools 官方文档 (包括 Javadoc) 和大量在线示例 (GeoTools User Guide, Demo) 是学习具体类和方法用法的宝贵资源。由于 GeoTools 庞大且深度依赖 OGC/ISO 标准,理解这些概念 (如 Simple Features, SLD, Filter Encoding, CRS) 也很有帮助。
理解这些核心类及其相互关系,就掌握了使用 GeoTools 构建强大 Java GIS 应用程序的基础。实际开发中,通常需要组合使用多个模块的这些类来完成复杂任务。