前言
❝
GeoTools 作为一个开源的 Java GIS 工具包,提供了处理地理空间数据的能力。其数据模型是构建整个库的基础,要素模型、几何模型、坐标系和参考系统模型更是其核心组成部分。
1. 要素模型
来自OGC文件:99-105r2_The_OpenGIS_Abstract_Specification_Topic_5_Features_Version_4.pdf
的描述规范。使用百度翻译如下:
地理信息量是其特征。特征对象(在软件中)对应于现实世界或抽象实体。此特征对象的属性(包含在其中或与之关联)描述了关于此实体的可测量或可描述现象。 与数据结构描述不同,特征对象实例的语义和有效使用或分析来自相应的现实世界实体的含义。OpenGIS™抽象规范从从头开始构建。使用参考系的概念,属性基元(如地理注册的几何体)与现实世界相关联。然后,特征对象以受控的方式用属性进行装饰。
在OGC的文件中有一个九层模型用于描述现实世界到软件世界的映射关系。其中前五层,是从现实世界到项目世界,处理现实世界事实的抽象,而不是在软件中建模。最后四层,从OpenGIS点到OpenGIS特征集,处理数学以及世界的符号模型,并打算在软件中建模。即便如此,这个最后四层的基本模型假设它们是真实世界的对象,并且没有为它们的实现给出任何规范,无论多么抽象。最后一层是OpenGIS特征集语言中指定的现实抽象。
简单理解就是在GIS中,使用Feature 表示要素对象,该要素与现实世界相关联,对应一个地理实体对象。并且在Feature对象中,包含几何和属性信息。使用
FeatureType
定义地理要素的属性和结构,相当于关系数据库中的表字段设计。如下是一个地类属性简单示意图。
2. 几何模型
在GeoTools中,几何模型抽象描述为Geometry ,同样遵循 OGC 简单要素规范 (Simple Feature Access)。具体实现为Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon、GeometryCollection
GeoTools 使用 JTS 作为其几何计算引擎,这些几何类型实现了 JTS Topology Suite (JTS) 的接口。
3. 坐标系和参考系统模型
CoordinateReferenceSystem (CRS)为坐标参考系统接口。包括地理坐标系(GeographicCRS)和投影坐标系(ProjectedCRS)在GeoTools中使用EPSG代码定义CRS(如"EPSG:4326")。
less
// 指定坐标系统
dataStore.createSchema(featureCollection.getSchema()); // 应用定义好的Schema
dataStore.forceSchemaCRS(CRS.decode("EPSG:4326")); // 明确CRS
也可以通过SimpleFeatureTypeBuilder
方法setCRS
定义坐标参考,此处使用默认坐标参考系统DefaultGeographicCRS.WGS84
。
scss
// 要素构建起
SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
builder.setName(schema);
builder.setCRS(DefaultGeographicCRS.WGS84); // 坐标系统
4. 数据存储模型
数据存储模型抽象为DataStore 接口,该接口提供数据源的连接能力。支持连接Shapefile, PostGIS, WFS
等子类数据源并提供空间读写能力。下方示例代码为连接PostGIS空间数据库
vbnet
// 连接 PostGIS 空间数据库
Map<String, Object> pgParams = new HashMap<>();
pgParams.put(PostgisNGDataStoreFactory.DBTYPE.key, "postgis");
pgParams.put(PostgisNGDataStoreFactory.HOST.key, "localhost");
pgParams.put(PostgisNGDataStoreFactory.PORT.key, "5432");
pgParams.put(PostgisNGDataStoreFactory.DATABASE.key, "geodata");
pgParams.put(PostgisNGDataStoreFactory.USER.key, "postgres");
pgParams.put(PostgisNGDataStoreFactory.PASSWD.key, "123456");
pgParams.put(PostgisNGDataStoreFactory.SCHEMA.key, "public"); // 明确指定schema
pgParams.put(PostgisNGDataStoreFactory.EXPOSE_PK.key, true); // 暴露主键
DataStore pgDataStore = DataStoreFinder.getDataStore(pgParams);
对于数据存储模型对象,提供了FeatureSource 方法用来访问存储数据,以及使用继承自FeatureSource 的FeatureStore实现读写访问。
ini
// 获取要素源
SimpleFeatureSource featureSource = dataStore.getFeatureSource(typeName);
// 获取要素集合
SimpleFeatureCollection featureCollection = featureSource.getFeatures();
5. 样式模型
Style对象定义了如何渲染要素,Symbolizer对象指定符号化的方式。其中Symbolizer包括点符号化、线符号化、面符号化等方式(PointSymbolizer, LineSymbolizer, PolygonSymbolizer),并且遵循SLD (Styled Layer Descriptor) 规范
6. 要素过滤模型
在GeoTools中使用过滤器和表达式 (Filter & Expression)可以方便实现属性和空间查询。Filter过滤器用于查询和选择要素,包括空间和非空间过滤器;Expression用于计算属性值。
使用CQL创建属性过滤器
ini
// 创建数据过滤器
Filter filter = CQL.toFilter("admin = 'China'");
// 属性查询
SimpleFeatureCollection collection = featureSource.getFeatures(filter);
使用FilterFactory
创建空间过滤器
dart
// 创建数据过滤器
FilterFactory factory = CommonFactoryFinder.getFilterFactory(null);
// 获取几何属性字段名称
String geometryPropertyName = featureSource.getSchema().getGeometryDescriptor().getLocalName();
// 空间过滤器
Filter filter = null;
switch (queryType.toLowerCase()) {
// 相交
case "intersects":
filter = factory.intersects(factory.property(geometryPropertyName),factory.literal(geometry));
break;
// 包含
case "contains":
filter = factory.contains(factory.property(geometryPropertyName),factory.literal(geometry));
break;
// 相离
case "disjoint":
filter = factory.disjoint(factory.property(geometryPropertyName),factory.literal(geometry));
break;
}
// 空间查询
SimpleFeatureCollection collection = featureSource.getFeatures(filter);