为了保证回复实时性,有任何问题欢迎加我QQ:451443165 讨论?(申请问题答案:xiaof22a)

关于GeoMesa环境搭建以及整体架构,请参阅我的前两篇博文:

GeoMesa源码学习 (1):整体架构

GeoMesa-HBase部署实践

前面介绍了了GeoMesa的整体架构,并简单介绍了GeoMesa各个模块的作用。考虑到GeoMesa是一个比较的复杂的工程,对它的源码分析不可能做到面面俱到,所以作者准备采取从细节入手,以顺藤摸瓜,以点带面的方式对其进行探索,以求理解掌握与GeoMesa基本业务逻辑相关的核心代码,从而为以后的二次开发打下基础,同时也希望后面一系列文章能起到抛砖引玉的作用,以求帮助有兴趣的朋友们快速了解GeoMesa的结构。

话不多说,下面进入正题。前面介绍到GeoMesa的定位其实是一个时空数据引擎,或者叫数据库中间件,目的在于使用户可以在分布式NoSQL数据库中存储和管理海量空间数据,因此数据的入库功能应该是一个非常好的代码阅读起点,本文就给大家简单介绍一下GeoMesa的数据入库功能。

1. GeoTools Data 模块

GeoTools作为最常用的基于Java的地理信息工具包,在开源的GIS软件(如GeoServer)中被广泛使用,GeoMesa的数据操作功能完全基于GeoTools 包中的类和接口进行构建。其中与数据操作有关的核心接口与类位于GeoTools Data模块中。GeoTools中进行矢量数据操作的最核心的接口是DataStore。DataStore接口继承了DataAccess<T,F>接口,T表示FeatureType, F代表Feature。任何一个空间要素都可以用FeatureType与Feature来表示。下图展示了接口之间的对应关系以及接口中定义的方法。一个DataStore可以理解为一个数据源,其中定义了所有与数据操作相关的方法,针对各种数据源(Shapefile,PostGIS,Oracle等)数据访问类都实现了DataStore接口。详细了解Geotools数据操作,推荐参考这一篇官方的教程

http://docs.geotools.org/latest/userguide/tutorial/datastore/index.html:

下图是DataStore的详细信息与继承关系:

GeoMesa同样基于DataStore接口实现对空间数据的操作。然后大家可以在rg.locationtech.geomesa.index.geotools.GeoMesaDataStore类中找到具体实现。下图为GeoMesaDataStore所有接口信息,大家可以看到GeoMesaDataStore实现了DataStore中的方法:

GeoMesaDataStore作为GeoMesa中所有数据源DataStore的基类,提供了一些业务流程基本实现,但具体到针对每种数据库的数据操作接口则由它的一些子类提供具体实现,如HbaseDataStore、CassandraDataStore等。

2. 索引管理

GeoMesa最核心的部分就是索引系统。前面介绍过GeoMesa提供了多种索引方法(z2/z3,xz2/zx3),这些索引方大统一在GeoMesaIndexManager类中管理,在GeoMesaDataStore中可以看到生成GeoMesaIndexManager的一个方法:

GeoMesaDataStore在进行数据表创建,数据导入,数据查询等操作都会通过GeoMesaIndexManager类获取空间索引,然后针对每一个空间要素都会生成一个索引值作为主键,关于空间索引我们在后面会有专门文章介绍,这里读者只要记住通过GeoMesaIndexManager可以得到所有索引的具体实现的实例就可以了。

3. 创建Schema

每一个矢量图层都对应一个schema,用于保存(空间参考,列属性)等元数据信息,DataStore接口中规定了createSchema方法,用于针对每一种数据库创建相应的schema信息,GeoMesaDataStore中createSchema方法的实现如下:

这里的Schema值得就是与数据集有关的元数据信息(空间参考,列属性等)在数据库中的表示,比如OracledataStore中createSchema方法的作用是在数据库中创建一个表格专门用于保存空间数据的属性信息。createSchema方法会一些列辅助方法来创建读schema,读者可以看到GeoMesaDataStore中与几个与scheam相关的方法:

这些方法就定义了GeoMesa中创建Schema相关的业务逻辑,比如onSchemaCreated方法,如果读者还记得我在GeoMesa-HBase部署实践这篇文章中后面使用GeoMesa导入shp数据后在生成了5个表格么,对的,就是这里定义的,只不过具体实现要在org.locationtech.geomesa.hbase.data.HBaseDataStore中实现,理解了么。

4. 生成Writer

GeoTools中的数据导入功能是通过FeatureWriter接口实现的,FeatureWriter的定义如下:

简单讲,FeatureWriter接口定义了一系列方法来实现数据导入过程,如首先通过hasNext判断有没有要素,如果有则使用next获得要素,然后通过write方法将要素写入目标数据库。这里给出基于CSV实现空间读写的实现例子:

http://docs.geotools.org/latest/userguide/_downloads/CSVFeatureWriter1.java

对于写入要素通过getFeatureWriterAppend方法获得FeatureWriter,方法之间的引用关系如下图所示,GeoMesaDataStore通过抽象的createFeatureWriterAppend方法最终生成FeatureWriter对象的:

CassandraDataStore和HBaseDataStore都提供个各自的createFeatureWriterAppend的实现:CassandraAppendFeatureWriter和HbaseAppendFeatureWriter,他们都继承了GeoMesaAppendFeatureWriter类。这里需要再强调一下,GeoMesaAppendFeatureWriter实现了org.geotools.data.FeatureWriter接口中的hasNext,next,write等方法,所以数据导入过程严格按照GeoTools定义的数据导入过程来执行。如果要基于GeoMesa扩展对新的数据库支持,只需要对上面这几个方法进行重新,而把主要的业务逻辑交给GeoTools内部的基础类实现即可。我看来看一下GeoMesa-hbase的数据导入实现过程:

(1) GeoMesaFeatureWriter首先会调用createMutators方法,这个方法需要它的子类来实现,如右边HBaseAppendFeatureWriter中的实现。可以看到createMutator方法其实是获得了用于写入HBase的BufferedMutator类。org.apache.hadoop.hbase.client.BufferedMutator主要用来对HBase的单个表进行操作。它和Put类的作用差不多,但是主要用来实现批量的异步写操作。BufferedMutator替换了HTable的setAutoFlush(false)的作用。可以从Connection的实例中获取BufferedMutator的实例。在使用完成后需要调用close()方法关闭连接。对BufferedMutator进行配置需要通过BufferedMutatorParams完成。

(2)当数据写入类初始化完成之后,就可以调用write方法写入数据了,这里write方法调用了writeFeature方法。

(3)writeFeature继续调用了executeWrite方法(具体实现由子类提供)。这里笔者的理解是,mutator作为写入工具,writes就是等待写入的要素,covert的的作用就是对不同的索引表格进行转换,也就是生成对应的索引值,然后才能写入不同的索引表格中。

(4)子类中实现具体的写入流程

那么具体的索引值是在那里生成的呢,读者可能猜到了,对,就是在 GeoMesaFeatureWriter.getTablesAndConverters[DS, F, W](sft, ds, indices)方法中了,

这个Writer方法是什么呢,它可以在org.locationtech.geomesa.index.index.BaseFeatureIndex类中找到:

怎么样,是不是豁然开朗了,shard与IndexKey都是HBase索引的组成部分。其实可以这样理解,GeoMesa提供了不同种类的索引,每种索引对应一个表格,所以使用GeoMesa进行数据导入的过程中需要针对每种索引表分别创建数据导入工具生成不同的键值。这里需要提一下,对于Cassandra数据库,由于其与HBase、Accumulo、bigtable等架构差异很大,所以针对于Cassandra数据库的writer方法可以在org.locationtech.geomesa.cassandra.index.CassandraFeatureIndex中找到:

5. 导入数据

前面Geomesa-hbase部署实践这篇文章中我们使用GeoMesa自带的入库工具导入了shapefile文件,这个工具可以在org.locationtech.geomesa.tools.ingest.ShapefileIngest中找到,ShapefileIngest中使用了GeneralShapefileIngest中的方法进行入库操作:

是不是图中红框标注的方法非常熟悉呢。

好了至此GeoMesa数据入库相关的核心代码就介绍完了。由整个过程比较复杂,牵扯到的类比较多而且极为繁琐,所以本文仅仅将几个主要的类与方法作了介绍,有兴趣的朋友可以按照笔者的介绍试着读一下代码,如果有新的想法或者发现,可以分享出来一起研究。最后由于笔者水平所限,文章介绍可能会有不准确的地方,也欢迎大家批评指正!

GeoMesa源码学习 (2):创建Schema并导入数据相关推荐

  1. 【收藏】GeoMesa整体架构模块介绍、创建Schema并导入数据

    geomesa-accumulo:基于 Apache Accumulo的DataStore 实现 geomesa-archetypes: Maven构建模板 geomesa-arrow: 基于 Apa ...

  2. GeoMesa源码学习:空间索引

    本文转自:http://keep.01ue.com/?pi=298096&_a=app&_c=index&_m=p 分布式空间索引可以说是GeoMesa的灵魂了,它直接决定了空 ...

  3. 第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理

    第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第八课 ...

  4. 第三课 k8s源码学习和二次开发-缓存机制Informers和Reflector组件学习

    第三课 k8s源码学习和二次开发-缓存机制Informers和Reflector组件学习 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第三课 k8s源码学习和二 ...

  5. vue实例没有挂载到html上,vue 源码学习 - 实例挂载

    前言 在学习vue源码之前需要先了解源码目录设计(了解各个模块的功能)丶Flow语法. src ├── compiler # 把模板解析成 ast 语法树,ast 语法树优化,代码生成等功能. ├── ...

  6. jQuery源码学习之Callbacks

    jQuery源码学习之Callbacks jQuery的ajax.deferred通过回调实现异步,其实现核心是Callbacks. 使用方法 使用首先要先新建一个实例对象.创建时可以传入参数flag ...

  7. JDK源码学习笔记——Integer

    一.类定义 public final class Integer extends Number implements Comparable<Integer> 二.属性 private fi ...

  8. DotText源码学习——ASP.NET的工作机制

    --本文是<项目驱动学习--DotText源码学习>系列的第一篇文章,在这之后会持续发表相关的文章. 概论 在阅读DotText源码之前,让我们首先了解一下ASP.NET的工作机制,可以使 ...

  9. Vuex源码学习(五)加工后的module

    没有看过moduleCollection那可不行!Vuex源码学习(四)module与moduleCollection 感谢提出代码块和截图建议的小伙伴 代码块和截图的区别: 代码块部分希望大家按照我 ...

最新文章

  1. Linux内核源代码分析-第三章 内核体系结构概述-1
  2. Homebrew安装不要改hosts了,直接用这个国内源才爽!
  3. codeforces 501 C,D,E
  4. 不用代理实现弹出进度条窗体
  5. android录音功能的实现
  6. LeetCode198——house robber(不懂dp)
  7. 哈老师一到的飞鸽传书
  8. python调试_Python 调试
  9. 自行更换iPhone 13屏幕会导致Face ID失效?苹果将发布软件更新解除限制
  10. 【POJ 1860】Currency Exchange
  11. flt文件matlab,FLT文件扩展名 - 什么是.flt以及如何打开? - ReviverSoft
  12. vue 非父子组件传值
  13. 超全山东华为天翼网关电信光猫HS8145c超级密码获取
  14. cocos2dx-基本动画制作
  15. 从数据结构的角度来看Mysql为什么使用B+树
  16. 上传IPA包到App Store​
  17. Sublime 中文显示异常
  18. word论文参考文献字体间空隙
  19. 计算机网络的常见面试题
  20. 使用2节点梁或梁/杆单元分析弹塑性梁或框架(python,有限元)

热门文章

  1. 开学季选什么牌子蓝牙耳机好?2022学生党性价比蓝牙耳机推荐
  2. rapipago黑卡白金卡
  3. [CSS]初识CSS
  4. UNSIGNED关键字的解释和用法
  5. C语言中用unsigned的作用,C语言中unsigned和int的计算
  6. mysql中 signed 与 unsigned  详解
  7. android ndk 界面开发教程,AndroidStudio NDK开发最佳入门实践
  8. RTK-Real Time kinematic实时动态
  9. 开好会议的方法 会议达成共识 明确目标,促成共识 单向会议 互动会议 会议讨论,文档先行 会前文档 会中 3D法则讨论 同步会议,跟进代办 举个栗子 企业管理
  10. 优雅的Koa,真的能取代Express吗?