GeoMesa Java API-写入与查询数据
GeoMesa Java API-写入与查询数据
写入数据
GeoMesa作为空间大数据处理框架,本身是不存储数据的。数据存储依赖于底层的分布式数据库,如HBase,Accumulo等。GeoMesa为了同时支持多种数据库,提供了一个抽象的接口,屏蔽不同数据库操作方法的差异,使用户用一种统一的方式存储和查询数据。来看下面这GeoMesa存储架构图:
,无论采用何种方式写入数据,我们都不需要直接操作数据库,而只需按照GeoTools或GeoMesa的接口,规范好要存储的数据,提交给GeoMesa处理即可。GeoMesa会自动为我们完成创建元数据、创建索引、存储数据等一系列过程。
GeoTools提供了许多用于表示地理空间数据的接口,可以用他们来定义需要存储的数据:
DataStore
DataStore是数据的核心访问模型,存储了数据集的名称、数据结构与类型、数据访问源等信息,类似一种数据元信息的存储集合,用于定义和描述数据的基本信息。
SimpleFeatureType
SimpleFeatureType即简单要素类型,用于定义数据类型,类似SQL语句中create table时定义表字段时所指定的信息。常用一种特殊格式的字符串表示,如:
tpList:String,startTime:Date:default=true,startPoint:Point:srid=4326:default=true
创建SimpleFeatureType时,需要使用GeoMesa提供的org.locationtech.geomesa.utils.interop.SimpleFeatureTypes类,而不是直接使用Geotools的DataUtilities创建,目的是为了支持更多的数据类型。
sft = SimpleFeatureTypes.createType(getTypeName(), attributes.toString());
SimpleFeatureType在DataStore中被称为Schema,使用dataStore.createSchema(sft)函数在DataStore中创建Schema。
SimpleFeature
SimpleFeature即简单要素,用于定义具体的数据。可以使用Geotools提供的SimpleFeatureBuilder类创建,只需要按照先前定义的SimpleFeatureType,依次传入相应类型的数据,最后设置Feature的ID即可,如:
SimpleFeatureBuilder builder = new SimpleFeatureBuilder(getSimpleFeatureType());
builder.set("tpList", ptListString);
builder.set("startTime", new Date(Long.valueOf(startTime)*1000));
builder.set("startPoint", "POINT (" + startPointY + " " + startPointX + ")");
SimpleFeature feature = builder.buildFeature(id);
其中,空间数据可以用WKT(well-known-text)格式的字符串来表示。
写入
创建好SimpleFeature后,就可以开始向数据库中写入数据了。
使用Geotools提供的FeatureWriter执行写入操作,具体代码如下:
FeatureWriter<SimpleFeatureType, SimpleFeature> writer = datastore.getFeatureWriterAppend(sft.getTypeName(), Transaction.AUTO_COMMIT)
for (SimpleFeature feature : features) {
SimpleFeature toWrite = writer.next();
// copy attributes
toWrite.setAttributes(feature.getAttributes());
// if you want to set the feature ID, you have to cast to an implementation class
// and add the USE_PROVIDED_FID hint to the user data
((FeatureIdImpl) toWrite.getIdentifier()).setID(feature.getID());
toWrite.getUserData().put(Hints.USE_PROVIDED_FID, Boolean.TRUE);
// make sure to copy the user data, if there is any
toWrite.getUserData().putAll(feature.getUserData());
// write the feature
writer.write();
}
查询数据
GeoMesa同样使用了GeoTools工具,作为查询操作的接口,查询时的过程图如下:
使用GeoTools进行查询的基本流程如下:
- ① 获取要查询的要素名称,即写入时SimpleFeatureType的Name
- ② 对想要查询的字段,编写相应的查询条件,并创建Filter类型的对象
- ③ 创建Query对象,将上一步中所有查询条件加入其中
- ④ 执行查询,获得查询结果
其中,查询条件可以使用GeoTools提供的CQL(GeoTools’ Contextual Query Language)或ECQL语句编写,并直接转换为Filter对象,例如:
Filter result = CQL.toFilter("ATTR1 < 10 AND ATTR2 < 2 OR ATTR3 > 10" );
Filter result = CQL.toFilter( "ATTR1 AFTER 2006-11-30T01:30:00Z/2006-12-31T01:30:00Z" );
Filter result = CQL.toFilter( "CONTAINS(ATTR1, POINT(1 2))" );
Filter result = CQL.toFilter( "BBOX(ATTR1, 10,20,30,40)" );
Filter result = CQL.toFilter( "DWITHIN(ATTR1, POINT(1 2), 10, kilometers)" );
执行查询时,使用FeatureReader完成查询操作,代码如下:
List<SimpleFeature> queryFeatureList = new ArrayList<>();
FeatureReader<SimpleFeatureType, SimpleFeature> reader = datastore.getFeatureReader(query, Transaction.AUTO_COMMIT)
int n = 0;
while(reader.hasNext()){
SimpleFeature feature=reader.next();
queryFeatureList.add(feature);
n++;
}
System.out.println();
System.out.println("Returned"+n+"totalfeatures");
几个常用查询条件
设置最大返回条目:
Query query = new Query(typeName, ECQL.toFilter(queryCQL));
query.setMaxFeatures(Integer.parseInt(maxView));
设置排序:
Query query = new Query(typeName, ECQL.toFilter(queryCQL));
FilterFactoryImpl ff = new FilterFactoryImpl();
query.setSortBy(new SortBy[]{new SortByImpl(ff.property("startTime"), SortOrder.ASCENDING)});
统计查询-查总数
Query query = new Query(typeName);
query.getHints().put(QueryHints.STATS_STRING(), "Count()");
聚合查询-GroupBy,查每个分组的总数
Query query = new Query(typeName);
query.getHints().put(QueryHints.STATS_STRING(), "GroupBy(\"carID\",Count())");
统计查询-查最大最小值
Query query = new Query(typeName);
query.getHints().put(QueryHints.STATS_STRING(), "MinMax(\"startTime\")");
作者:涛O_O 链接:https://www.jianshu.com/p/cfbe6e7c89b2
GeoMesa Java API-写入与查询数据的更多相关文章
- [搜索]ElasticSearch Java Api(一) -添加数据创建索引
转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...
- ElasticSearch AggregationBuilders java api常用聚会查询
以球员信息为例,player索引的player type包含5个字段,姓名,年龄,薪水,球队,场上位置.index的mapping为: "mappings": { "pl ...
- Java API 实现HBase的数据添加与过滤查询
包依赖比较麻烦,找了好久,我用的CDH5.0 现将所依赖的包的列表清单如下: public class EmployeeDao { /** * @param args */ public static ...
- 通过java api 读取sql 中数据(查询)
配置文件:dbconfig.properties 里面的数据 jdbc.url.jwhat=jdbc\:mysql\://ip\:3306/laibadev?useUnicode\=true& ...
- [ElasticSearch]Java API 之 词条查询(Term Level Query)
1. 词条查询(Term Query) 词条查询是ElasticSearch的一个简单查询.它仅匹配在给定字段中含有该词条的文档,而且是确切的.未经分析的词条.term 查询 会查找我们设定的准确值 ...
- 使用Lucene的java api 写入和读取索引库
import org.apache.commons.io.FileUtils;import org.apache.lucene.analysis.standard.StandardAnalyzer;i ...
- Lucene 05 - 使用Lucene的Java API实现分页查询
目录 1 Lucene的分页查询 2 代码示例 3 分页查询结果 1 Lucene的分页查询 搜索内容过多时, 需要考虑分页显示, 像这样: 说明: Lucene的分页查询是在内存中实现的. 2 代码 ...
- Elasticsearch Java API—多条件查询(must)
多条件设置 //多条件设置 MatchPhraseQueryBuilder mpq1 = QueryBuilders .matchPhraseQuery("pointid",&qu ...
- java实现点击查询数据生成excel文件并下载
须先导入关键maven包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi& ...
随机推荐
- IO输入和输出
编程语言的I/O类库中常用使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接受端对象."流"屏蔽了实际的I/O设备中处理数据的细节. JAVA类库中的 ...
- CentOS-8.3.2011-x86_64 配置网络环境的几个方案以及问题处理方法
1. 在安装前的环境配置中配置网络 可以通过 NETWORK & HOST NAME 进行网络配置, 推介通过这里便捷设置. 如果在安装的 CentOS 之前的配置选项中没有进行用户和网络的配 ...
- 深入了解MySQL主从复制的原理
欢迎微信关注「SH的全栈笔记」 0. 主从复制 首先主从复制是什么?简单来说是让一台MySQL服务器去复制另一台MySQL的数据,使两个服务器的数据保持一致. 这种方式与Redis的主从复制的思路没有 ...
- web元素定位和appium-app元素定位
一.web页面元素定位工具介绍 1.打开google浏览器,按F12进入开发者模式,如下图: 2.用鼠标点击下图红色框中的箭头--然后鼠标移动到web页面的元素上(此处为百度框),会自动定位到对应的h ...
- 科来网络通讯协议图2019版(OSI七层模型)
来源:http://www.colasoft.com.cn/download/protocols_map.php 自己把它转成了图片,好做查看:https://www.lanzous.com/ib5h ...
- python3.6安装教程
Python代码要运行,必须要有Python解释器.Python3.x的版本是没有什么区别的,这里以3.6版本来演示安装的过程.这里只介绍Windows环境下的安装. 下载安装程序 Python官方的 ...
- o_direct刷新方式和文件系统支持Direct i/o
若让innodb使用o_direct刷新方式,文件系统支持Direct i/o 是非常重要的.为啥
- 【Linux】dlopen failed: /lib/lsiRAID.so: cannot open shared object file: No such file or directory
遇到这个问题,首先第一反应,是看其他的服务器中是否有这个库文件,如果有的话直接cp过来一份就行 但是检查发现,其他的系统中也不存在lsiRAID.so这个库文件,很神奇.. 但是看日志持续报错,查看s ...
- 【System】paging和swaping之间的区别是什么?
分析paging和swapping的区别,首先要了解内存管理 当虚拟内存用二级存储(物理磁盘)作为主存的扩展时,内核会尽力保持最活跃的数据在主存中.有一下两个内核例程做这件事情: 1.交换(swapp ...
- 【Linux】iptables的内核模块问题大坑!
系统环境 CentOS 6.5 今天本来可以平静的度过一天,正品味着下午茶的美好,突然接到防火墙iptables的报警. 进入到服务器中,执行下面的命令查看,结果报错 /etc/init.d/ipta ...