Geotools核心类详解
概述
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 应用程序的基础。实际开发中,通常需要组合使用多个模块的这些类来完成复杂任务。