GeoTools 数据模型

前言

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);
相关推荐
IT_陈寒3 小时前
SpringBoot这个自动配置坑我跳了三次
前端·人工智能·后端
kyriewen3 小时前
我用 AI 一周写完了整个项目,上线第一天就崩了——这是我踩过最贵的 5 个坑
前端·javascript·ai编程
牧艺4 小时前
从零到协同:构建类飞书在线文档系统的五个技术重难点
前端·人工智能
红尘散仙4 小时前
想写一个像样的终端 App?试试把 React 的开发体验搬进 Rust TUI
前端·rust
袋鼠云数栈UED团队5 小时前
一套 Spec-First 的 AI 编程工作流
前端·人工智能
袋鼠云数栈前端5 小时前
一套 Spec-First 的 AI 编程工作流
前端·ai+
angerdream5 小时前
Android手把手编写儿童手机远程监控App之vue3 路由守卫
前端
不服老的小黑哥5 小时前
AI规范驱动编程-harness工程项目实战
前端
vivo互联网技术5 小时前
从 Web 到桌面:基于 Tauri 2.0 + Vue 3 打造 vivo 线下门店「大头贴」拍照体验系统
前端·rust
光影少年5 小时前
React 合成事件机制、和原生事件区别、事件冒泡阻止
前端·react.js·掘金·金石计划