GIS:DataStore数据管理框架

news2024/10/5 12:52:17

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;

// 获取支持的Hint
    public 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 SimpleFeatureCollection
        extends 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.coloradmin.cn/o/978011.html

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

相关文章

MySQL连接错误1045:完美解决指南

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

第五章 数据分析模型 题目学习(40%)

第一节 主成分的计算步骤&#xff1a;1、主成分建模&#xff0c;标准化处理。2、计算特征根、特征向量。3、选取主成分个数。 题目 选择B&#xff0c;依次递减。 相关系数和关联矩阵都做了标准化&#xff0c;做完标准化后方差就不会造成影响&#xff0c;所以选A。 A可以进行判断…

JavaScript-----对象(创建对象、数组与字符串)

目录 前言&#xff1a; 1. JavaScript创建对象 1.1 对象的创建 1.2 对象的调用 1.3 for-in循环语句 2.内置对象 2.1 Array&#xff08;数组&#xff09;对象 属性和方法 2.2 String&#xff08;字符串&#xff09;对象 属性和方法 2.3 Math对象 2.4 日期对象 前言&a…

华为云API对话机器人CBS的魅力—实现简单的对话操作

云服务、API、SDK&#xff0c;调试&#xff0c;查看&#xff0c;我都行 阅读短文您可以学习到&#xff1a;人工智能AI智能的问答管理、全面的对话管理、高效训练部署 1.IntelliJ IDEA 之API插件介绍 API插件支持 VS Code IDE、IntelliJ IDEA等平台、以及华为云自研 CodeArts …

Unity项目包体优化经验方法论(Android平台)

前言 本篇文章主要讲解对于Unity Android平台也就是APK包体的优化经验&#xff0c;使用哪些工具能够更加便利的定位资源重灾区。本篇讲解的方法中对于Unity资源使用的AssetBundle的方式&#xff0c;如果使用addressable或其他资源管理方式&#xff0c;我还不是很清楚是否适用&…

Vue + Element UI 前端篇(六):更换皮肤主题

自定义主题 命令行主题工具 1.安装主题工具 首先安装「主题生成工具」&#xff0c;可以全局安装或者安装在当前项目下&#xff0c;推荐安装在项目里&#xff0c;方便别人 clone 项目时能直接安装依赖并启动。 yarn add element-theme --dev 2.安装chalk主题 安装白垩主题…

STC15单片机特有的PWM寄存器和普通定时器实现PWM输出

STC15单片机特有的PWM寄存器和普通定时器实现PWM输出 🌿主要针对STC15W4型号特有的6通道15位专门的高精度PWM。 ✨STC15W4K32S4系列单片机具有6通道15位专门的高精度PWM(带死区控制)和2通道CCP(利用它的高速脉冲输出功能可实现11~16位PWM);(STC15F/L2K60S2系列单片机具有3通…

RC-u4 相对论大师(bfs求解指定路径)

PTA | 程序设计类实验辅助教学平台 题解&#xff1a; bfs可以求解从根节点到叶子节点的指定路径&#xff0c;这里的vis[]不是为了防止访问到父节点&#xff0c;更多的是为了缩小路径长度&#xff0c;mpp和mp的映射也很巧妙&#xff0c;开始我用的还是map<pair<string,s…

用通俗易懂的方式讲解大模型分布式训练并行技术:流水线并行

近年来&#xff0c;随着Transformer、MOE 架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此&#xff0c;我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&…

怎么用conda下载清华源的pytorch(自带cuda的版本)

1&#xff0c;添加镜像源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…

大数据课程K22——Spark的SparkSQL的API调用

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 掌握Spark的通过api使用SparkSQL&#xff1b; 一、通过api使用SparkSQL 1. 实现步骤 1. 打开scala IDE开发环境&#xff0c;创建一个scala工程。 2. 导入spark相关依赖…

介绍 dubbo-go 并在Mac上安装,完成一次自己定义的接口RPC调用

目录 RPC 远程调用的说明作用&#xff1a;像调用本地方法一样调用远程方法和直接HTTP调用的区别&#xff1a;调用模型图示&#xff1a; Dubbo 框架说明Dubbo Go 介绍应用 Dubbo Go环境安装&#xff08;Mac 系统&#xff09;安装 Go语言环境安装 序列化工具protoc安装 dubbogo-c…

【VSCode】文件模板创建及使用.md

背景 最近使用VSCode学习Vue项目比较频繁&#xff0c;每次创建Vue文件都要手动写重复代码&#xff0c;特别麻烦&#xff0c;就上网查找自动生成代码的说明&#xff0c;结果发现VSCode有代码模板&#xff0c;怪怪&#xff0c;感觉发现新大陆了(low!)。 配置 打开配置 方式一&a…

通过slam同步建图程序看ros2节点参数传递生效顺序

缘起&#xff1a; ros2 节点参数可以通过启动节点添加&#xff0c;也可以通过launch文件添加&#xff0c;还可以通过配置文件.yaml文件添加&#xff0c;或者是几种方式套用添加&#xff0c;给初学者带来很大的困惑具体是哪个生效了呢&#xff0c;我们拿slam_toolbox 包的onli…

shell脚本介绍

当你进入Linux世界的大门时&#xff0c;就会遇到一个强大而又神奇的工具——Shell。Shell是一种命令行解释器&#xff0c;为你在Linux系统中与计算机进行互动提供了无限的可能性。 学习Shell可以让你获得强大的自动化和脚本编程能力&#xff0c;让你更高效地处理文件和目录、管…

【力扣周赛】第 357 场周赛(⭐反悔贪心)

文章目录 竞赛链接Q1&#xff1a;6925. 故障键盘解法1——直接模拟解法2——双端队列 Q2&#xff1a;6953. 判断是否能拆分数组&#xff08;贪心&#xff09;Q3&#xff1a;2812. 找出最安全路径⭐解法1——多源BFS瓶颈路模型&#xff1f;解法2——多源BFS 倒序枚举答案 并查…

Vue + Element UI 实现权限管理系统 前端篇(四):优化登录流程

完善登录流程 1. 丰富登录界面 1.1 从 Element 指南中选择组件模板丰富登录界面&#xff0c;放置一个登录界面表单&#xff0c;包含账号密码输入框和登录重置按钮。 <template><el-form :model"loginForm" :rules"fieldRules" ref"loginFo…

数字图像处理:亮度对比度-几何变换-噪声处理

文章目录 数字图像增强亮度与对比度转换几何变换图像裁剪尺寸变换图像旋转 噪声处理添加噪声处理噪声 数字图像增强 亮度与对比度转换 图像变换可分为以下两种&#xff1a; 点算子&#xff1a;基于像素变换&#xff0c;在这一类图像变换中&#xff0c;仅仅根据输入像素值计算…

真随机数生成器TRNG外设模块详解

真随机数生成器TRNG外设模块详解 文章目录 真随机数生成器TRNG外设模块详解简介原理与机制应用要点时钟源中断源初始化数据 软件支持 简介 国产车规微控制器原厂云途半导体设计和发售的YTM32ME微控制器上集成的真随机数生成器TRNG&#xff08;True Random Number Generator&am…

01_TMS320F28004x系列MCU介绍和资料搜集

1. TI C2000 实时微控制器 TI公司在处理器方面的产品线有&#xff1a;基于ARM内核的微控制器/微处理器、MSP430微控制器、C2000系列实时微控制器、还有数字信号处理器&#xff08;DSP&#xff09;。 其中&#xff0c;C2000是TI公司专门针对实时控制推出的32位微控制器。TI公司…