分享

空间属性一体化全文检索方案:5.ES对空间数据的支持以及优化方案

 godxiasad 2023-04-21 发布于北京

前文再续,书接上一回。



本节重点提要:

1、ES对于空间查询的优化模型。

2、ES对于投影坐标系的使用原则。

上一节讲了ES的基本概念,最后也讲了一下关于ES对属性数据的存储结构,那么今天我们来讲讲ES对空间数据的支持。

既然我们叫做空间属性一体化的全文检索,肯定就需要有空间查询的能力,而ES本身就具备这种能,使我们无需再使用额外的GIS软件。

不过与传统和专业的GIS相比,ES对空间数据的支持还是有一些不同的。最主要的就是空间数据在ES中,并非以矢量坐标的方式来存在,而是以geohash字符串的形式来存储和计算的。而geohash最显著的特点,就是只能使用地理坐标系,不能支持投影坐标系。有关geohash的简介,我们后面还会继续说到,而如何使用投影坐标系的问题,后面也会有讲到。

ES大空间存储模式,分成两大类,一类是专门用来存储点的,因为我们以前说过,有99%的LBS数据都是以点模式来表达的,所以ES专门为点划分了一种存储模式,这种模式在非专业GIS领域里面,也占到了绝大多数的份额。

第二大类就是所谓的几何类型了,包括了多点、线、圆、多边形、多部件要素几类,如果熟悉GDAL/OGR的同学,可能对这些术语就很熟悉了,没错,ES的空间属性,参考的就是GDAL/OGR,准确来说,应该是参考JTS的。

点要素就只存储经度/纬度,这个非常好理解,那么我们下面来看看,ES对于比较专业的GIS几何要素是怎么存储的。

下面我们用GeoJSON对ES的几何模型就行对比,实际上可以看出,ES与GeoJSON几乎是一样的,采用JSON模式来对空间数据进行存储。

Geo_Shape与GeoJSON不同的地方,是ES的Geo_Shape多出了两种类型,一个是所谓矩形(envelope),在ES里面,矩形仅需要存储两个坐标(左下、右上),而在GeoJSON里面,矩形是作为几何类型存在的,需要存储五个坐标点(四个坐标,最后一个坐标与第一个坐标重合,形成封闭多边形)

然后还有就是圆,ES里面,圆仅需要存储一个点和一个属性即可。

ES的空间查询,并非采用传统的空间索引,而用的是GeoHash算法。

Geohash是一种特殊的编码方式,它可以把一组坐标串编码成一串hash编码,这个hash编码的长度决定了索引的精度,最长可以到达12位,误差小于2厘米。

geohash的原理实际上就是等于把地球画成若干网格,每一级编码,下面的网格是上一级网格的四倍,每个网格都有独立的编号,下一级网格的前N位直接继承上一级网格。

那么如果两个坐标对的前N位相同,则表示,在第N级网格的时候,这两个坐标对在同一个网格里面。

所以GEOHASH可以很快的计算出两个点的距离以及点与面的包含

但是在进行geohash编码的时候,精度与开销是成正比的,精度越高,开销越大,而且下一级的开销是上一级的2的n次倍。所以在定义ES的空间字段存储结构的时候,可以适当的放宽(比如精度设置为1米),这样在查询的时候保存较高的精度的时候,也有有效的节约不少内存。

对于点来说,组成点的一个坐标对,会被编码成1个geohash字符串,而对于线和面来说,这个挑战就大很多了。

我们都知道,线是由一连串的点所有构成的,而面是由一连串的封闭的点构成的,比如我们要存储山东省的行政区划,山东省的行政区划详细的情况下,总共由45000多个节点所构成,那么把这个面要素存储到ES中,就不是一条索引记录,而对应的是四万五千多条索引记录。

依此类推,如果我们要做是地类图斑的这种面存储,最后解构出来的存储空间,就是以结点数来论的,这将成为一个巨大的开销。

所以,我们可以针对面状要素进行一定的优化,下面是比较常见的四种优化方案:

1、中心点模式。也就是把整个面的中心点取出来,作为这个面要素的空间位置所在,查询的时候,查询区间框中了这个中心点,才命中这个面要素。

这种模式,在处理海量小地块的模式下,常见,比如一个地块也就几个平方米(几十),空间查询的时候框中边界节点和中心点几乎没有区别,所以就不用完整的存储每个节点了,存储中心点即可。这样几乎节约了99%的系统开销,把一个面要素就变成了一个点。

2、外接矩形模式。也就是计算这个面要素的外接矩形,把这个矩形存储在空间字段里面,查询的时候,框中这个矩形,就算命中。

这种模式在处理比较规则的面要素的时候,效果会很好,而且存储量也小,矩形在ES里面仅需要存储两个坐标对。但是对于不规则的图形的时候,效果不是很高。

3、外接多边形模式(凸包),这种情况可以尽量的减少需要存储的点,而且也能尽量保留多边形的几何特征。

这种模式在大部分情况下,都兼顾了精确和系统开销,是比较常用的一种方式。

4、抽稀模式,这种模型,对面要素进行节点抽稀,根据抽稀的比例阈值,是一种最大限度保留几何特征的方式。

最后就是全要素模式,这种模式在数据库里面常见,但是在ES里面我们需要尽量避免,因为冗余量太大了,会严重影响我们的系统查询性能。

在实际项目中,根据经验,一般建议是采用包络矩形、包络多边形和抽稀模式三种来处理面要素。

线要素就没有这么多选择了……一般就是选择节点抽稀模式,根据需求,确定抽稀的阈值。

最后,我们看看专业GIS用户比较关心的投影坐标系的问题。

在ES里面,本身不支持投影坐标系(以前有说正在解决,不过都解决到7.9版本了,还没有影子,大家也就都放弃等待了)。

我们先来看看投影坐标系是干嘛的——一句话说透:投影坐标系主要是用于精确的空间测量,因为把球面投影到平面上之后,投影坐标系里面的长度、角度、面积就是恒定,不会因为位置不同产生变形。

那么在全文检索里面,我们是否有非常精确的空间测量需求呢?答案是没有,或者说很少有,就算遇上了精确测量需求的时候,我们也去依托真实数据和后台GIS引擎来实现,ES本身作为查询引擎,没有这个需求(普通测量分析,用测地线模型,误差个几十厘米,也就无所谓了)。

所以,如果你的数据的投影坐标系的,要在ES中使用,首先就要转换为地理坐标系,因为每个投影坐标系后面一定是依托一个地理坐标系的,所以这个问题不大。

把空间信息转换为地理坐标系之后,就可以用于在ES中进行查询了,之后我们可以把原始的投影坐标系直接存储成一个不分词、不做索引的完整字符串,这样查询命中之后,直接取出这个字符串来,在GIS中就可以直接重构出这样一个空间对象了。

这就是ES对投影空间数据的使用原则。

预知后事如何,请听下回分解。

最后还是广告:

有需要的详细咨询了解其中的一些关键的技术细节的同学,可以与虾神单独联系。

联系方式:关注公众号,然后发送2,获取虾神的个人邮箱。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多