geotrellis使用(二十六)实现海量空间数据的搜索处理查看

目录

  1. 前言
  2. 前台实现
  3. 后台实现
  4. 总结

一、前言

       看到这个题目有人肯定会说这有什么可写的,最简单的我只要用文件系统一个个查找、打开就可以实现,再高级一点我可以提取出所有数据的元数据,做个元数据管理系统就可以实现查找功能,有必要用geotrellis用分布式吗?这不是杀鸡用牛刀吗?理论上是这样的,但是要看我们考虑问题的尺度,如果你只是一些简单的数据用传统方法当然好,省事、省时、简单、速度快,但是当我们将数据的量放大到一个区域乃至全球的时候恐怕事情就不是那么简单了,比如我们有了全球Landsat数据,如何查看某一地区此数据的情况,传统方法可能要自己先计算出此区域的Landsat的带号,然后再找到此数据并打开之。如果觉得这海不麻烦,那么当用户需要考察Landsat的云量或者NDVI的时候是不是又要用户自己打开数据并使用Arcgis等自行计算?是不是很麻烦,而本文介绍的方法是只需要用户输入有关此点的信息(带号或者点位信息),系统能够自动呈现此区域的数据(或者云量、NDVI等结果),这样是不是逼格立马上去了呢?

二、前台实现

       此功能的前台也不可谓不复杂,但是难不倒我这个全栈工程师(请忽略此话),费了半天劲,基本实现了前台的功能。总体就是一个搜索框加一个按钮,然后发送搜索关键词到后台,后台返回数据列表,前台逐条展示之,单机每条数据的时候在地图中(地图框架采用leaflet)呈现此数据的情况,类似Google、百度。这里面我主要介绍以下知识点。

2.1 在地图中添加、删除标记

       要给用户呈现数据情况,最重要的就是数据的空间范围,简单的说就是将四个(或多个)顶点逐一连成线在地图中显示出来。leaflet可以简单的使用如下语句实现该功能:

geoJsonOverlay = L.geoJson(geoJson);
geoJsonOverlay.addTo(map);

       其中map为L.map('map')对象,geoJson就是想要添加的标记对象,此处用的是GeoJson,GeoJson简单来说就是将空间对象转成相应的json对象,便于交互、传输等。

       再次查询或其他情形下可能又需要将上述的标记层去掉,这时候只需下述语句即可:

map.removeLayer(geoJsonOverlay);

2.2 空间数据的显示

       当用户想要查看某个检索出来的数据情况的时候就需要将此数据显示到地图当中,后台暂且不表,如果用到瓦片技术那么显示在leaflet中的方式就是添加一层,同样移除数据就是删除该层。代码如下:

//add
WOLayer = new L.tileLayer(baseurl + '/{z}/{x}/{y}', {
    format: 'image/png',
    transparent: true,
    attribution: 'SJZX'
});

WOLayer.addTo(map);
map.lc.addOverlay(WOLayer, "Landsat");

//delete
map.lc.removeLayer(WOLayer);
map.removeLayer(WOLayer);

三、后台实现

       后台牵涉到的东西较多,主要是数据检索、数据范围生成GeoJson、数据存放、数据处理、数据发送等。

3.1 数据检索

       这块与传统方式相同,但是本文采用全文检索的方式,该内容涉及到的问题也比较多,会在后续另立新篇,详细介绍本系统全文检索以及空间检索的实现,总体上根据前台传入的关键词返回与之相关联的数据,相当于地理信息系统版的Google。

3.2 数据范围生成GeoJson

       简单说来就是从元数据中读出数据的空间范围,将此范围生成GeoJson对象发送到前台。具体元数据信息可以通过上面的数据检索获取,此处假设已经取到了空间范围的WKT标记对象,剩下的工作就是将WKT转成GeoJson,代码如下:

import geotrellis.vector.io.json.Implicits._
val geom = WKT.read(wkt)
geom.toGeoJson

       当然此处还需要考虑geometry对象的投影变换等问题,要考虑前台、后台以及数据等的投影方式,转换成自己需要的投影方式。

3.3 数据存放

       这块是本系统的核心,面对如此大的数据量只有合理的数据存放方式才能实现快速响应。目前采用的方式是前面文章讲述过的将数据导入到Accumulo,这种方式的好处是请求数据快,但同时造成的一个问题是数据量大(相当于数据保存了2-3份,如果再考虑HDFS的备份特性,相当于6-9份),以上述Landsat为例,采用此种方式必须要将全球的Landsat数据都导入到Accumulo中,这个量是非常大的,如果有多套数据需要采用此种方式检索,那么这个数据量确实非常大,但是分布式框架本身就是为了解决大数据量的问题。目前也正在寻找折中的解决方案。

3.4 数据处理

       比如Landsat数据我们可以实时计算用户查找区域的云量以及NDVI等并将之呈现给用户,这样用户能够对数据的质量有一个更加深刻的认识,而不需要用户再进行下载数据分析处理等。

3.5 数据发送

       数据发送的目的是将上述处理好的数据或原始数据发送到前台,前台进行展示。此处需要注意的是要根据请求的范围对请求结果进行掩盖,因为用户感兴趣(查找)的是某一个或某几个数据,如果不加掩盖,前台获取到的仍然是全球的数据,这样就没有意义。单个瓦片的请求在前面的文章中已经讲过,这里重点讲一下掩盖操作。前台的区别就是在请求数据的时候要多发送一个请求范围,比如为用户检索数据时后台发送的数据空间范围GeoJson对象,后台首先根据请求的x、y、z取到对应的瓦片,然后判断此瓦片与GeoJson对象的空间关系,取出在范围内的数据,其他数据赋为无值,这样就可以得到掩盖后的瓦片,看似复杂其实Geotrellis已经为我们实现了该过程,只需要简单几行代码即可实现:

import geotrellis.vector.io.json.Implicits._
val extent = attributeStore.read[TileLayerMetadata[SpatialKey]](id, Fields.metadata).mapTransform(key)
val geom = geoJson.parseGeoJson[Geometry]
tile.mask(extent, geom)

       其中attributeStore是Accumulo操作的实例,id为表示请求层的对象,key为表示请求瓦片的x、y,geoJson就是传入的空间范围对象,根据上述代码就能实现范围掩盖操作。

四、总结

       本文简单为大家介绍了如何实现海量空间数据的搜索以及详情查看,有些部分会在后续详细介绍,本文仅为框架介绍。

Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏BeJavaGod

使用ztree.js,受益一生,十分钟学会使用tree树形结构插件

看到ztree.js,这几个字眼,毋庸置疑,那肯定就是tree树形结构了,曾经的swing年代有jtree,后来jquery年代有jstree和treeview...

4394
来自专栏Netkiller

高级软件工程师(面试题)

高级软件工程师(面试题) 出题者:netkiller 出处:http://www.netkiller.cn/ 高级软件工程师 下面的面试题不分语言,适用于所有...

3903
来自专栏林冠宏的技术文章

Android 5.0 到 Android 6.0 + 的深坑之一 之 .so 动态库的适配

(原创:https://cloud.tencent.com/developer/user/1148436/activities) 目录:   前序   一,问题...

33910
来自专栏全华班

基于PHP爬虫的博客小程序

小程序后端是基于 Wext-server-thinkphp3.2 实现的数据爬虫,使用 ThinkPHP3.2 框架开发。Wext-server-thinkph...

3451
来自专栏AI2ML人工智能to机器学习

Shiny: R语言来建立开源交互式数据分析微服务的神器

先来说个应用场景: 假设你需要快速Prototype一个数据分析的服务, 而且需要给业务客户一定的自由度来理解数据分析的强大, 例如更换数据, 更换分析手段。 ...

2243
来自专栏SDNLAB

ONOS高可用性和可扩展性实现初探

ONOS的发布直面OpenDaylight 进行挑战,直接将 SDN领域两大阵营(运营商和设备商)的竞争瞬间升级,之所以 ONOS能做到这一点,首先,ONOS的...

2705
来自专栏玉树芝兰

如何用R和API免费获取Web数据?

API是获得Web数据的重要途径之一。想不想了解如何用R调用API,提取和整理你需要的免费Web数据呢?本文一步步为你详尽展示操作流程。

1352
来自专栏UML

数据流程图 (DFD) 示例:食品订购系统

数据流图也称为气泡图。它通常用作创建系统概述的初步步骤,而不需要详细介绍,以后可以将其作为自上而下的分解方式进行详细说明。DFD显示将从系统输入和输出的信息类型...

4847
来自专栏魏琼东

AgileEAS.NET SOA中间件平台更新日志 2015-04-28

     AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平...

1050
来自专栏游戏杂谈

【转】Android开发在路上:少去踩坑,多走捷径

本文是我订阅“腾讯大讲堂”公众帐号时,他们推送的一篇文章,但在腾讯大讲堂官网上我并没有找到这篇文章,不过其它专门“爬”公众号文章的网站倒是有。我觉得写的很不错。...

1193

扫码关注云+社区

领取腾讯云代金券