文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处: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/
如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^