当前位置: 首页 > java >正文

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 实现坐标转换

image.png

  1. 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 等)。
  2. FeatureType (要素类型): 定义一类要素的结构(Schema)。它指定:
    • 该类型包含哪些属性(名称、类型)。
    • 哪个属性是几何属性(默认几何)。
    • 坐标系 (CRS)。
    • 要素类型的名称。例如 River, City, Building
  3. FeatureCollection (要素集合): 包含多个相同 FeatureTypeFeature 对象的集合。是进行空间分析、渲染和操作的主要数据容器。
  4. DataStore (数据存储): 提供访问地理空间数据源(Shapefile, PostGIS, GeoPackage, WFS 等)的统一接口。负责读取和写入 FeatureFeatureCollection
  5. Style (样式): 定义如何渲染要素(颜色、线宽、符号、标签等),通常使用 SLD (Styled Layer Descriptor) 标准。

核心类详细说明

一、数据访问 (gt-main, gt-data, gt-jdbc, gt-ogr, gt-wfs, gt-geopkg 等)

  1. 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) 访问众多矢量格式 (需安装本地库)。
  2. 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);
      
  3. 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 实现返回其内部类。
  4. 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 实现返回其内部类。
  5. 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
      
  6. 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(): (较少常用) 指示类型定义是否内联在数据源中。
  7. 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 来构建。
  8. 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:

  1. 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: 几何集合。
  2. 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())以提高性能。
  3. 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)。
  4. CoordinateSequence (接口 - org.locationtech.jts.geom.CoordinateSequence) 及其实现 (如 CoordinateArraySequence, PackedCoordinateSequence)

    • 作用: 高效存储和管理大量坐标点序列。Geometry 内部使用 CoordinateSequence 来存储其坐标。不同的实现有不同内存和性能特点。

三、地图渲染 (gt-render)

  1. Style (接口 - org.geotools.api.style.Style)

    • 作用: SLD 文档的根对象。定义地图的整体样式,包含一个或多个 FeatureTypeStyle 规则和背景设置。
    • 关键方法: featureTypeStyles(): 获取定义如何渲染要素类型的规则列表。
  2. FeatureTypeStyle (接口 - org.geotools.api.style.FeatureTypeStyle)

    • 作用: 包含一组 Rule,这些规则定义了特定要素类型(或一组要素类型)的渲染规则。一个 Style 可以包含多个 FeatureTypeStyle(例如,为同一要素类型设置不同缩放级别的样式或叠加效果)。
    • 关键方法: rules(): 获取渲染规则列表。
  3. Rule (接口 - org.geotools.api.style.Rule)

    • 作用: 定义在特定条件(Filter)和比例尺范围(MinScaleDenominator, MaxScaleDenominator) 下如何渲染要素。包含一个或多个 Symbolizer
    • 关键方法:
      • getFilter(): 获取应用此规则的条件过滤器。
      • getMinScaleDenominator(), getMaxScaleDenominator(): 获取规则生效的比例尺范围。
      • symbolizers(): 获取定义实际绘制符号的 Symbolizer 列表。
  4. Symbolizer (接口 - org.geotools.api.style.Symbolizer)

    • 作用: 定义要素几何的视觉表现。抽象基类。具体的符号化器定义如何绘制点、线、面或文本。
    • 关键子接口:
      • PointSymbolizer: 定义点要素的符号(图形标记)。
      • LineSymbolizer: 定义线要素的符号(笔划)。
      • PolygonSymbolizer: 定义面要素的符号(填充和笔划)。
      • TextSymbolizer: 定义要素的文本标注。
      • RasterSymbolizer: (较少用于矢量) 定义栅格数据的渲染。
  5. 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 格式到输出流。
  6. MapContent (类 - org.geotools.map.MapContent)

    • 作用: 地图渲染的容器和上下文。组织要渲染的图层 (Layer),设置地图范围 (MapViewport),管理渲染器 (StreamingRenderer) 的配置。
    • 关键方法:
      • addLayer(Layer layer): 添加一个图层到地图。
      • getViewport(): 获取/设置地图的视口(范围、坐标系、屏幕大小等)。
      • getCoordinateReferenceSystem(): (便捷) 获取视口的坐标系。
      • setTitle(String title): 设置地图标题。
      • dispose(): 清理资源(非常重要!)。
  7. Layer (接口 - org.geotools.map.Layer)

    • 作用: 代表地图中的一个图层。将数据源 (FeatureSourceGridCoverage) 与渲染样式 (Style) 关联起来。
    • 关键实现类:
      • FeatureLayer: 最常用。用于渲染矢量数据 (FeatureSource + Style)。
      • GridReaderLayer: 用于渲染栅格数据 (GridCoverageReader + Style)。
      • WMSLayer: 用于渲染 OGC Web Map Service (WMS) 图层。
    • 关键方法:
      • getBounds(): 获取图层数据的范围。
      • getStyle(): 获取/设置图层的样式。
      • preDispose(), dispose(): 清理资源。
  8. 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): 设置渲染提示,控制渲染行为(如缩放级别容差、标签冲突解决策略等)。
    • 使用模式:
      1. 创建 MapContent,添加 Layer(s)。
      2. 创建 StreamingRenderer 实例。
      3. MapContent 设置给渲染器 (setMapContent)。
      4. (可选) 设置渲染提示 (setRendererHints)。
      5. 创建目标 Graphics2D (例如,从 BufferedImage.getGraphics() 获得)。
      6. 调用 paint(graphics, paintArea, mapArea) 进行绘制。
      7. 释放资源 (mapContent.dispose())。

四、坐标系转换 (gt-referencing)

  1. 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): 同上,lenienttrue 时允许在缺少精确参数时使用近似转换。
      • getAxisOrder(CoordinateReferenceSystem crs): 获取坐标系的轴顺序 (如 EASTING_NORTHING (XY), NORTHING_EASTING (YX), NORTH_EAST (经纬度顺序))。
      • isGeographic(CoordinateReferenceSystem crs): 判断是否是地理坐标系(经纬度)。
      • isProjected(CoordinateReferenceSystem crs): 判断是否是投影坐标系(平面坐标)。
      • equalsIgnoreMetadata(CoordinateReferenceSystem crs1, CoordinateReferenceSystem crs2): 比较两个 CRS 在数学定义上是否等价(忽略名称、范围等元数据)。
  2. CoordinateReferenceSystem (接口 - org.opengis.referencing.crs.CoordinateReferenceSystem)

    • 作用: 代表一个坐标参考系统。它定义了如何将坐标解释为地球上的位置。这是 OpenGIS 的通用接口。
    • 关键子接口:
      • GeographicCRS: 地理坐标系(基于椭球体,使用经纬度表示位置,单位是角度)。
      • ProjectedCRS: 投影坐标系(将地理坐标投影到平面上,单位是长度,如米)。
      • EngineeringCRS: 工程坐标系(局部坐标系)。
      • VerticalCRS: 垂直坐标系(高程)。
      • CompoundCRS: 复合坐标系(如 2D 水平 + 1D 垂直)。
    • 关键方法:
      • getName(): 获取 CRS 的名称。
      • getCoordinateSystem(): 获取定义坐标轴数量、顺序、单位和方向的 CoordinateSystem 对象。
  3. 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);
      
  4. ReferencingFactoryFinder (类 - org.geotools.referencing.ReferencingFactoryFinder)

    • 作用: 工厂查找器。用于获取创建 CRS 相关对象(如 CRSAuthorityFactory, CoordinateOperationFactory)的工厂实例。CRS 类内部使用它。
    • 关键静态方法:
      • getCRSAuthorityFactory(String authority, Hints hints): 获取用于解码特定权威机构(如 “EPSG”)CRS 代码的工厂。
      • getCoordinateOperationFactory(Hints hints): 获取用于创建坐标转换 (CoordinateOperation/MathTransform) 的工厂。
    • 通常使用 CRS 工具类更便捷。

五、查询与过滤 (gt-main)

  1. 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: 空间关系过滤器 (对应 JTS Geometry 的方法)。
      • And, Or, Not: 逻辑组合过滤器
    • 创建方式: 强烈推荐使用 FilterFactory (FFactory) 来创建过滤器实例,而不是直接实例化具体类。
  2. FilterFactory (接口 - org.geotools.api.filter.FilterFactory) / FF (工具类 - org.geotools.api.filter.FilterFactory2 的实例,通常通过 CommonFactoryFinder.getFilterFactory() 获取)

    • 作用: 工厂类。用于创建所有类型的 FilterExpressionFunction 对象。这是构建查询条件的标准方式。
    • 关键方法 (部分):
      • 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));
      
  3. 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);
      

六、工具类与工厂

  1. CommonFactoryFinder (类 - org.geotools.util.factory.CommonFactoryFinder)

    • 作用: 查找 GeoTools 核心服务接口(FilterFactory, StyleFactory, DataAccessFactory, FeatureTypeFactory 等)的工厂实现。它是 SPI (Service Provider Interface) 机制的入口点。
    • 关键静态方法:
      • getFilterFactory(): 获取 FilterFactory 实例。
      • getStyleFactory(): 获取 StyleFactory (用于构建 SLD 对象树) 实例。
      • getDataStoreFactoryRegistry(): 获取 DataStoreFactoryRegistry (包含所有注册的 DataStoreFactorySpiDataStoreFinder 使用它)。
      • getFeatureTypeFactory(): 获取 FeatureTypeFactory (用于构建 FeatureType) 实例。
    • 使用示例:
      FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();
      StyleFactory sf = CommonFactoryFinder.getStyleFactory();
      
  2. 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、空或仅包含空白字符。

七、总结与建议

  1. 数据访问是起点: 理解 DataStore, FeatureSource, FeatureStore, FeatureCollection, SimpleFeatureType, SimpleFeature 是处理任何数据的基础。
  2. 几何是核心: 熟练掌握 JTS 的 Geometry, GeometryFactory, Coordinate 对进行空间计算和操作至关重要。
  3. 渲染需要组合: 地图渲染涉及 MapContent, Layer (特别是 FeatureLayer), Style (SLD), SymbolizerStreamingRenderer 的协同工作。
  4. 坐标转换不可少: CRS.decode(), CRS.findMathTransform(), MathTransform.transform() 是处理不同坐标系数据的必备技能。
  5. 查询靠过滤器和工厂: 使用 FilterFactory (FF) 构建 FilterQuery 是高效检索数据的标准方式。
  6. 工厂查找器是桥梁: CommonFactoryFinderDataStoreFinder 是获取关键工厂和服务的主要途径。
  7. 资源管理: 记住关闭 FeatureIterator, FeatureCollection (某些实现), DataStore, MapContent 等资源 (close()dispose()) 以避免资源泄漏。
  8. 查阅 Javadoc 和示例: GeoTools 官方文档 (包括 Javadoc) 和大量在线示例 (GeoTools User Guide, Demo) 是学习具体类和方法用法的宝贵资源。由于 GeoTools 庞大且深度依赖 OGC/ISO 标准,理解这些概念 (如 Simple Features, SLD, Filter Encoding, CRS) 也很有帮助。

理解这些核心类及其相互关系,就掌握了使用 GeoTools 构建强大 Java GIS 应用程序的基础。实际开发中,通常需要组合使用多个模块的这些类来完成复杂任务。

http://www.xdnf.cn/news/17422.html

相关文章:

  • 企业级web应用服务器TOMCAT入门详解
  • M8-11读卡器如何通过RS485转Profinet网关在plc写入从站地址
  • 大玄古籍制作软件【详细教程20:txt文档config自动化配置】,排版软件,自动排版,排版设计,个人出书,一键排版
  • 解决本地连接服务器ollama的错误
  • 力扣(删除有序数组中的重复项I/II)
  • 小米开源大模型 MiDashengLM-7B:不仅是“听懂”,更能“理解”声音
  • 【数据结构初阶】--文件归并排序
  • Idea配置——build system的选项区别
  • $QAXHoneypot是什么文件夹
  • 系统集成项目管理工程师【第十一章 规划过程组】规划成本管理、成本估算、制定预算和规划质量管理篇
  • [Shell编程] Shell 循环结构入门
  • 2025.08.08 反转链表
  • Autosar AP中Promise和Future的异步消息通信的详细解析
  • 【设计模式】建造者模式
  • 从伪造的验证码到远程攻击工具 (RAT):2025 年网络欺骗威胁趋势
  • Dart关键字完全指南:从基础到高级用法详解
  • C++归并排序
  • 人工智能之数学基础:事件独立性
  • 登上Nature子刊,深度学习正逐渐接管基础模型
  • Docker 安装 Redis
  • 【vue】Vue 重要基础知识清单
  • Vue3生命周期
  • wordpress的wp-config.php文件的详解
  • 三方相机问题分析七:【datespace导致GPU异常】三方黑块和花图问题
  • 专利服务系统平台|个人专利服务系统|基于java和小程序的专利服务系统设计与实现(源码+数据库+文档)
  • win11中Qt5.14.0+msvc2019+opencv4.9配置
  • Linux中的内核同步源码相关总结
  • GPT-5 is here
  • BUG调试案例十七:ENC424J600以太网掉线问题案例
  • Python实现点云PCA配准——粗配准