GIS:DataStore数据管理框架

1.架构设计

OGC 规范对空间矢量数据的框架进行了设计,GeoTools 对其进行了实现。其中的 DataStore 可以近似理解成关系数据库中的个数据库实例,FeatureSource 可以近似理解成关系数据库中的一张表。
DataAccess 接口主要对空间要素类型的相关信息的构建、读取、更新、清除等操作进行了设定。DataStore 接口直接继承了 DataAccess 接口,DataAccess 接口主要定义了数据源的基本行为,如新建、更改、删除等,将一整套 SimpleFeature 的数据模型进行了嵌入可以看到所有的数据转换格式已经从上层的泛型具象成了 SimpleFeature以及 SimpleFeatureType。除此以外,DataStore 也指定了空间矢量数据的读写方法以及相关的函数。FeatureSource (可通过DataStore获取)和 SimpleFeatureSource 则是与具体的 SimpleFeatureType 绑定的数据结构,用户可以通过其子类对表,直接进行查询和写入操作。
在这里插入图片描述

public interface DataAccess<T extends FeatureType, F extends Feature> {// 获取数据信息ServiceInfo getInfo();// 新建数据void createSchema(T featureType) throws IOException;// 更新数据字段信息void updateSchema(Name typeName, T featureType) throws IOException;// 删除数据void removeSchema(Name typeName) throws IOException;// 获取数据名称List<Name> getNames() throws IOException;// 获取数据字段信息T getSchema(Name name) throws IOException;// 获取数据源FeatureSource<T, F> getFeatureSource(Name typeName) throws IOException;// 释放数据连接void dispose();}

2.DataStore

DataStore 提供了较为完整的读写功能,熟悉 Java 的同学甚至可以将其理解成一个类似于JDBC 的连接空间数据的驱动程序。
DataStore 是主要用于访问和存储矢量格式的空间数据的引擎。矢量数据的数据格式有很多种。GeoTools 支持如 Shapefile、数据库等的接入其支持的数据源种类有很多种,例如地理信息系统行业常用的 PostGIS、时空数据领域使用到的 GeoMesa、新型的 GeoPackage 等。在支持这些数据源时,GeoTools 提供了统一的 DataStore 访问接口,如代码清单 5-2 所示。用户只需要实现这个接口,就能够针对特定的数据源进行相应的扩展。

public interface DataStore extends DataAccess<SimpleFeatureType, SimpleFeature> {// 更新SimpleFeatureType 结构信息void updateSchema(String typeName, SimpleFeatureType featureType) throws IOException;// 删除SimpleFeatureType void removeSchema(String typeName) throws IOException;// 获取SimpleFeatureType 名称String[] getTypeNames() throws IOException;// 获取SimpleFeatureType 对象SimpleFeatureType getSchema(String typeName) throws IOException;// 获取FeatureSource对象SimpleFeatureSource getFeatureSource(String typeName) throws IOException;// 获取查询结果SimpleFeatureSource getFeatureSource(Name typeName) throws IOException;// 获取查询结果FeatureReader<SimpleFeatureType, SimpleFeature> getFeatureReader(Query query, Transaction transaction) throws IOException;// 获取写入对象FeatureWriter<SimpleFeatureType, SimpleFeature> getFeatureWriter(String typeName, Filter filter, Transaction transaction) throws IOException;}

DataStore 所对应的是比 SimpleFeatureType 更上层的概念,对应关系数据库中的 database 的概念,用户可以利用 DataStore 对多个SimpleFeatureType 进行控制和管理。从上述代码清单中可以看到DataStore 内部规定了 SimpleFeatureType 的更新、删除和获取操作,也实现了针对 SimpleFeatureType 的读写操作。

3. FeatureSource

FeatureSource 与 DataStore 相比,它的操作粒度更细

public interface FeatureSource<T extends FeatureType, F extends Feature> {// 获取SimpleFeatureType 名称Name getName();// 获取SimpleFeatureType 信息ResourceInfo getInfo();// 获取所属DataStore对象DataAccess<T, F> getDataStore();// 获取查询容量QueryCapabilities getQueryCapabilities();void addFeatureListener(FeatureListener listener);void removeFeatureListener(FeatureListener listener);// 获取要素信息FeatureCollection<T, F> getFeatures(Filter filter) throws IOException;FeatureCollection<T, F> getFeatures(Query query) throws IOException;FeatureCollection<T, F> getFeatures() throws IOException;// 获取结构信息 T getSchema();// 获取边界信息   ReferencedEnvelope getBounds() throws IOException;ReferencedEnvelope getBounds(Query query) throws IOException;// 获取数据条数int getCount(Query query) throws IOException;// 获取支持的Hintpublic Set<RenderingHints.Key> getSupportedHints();
}

4. FeatureStore

FeatureStare 是 FeatureSource 的一个子接口,它针对数据本身进行了一些新的设定。

public interface FeatureStore<T extends FeatureType, F extends Feature>extends FeatureSource<T, F> {// 插入数据 List<FeatureId> addFeatures(FeatureCollection<T, F> featureCollection) throws IOException;// 删除数据void removeFeatures(Filter filter) throws IOException;// 更改数据void modifyFeatures(Name[] attributeNames, Object[] attributeValues, Filter filter)throws IOException;void modifyFeatures(AttributeDescriptor[] type, Object[] value, Filter filter)throws IOException;void modifyFeatures(Name attributeName, Object attributeValue, Filter filter)throws IOException;void modifyFeatures(AttributeDescriptor type, Object value, Filter filter) throws IOException;// 流式插入数据 void setFeatures(FeatureReader<T, F> reader) throws IOException;void setTransaction(Transaction transaction);Transaction getTransaction();
}

从代码中可以看出,FeatureStore 对数据操作和事务操作进行了细化。在数据操作方面,增加了插入数据、删除数据、更新数据的相关内容在事务操作方面,用户可以配置事务信息,但是由于 GeoTools 目前并没有将重点放在事务上,因此现在只支持默认 (Default) 和自动提交 (AutoCommit) 两种事务的模式。

5.SimpleFeature

SimpleFeature 在 GeoTools 内部就是具体的数据条目,可类比为关系数据库中的一条记录。早期 OGC 对空间要素 (Geometry Feature) 有过非常详细的设定,但是这样的设定过于复杂,以致行业内产生了简化要素(Simple Feature) 这种设定,这也是 [Simple] 的由来。GeoTools 内部采用 SimpleFeature 作为自己的空间数据结构。

public interface SimpleFeature extends Feature {String getID();// 获取 SimpleFeatureType SimpleFeatureType getType();SimpleFeatureType getFeatureType();// 获取所有属性List<Object> getAttributes();// 设置属性void setAttributes(List<Object> values);void setAttributes(Object[] values);Object getAttribute(String name);void setAttribute(String name, Object value);Object getAttribute(Name name);void setAttribute(Name name, Object value);Object getAttribute(int index) throws IndexOutOfBoundsException;void setAttribute(int index, Object value) throws IndexOutOfBoundsException;// 获取属性个数 int getAttributeCount();// 获取默认空间数据 Object getDefaultGeometry();// 设置默认空间数据void setDefaultGeometry(Object geometry);
}

6. SimpleFeatureType

SimpleFeatureType 是 GeoTools 内部用来对 SimpleFeature 进行数据结构约束的数据结构,它可以类比为关系数据库的表结构。

public interface SimpleFeatureType extends FeatureType {// 获取SimpleFeatureType 名称String getTypeName();// 获取所有属性的描述器 List<AttributeDescriptor> getAttributeDescriptors();// 根据属性名称获取对应的属性描述器AttributeDescriptor getDescriptor(String name);AttributeDescriptor getDescriptor(Name name);AttributeDescriptor getDescriptor(int index) throws IndexOutOfBoundsException;// 获取属性个数  int getAttributeCount();// 获取所有属性的数据类型    List<AttributeType> getTypes();// 根据名称筛选属性类型  AttributeType getType(String name);AttributeType getType(Name name);AttributeType getType(int index) throws IndexOutOfBoundsException;// 获取单个属性的索引 int indexOf(String name);int indexOf(Name name);
}

从代码中,我们可以看出,SimpleFeatureType 内部主要是对自身的属性以及属性的描述器类 Attribute Descriptor 进行管理的配置和获取方法的实现,用户在使用过程中,可以比较方便地获取到相关的信息

7. FeatureCollection

FeatureCollection 是 GeoTools 参考 Java 语言的集合类(Collection)设计的存储 Feature 对象的集合类。为了更好地操作空间数据对象,FeatureCollection 在使用上与 Java 集合类主要有两点不同。第-点是 FeatureCollection 的迭代器 (lterator) 必须在使用完毕后进行显式的关闭操作,才能避免内存泄漏。第二点是存储在同一个FeatureCollection 中的对象具有相同的 SimpleFeatureType。

public interface FeatureCollection<T extends FeatureType, F extends Feature> {// 迭代器,使用完毕必须关闭   FeatureIterator<F> features();// 获取SimpleFeatureType  T getSchema();/** ID used when serializing to GML */String getID();// 数据访问方式   void accepts(FeatureVisitor visitor, ProgressListener progress) throws IOException;// 针对FeatureCollection 查询子集合  public FeatureCollection<T, F> subCollection(Filter filter);public FeatureCollection<T, F> sort(SortBy order);// 获取最小外接矩形ReferencedEnvelope getBounds();// 是否包含指定元素boolean contains(Object o);boolean containsAll(Collection<?> o);// 是否为空boolean isEmpty();
}
public interface SimpleFeatureCollectionextends FeatureCollection<SimpleFeatureType, SimpleFeature> {// 迭代器,使用完毕后必须关闭public SimpleFeatureIterator features();public SimpleFeatureCollection subCollection(Filter filter);public SimpleFeatureCollection sort(SortBy order);
}

值得强调的是,FeatureCollection 并不是将数据全部加载到内存中的传统集合类,由于空间数据通常数据量较大,一味地加载到内存中通常会导致内存超限。因此 GeoTools 在实现 FeatureCollection 时使用流式数据模型,尽量减少内存的使用量,也因此造成 FeatureCollection 的迭代器在使用完毕后必须关闭的问题
由于 Java 泛型类在类型定义上比较几余,在处理由 SimpleFeature 和SimpleFeatureType 构成的 FeatureCollection 时必须不断地定义FeatureCollection<SimpleFeatureType,Simple Feature>,因此GeoTools 设计了 SimpleFeatureCollection 语法糖来帮助用户更好地使用Feature Collection。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/71050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023高教社杯 国赛数学建模C题思路 - 蔬菜类商品的自动定价与补货决策

1 赛题 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c; 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…

OJ练习第164题——具有所有最深节点的最小子树

具有所有最深节点的最小子树 力扣链接&#xff1a;865. 具有所有最深节点的最小子树 力扣链接&#xff1a;1123. 最深叶节点的最近公共祖先 题目描述 给定一个根为 root 的二叉树&#xff0c;每个节点的深度是 该节点到根的最短距离 。 返回包含原始树中所有 最深节点 的…

sqlserver 联表查询、子查询、窗口函数、聚合函数等概念与例子

with cte as的用法 查询的一个有用工具&#xff0c;允许创建临时命名结果集&#xff0c;可在查询中多次引用相同的子查询结果&#xff0c;可以提高查询的可读性和维护性 WITH cte_name (column1, column2, ...) AS (-- 这里是子查询SELECT column1, column2, ...FROM your_ta…

UE5- c++ websocket里实现调用player里的方法

# UGameInstance里直接调用 获取到引用了&#xff0c;就可以自然的调用。忽略 # UGameInstance里间接调用&#xff0c;通过代理调用 前置已经添加了websocket,具体步骤参考&#xff0c;链接在UWebSocketGameInstance.h里新增代理&#xff0c;并在链接成功后进行绑定。 #pragma…

【操作系统】自旋锁实现自旋锁原理(亲测可用)

原理 自旋锁是一种基于忙等待的锁&#xff0c;它在等待锁的过程中不会阻塞线程&#xff0c;而是通过循环不断地检查锁的状态&#xff0c;直到获取到锁为止。自旋锁适用于锁的持有时间很短的情况&#xff0c;因为在等待锁的过程中&#xff0c;线程会一直占用CPU资源&#xff0c…

【AI Agent】Agent的原理介绍与应用发展思考

文章目录 Agent是什么&#xff1f;最直观的公式Agent决策流程 Agent 大爆发人是如何做事的&#xff1f;如何让LLM替代人去做事?来自斯坦福的虚拟小镇架构记忆&#xff08;Memory&#xff09;反思&#xff08;Reflection&#xff09;计划&#xff08;Plan&#xff09; 类 LangC…

第6章 内核模块符号导出实验(iTOP-RK3568开发板驱动开发指南 )

在上一小节中&#xff0c;给大家讲解了驱动模块传参实验&#xff0c;使用insmod命令加载驱动时可以进行参数的传递&#xff0c;但是每一个内核模块之间是相互独立的&#xff0c;那模块间的符号传递要怎样进行呢&#xff0c;让我们带着疑问来进行本章节的学习吧&#xff01; 6.…

uni-app 折叠自定义

uni-app的uni-collapse折叠组件样式修改 下面是修改后的样式 <uni-collapse accordion class"ze" v-model"isCollapse" click"toggleCollapse"><!-- 因为list默认带一条分隔线&#xff0c;所以使用 titleBorder"none" 取消…

反序列化漏洞复现(typecho)

文章目录 执行phpinfogetshell 执行phpinfo 将下面这段代码复制到一个php文件&#xff0c;命名为typecho_1.0-14.10.10_unserialize_phpinfo.php&#xff0c;代码中定义的类名与typecho中的类相同&#xff0c;是它能识别的类&#xff1a; <?php class Typecho_Feed{const…

2023国赛数学建模C题思路分析 - 蔬菜类商品的自动定价与补货决策

# 1 赛题 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c; 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…

day5 qt

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);timer_idthis->startTimer(100);//啓動一個定時器 每100ms發送一次信號ui->Edit1->setPlaceholderTex…

java 面试题汇总整理

java有哪四种引用类型 在Java中&#xff0c;有四种引用类型&#xff0c;用于控制对象的生命周期和垃圾回收行为。这些引用类型包括&#xff1a; 强引用&#xff08;Strong Reference&#xff09;&#xff1a; 强引用是最常见的引用类型&#xff0c;它们是默认的引用类型。当一…

ChatGPT:革命性的自然语言处理技术

自然语言处理&#xff08;NLP&#xff09;技术的快速发展已经为我们的日常生活带来了巨大的变革。在这个领域&#xff0c;ChatGPT作为一个突出的代表&#xff0c;正在为我们带来更多的便利和机会。本文将介绍ChatGPT的基本概念、应用领域以及它在未来可能带来的影响。 ChatGPT…

Python UI自动化 —— 关键字+excel表格数据驱动

步骤&#xff1a; 1. 对selenium进行二次封装&#xff0c;创建关键字的库 2. 准备一个表格文件来写入所有测试用例步骤 3. 对表格内容进行读取&#xff0c;使用映射关系来对用例进行调用执行 4. 执行用例 1. 对selenium进行二次封装&#xff0c;创建关键字的库 from time imp…

【SpingBoot】详细介绍SpringBoot项目中前端请求到数据库再返回前端的完整数据流转,并用代码实现

在SpringBoot项目中&#xff0c;前端请求到最终返回的完整数据流转一般包括以下几个步骤&#xff1a; 前端发送HTTP请求到后端Controller。 Controller接收到请求后&#xff0c;调用相关Service处理业务逻辑。 Service调用DAO层获取数据。 DAO层访问数据库获取数据。 数据库…

【51单片机实验笔记】中断篇(一) 外部中断

目录 前言中断系统概述寄存器说明中断优先级寄存器&#xff08;IP&#xff09;中断允许控制寄存器&#xff08;IE&#xff09;中断请求标志寄存器&#xff08;TCON&#xff09; 外部中断配置软件实现按键事件的外部中断实现 遇到的问题总结 前言 中断是单片机非常重要的概念&a…

2021江苏省赛热身赛 C Magic Rabbit(数形结合)

2021江苏省赛热身赛 C Magic Rabbit(数形结合) Magic Rabbit 非常好且巧妙地一道题。 大意&#xff1a;给出三种溶液 &#xff0c; 三种溶液分别含有不同浓度的 x &#xff0c;y 两种物质。 溶液x (mg/ml)y (mg/ml)溶液1x1y1溶液2x2y2溶液3x3y3 给出 Q 组询问 &#xff0c…

MySQL 8.0.34安装教程

一、下载MySQL 1.官网下载 MySQL官网下载地址&#xff1a; MySQL :: MySQL Downloads &#xff0c;选择下载社区版&#xff08;平时项目开发足够了&#xff09; 2.点击下载MySQL Installer for Windows 3.选择版本8.0.34&#xff0c;并根据自己需求&#xff0c;选择下载全社区安…

flutter报错-cmdline-tools component is missing

安装完androidsdk和android studio后&#xff0c;打开控制台&#xff0c;出现错误 解决办法 找到自己安装android sdk的位置&#xff0c;然后安装上&#xff0c;并将下面的勾选上 再次运行 flutter doctor 不报错&#xff0c;出现以下画面 Doctor summary (to see all det…

WebSocket的那些事(5-Spring中STOMP连接外部消息代理)

目录 一、序言二、开启RabbitMQ外部消息代理三、代码示例1、Maven依赖项2、相关实体3、自定义用户认证拦截器4、Websocket外部消息代理配置5、ChatController6、前端页面chat.html 四、测试示例1、群聊、私聊、后台定时推送测试2、登录RabbitMQ控制台查看队列信息 五、结语 一、…