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;每个节点的深度是 该节点到根的最短距离 。 返回包含原始树中所有 最深节点 的…

【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…

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…

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

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

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控制台查看队列信息 五、结语 一、…

超图嵌入论文阅读2:超图神经网络

超图嵌入论文阅读2&#xff1a;超图神经网络 原文&#xff1a;Hypergraph Neural Networks ——AAAI2019&#xff08;CCF-A&#xff09; 源码&#xff1a;https://github.com/iMoonLab/HGNN 500star 概述 贡献&#xff1a;用于数据表示学习的超图神经网络 (HGNN) 框架&#xf…

【高阶数据结构】红黑树 {概念及性质;红黑树的结构;红黑树的实现;红黑树插入操作详细解释;红黑树的验证}

红黑树 一、红黑树的概念 红黑树&#xff08;Red Black Tree&#xff09; 是一种自平衡二叉查找树&#xff0c;在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有…

旅游APP外包开发注意事项

旅游类APP通常具有多种功能&#xff0c;以提供给用户更好的旅行体验。以下分享常见的旅游类APP功能以及在开发和使用这些APP时需要注意的问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 常见功能…

入栏需看——学习记忆

记忆方法千千种&#xff0c;本栏意在梳理其中道道来&#xff0c;旦有小得&#xff0c;肥肠幸耶。从不同角度分析学习记忆。 逻辑篇 有逻辑 用思维导图 思维导图记忆有逻辑的文本/内容 理论 巧记书本结构–思维导图 模仿 HCIE-Cloud Computing LAB备考第一步&#xff1a…

Python基于Mirai开发的QQ机器人保姆式教程(亲测可用)

在本教程中&#xff0c;我们将使用Python和Mirai来开发一个QQ机器人&#xff0c;本文提供了三个教学视频&#xff0c;包教包会&#xff0c;本文也很贴心贴了代码和相关文件。话不多说&#xff0c;直接开始教学。 目录 一、安装配置MIrai 图片验证码报错&#xff1a; 二、机器…

vue-cli中总提示组件没有正确注册

这里写目录标题 一、报错提示二、修改办法 一、报错提示 二、修改办法 <template><div><aside-component style"width: 15%"></aside-component></div> </template><script> import AsideComponent from /components/Asi…

NATAPP使用详细教程(免费隧道内网映射)

NATAPP - https://natapp.cn/tunnel/lists NATAPP 在开发时可能会有将自己开发的机器上的应用提供到公网上进行访问&#xff0c;但是并不想通过注册域名、搭建服务器&#xff1b;由此可以使用natapp&#xff08;内网穿透&#xff09; 购买免费隧道 修改隧道配置 看自己的web…

JAVA毕业设计096—基于Java+Springboot+Vue的在线教育系统(源码+数据库+18000字论文)

基于JavaSpringbootVue的在线教育系统(源码数据库18000字论文)096 一、系统介绍 本系统前后端分离 本系统分为管理员、用户两种角色(管理员角色权限可自行分配) 用户功能&#xff1a; 注册、登录、课程预告、在线课程观看、学习资料下载、学习文章预览、个人信息管理、消息…

【计算机视觉项目实战】中文场景识别

✨专栏介绍&#xff1a; 经过几个月的精心筹备&#xff0c;本作者推出全新系列《深入浅出OCR》专栏&#xff0c;对标最全OCR教程&#xff0c;具体章节如导图所示&#xff0c;将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。 &#x1f468;‍&…