文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

1. 背景

在实际项目运行中,时常会出现希望搜索周边所有数据的需求。但是以常规的存储方案,每种资源均为一个图层或一个表,比如人员轨迹表、车辆轨迹表、各类空间图层表等。在进行全文空间收索时,基于传统空间关系库或后台图层服务的遍历查询则过于耗时。这里,我们研究基于ElasticSearch来进行所有数据的整合,以及全文查询服务的提供,并且分别从查询效率、查询精度、查询类型、存储空间四个维度来进行方案的验证。

2.实验数据准备

试验数据包含5个行政面图层、3个线图层(一、二、三级道路中心线)以及75个点图层。一共83个图层。

3.存储设计和对比

a.一个shp对应一个索引。索引中记录shp图层的属性信息和几何信息。

b.增加wkt字段以保存原始坐标。由于ES的空间查询仅支持wgs84坐标,在导入数据时我们将即利用wkt字段保留原始坐标,而es的location字段则保存转换后的wgs84坐标数据结构设计:

以下为点、线、面的存储结构:

线

83张图层的占用存储空间变化:

  表名

Shp大小

储存占用空间

9.91mb

3.3mb
行道树

25.3mb

8.3mb

X1井盖

23.6mb

7.7mb

X2井盖

24.1kb

10kb

X3井盖

729 kb

458.8kb

合计

198mb

72.5mb

4.查询验证(类型、效率、精度)

4.1查询类型—面查点

以网格面fid为122的面进行查询。

http请求

GET /_all/_search

{

"query":{

"bool": {

"filter": {

"geo_shape": {

"location": {

"shape": wkt,

"relation": "within"

}

}

}

}

}

}

效率:

查询到137个结果,耗时517毫秒

精度:

4.2查询类型—面查线

以街道面fid为2的面进行查询三种道路中心线。

http请求

GET /一级道路中心线,二级道路中心线,三级道路中心线/_search

{

"query":{

"bool": {

"filter": {

"geo_shape": {

"location": {

"shape": wkt,

"relation": "within"

}

}

}

}

}

}

效率:

35条结果,耗时151毫秒

精度:

4.3查询类型—面查面

同样以街道面fid为2的面进行查询社区面

http请求

GET /社区面/_search

{

"query":{

"bool": {

"filter": {

"geo_shape": {

"location": {

"shape": wkt,

"relation": "within"

}

}

}

}

}

}

效率:

7条结果,耗时1406毫秒

精度:

4.4查询类型—点查面

查找井盖fid为10929的点落在哪一块网格、社区、街道内。

http请求

GET /index/_search

{

"query":{

"bool": {

"filter": {

"geo_shape": {

"location": {

"shape": wkt

}

}

}

}

}

}

效率和精度:

查询结果是正确的,耗时都在5毫秒以内。

5.总结

利用ES来进行空间大数据的存储和运用无论从精度、效率、存储利用空间上均是非常合适的选择。但是从项目实施的角度,仍然有以下内容需要完成:

a.elasticsearch的脚本化搭建。

b.入库工具开发

c.后台服务接口封装,对输入参数(坐标等)以及输出结果(坐标等)根据对应环境转换

d.前端将全文检索——文本或空间,以标准功能开发

                    -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

GIS大数据存储预研的更多相关文章

  1. MapGis如何实现WebGIS分布式大数据存储的

    作为解决方案厂商,MapGis是如何实现分布式大数据存储的呢? MapGIS在传统关系型空间数据库引擎MapGIS SDE的基础之上,针对地理大数据的特点,构建了MapGIS DataStore分布式 ...

  2. 大数据存储:MongoDB实战指南——常见问题解答

    锁粒度与并发性能怎么样? 数据库的读写并发性能与锁的粒度息息相关,不管是读操作还是写操作开始运行时,都会请求相应的锁资源,如果请求不到,操作就会被阻塞.读操作请求的是读锁,能够与其它读操作共享,但是当 ...

  3. Sqlserver 高并发和大数据存储方案

    Sqlserver 高并发和大数据存储方案 随着用户的日益递增,日活和峰值的暴涨,数据库处理性能面临着巨大的挑战.下面分享下对实际10万+峰值的平台的数据库优化方案.与大家一起讨论,互相学习提高!   ...

  4. 从 RAID 到 Hadoop Hdfs 『大数据存储的进化史』

    我们都知道现在大数据存储用的基本都是 Hadoop Hdfs ,但在 Hadoop 诞生之前,我们都是如何存储大量数据的呢?这次我们不聊技术架构什么的,而是从技术演化的角度来看看 Hadoop Hdf ...

  5. 大数据存储的进化史 --从 RAID 到 Hdfs

    我们都知道现在大数据存储用的基本都是 Hdfs ,但在 Hadoop 诞生之前,我们都是如何存储大量数据的呢?这次我们不聊技术架构什么的,而是从技术演化的角度来看看 Hadoop Hdfs. 我们先来 ...

  6. 大数据存储利器 - Hbase 基础图解

    由于疫情原因在家办公,导致很长一段时间没有更新内容,这次终于带来一篇干货,是一篇关于 Hbase架构原理 的分享. Hbase 作为实时存储框架在大数据业务下承担着举足轻重的地位,可以说目前绝大多数大 ...

  7. Hadoop第三天---分布式文件系统HDFS(大数据存储实战)

    1.开机启动Hadoop,输入命令:  检查相关进程的启动情况: 2.对Hadoop集群做一个测试:   可以看到新建的test1.txt和test2.txt已经成功地拷贝到节点上(伪分布式只有一个节 ...

  8. 快速构建大数据存储分析平台-ELK平台安装

    一.概述 ELK是由Elastic公司开发的Elasticsearch.Logstash.Kibana三款开源软件的缩写(但不限于这三款软件). 为什么使用ELK? 在目前流行的微服务架构中,一个大型 ...

  9. python3如何随机生成大数据存储到指定excel文档里

    本次主要采用的是python3的第三方库xlwt,来创建一个excel文件.具体步骤如下: 1.确认存储位置,文件命名跟随时间格式 2.封装写入格式 3.实现随机数列生成 4.定位行和列把随机数写入 ...

随机推荐

  1. PHP多进程消费队列

    引言 最近开发一个小功能,用到了队列mcq,启动一个进程消费队列数据,后边发现一个进程处理不过来了,又加了一个进程,过了段时间又处理不过来了...... 这种方式每次都要修改crontab,如果进程挂 ...

  2. Python_自定义有向图

    directedGraph.py class DirectedGraph(object): def __init__(self,d): if isinstance(d,dict): self.__gr ...

  3. Spring Boot实战笔记(五)-- Spring高级话题(Spring Aware)

    一.Spring Aware Spring 依赖注入的最大亮点就是你所有的 Bean 对 Spring容器的存在是没有意识的.即你可以将你的容器替换成其他的容器,如Google Guice,这时 Be ...

  4. PAT1011:World Cup Betting

    1011. World Cup Betting (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Wit ...

  5. Linux时间子系统之四:Timer在用户和内核空间流程

    用户空间应用中创建一个Timer(alarm/setitimer/POSIX Timer等等),然后程序继续执行: 内核进入创建/设置Timer系统调用,开始计时,在超时后通过何种方式通知用户空间: ...

  6. Yii 1.1 请求报400错误

    Yii的action可以带参数,比如: class PostController extends CController { public function actionCreate($categor ...

  7. Idea的一些调试技巧

    程序员的工作内容,除了大部分时间写代码之外,因为有不少的时间是用在调试代码上.甚至说不是在调试代码,就是即将调试代码. :) 今天我们来谈谈调试代码的一些技巧,在使用IDE提供的debugger时一些 ...

  8. When to use next() and return next() in Node.js

    Some people always write return next() is to ensure that the execution stops after triggering the ca ...

  9. java之集合Collection详解之3

    package cn.itcast_03; public class Student { // 成员变量 private String name; private int age; // 构造方法 p ...

  10. 用Hyperledger Fabric(超级账本)来构建Java语言开发区块链的环境

    面向 Java 开发人员的链代码简介 您或许听说过区块链,但可能不确定它对 Java™ 开发人员有何用.本教程将帮助大家解惑.我将分步展示如何使用 Hyperledger Fabric v0.6 来构 ...