什么是地理空间数据?
地理空间数据是与地理空间实体有关的信息,例如点,线和多边形。
Nebulagraph 2.6支持地理空间数据。您可以在Nebulagraph中存储,计算和检索地理空间数据。地理是Nebulagraph支持的数据类型。它由代表地理空间数据的纬度和经度组成。
如何在Nebulagraph中使用地理空间数据?
创建模式
以下示例显示了如何创建标签。您可以以相同的方式创建边缘类型。
Nebulagraph当前支持三种类型的地理空间数据:点,Linestring和多边形。以下显示了如何创建地理类型以及如何插入地理空间数据。
CREATE TAG any_shape(geo geography);
CREATE TAG only_point(geo geography(point));
CREATE TAG only_linestring(geo geography(linestring));
CREATE TAG only_polygon(geo geography(polygon));
当未指定地理类型时,这意味着您可以存储任何类型的数据;指定类型时,这意味着只能存储该类型的地理空间数据,例如geography (point)
,这意味着您只能存储点的空间信息。
插入数据
在any_shape
标签的geo
列中插入数据。
INSERT VERTEX any_shape(geo) VALUES "101":(ST_GeogFromText("POINT(120.12 30.16)"));
INSERT VERTEX any_shape(geo) VALUES "102":(ST_GeogFromText("LINESTRING(3 8, 4.7 73.23)"));
INSERT VERTEX any_shape(geo) VALUES "103":(ST_GeogFromText("POLYGON((75.3 45.4, 112.5 53.6, 122.7 25.5, 93.9 28.6, 75.3 45.4))"));
在only_point
标签的geo
列中插入数据。
INSERT VERTEX only_point(geo) VALUES "201":(ST_Point(120.12,30.16)"));;
在only_linestring
标签的geo
列中插入数据。
INSERT VERTEX only_linestring(geo) VALUES "302":(ST_GeogFromText("LINESTRING(3 8, 4.7 73.23)"));
在only_polygon
标签的geo
列中插入数据。
INSERT VERTEX only_polygon(geo) VALUES "403":(ST_GeogFromText("POLYGON((75.3 45.4, 112.5 53.6, 122.7 25.5, 93.9 28.6, 75.3 45.4))"));
当插入的数据不符合指定类型的要求时,数据插入失败。
(root@nebula) [geo]> INSERT VERTEX only_polygon(geo) VALUES "404":(ST_GeogFromText("POINT((75.3 45.4))"));
[ERROR (-1005)]: Wrong value type: ST_GeogFromText("POINT((75.3 45.4))")
我们可以看到地理空间数据插入方法相当特殊,并且与插入基本类型(例如int
,string
和bool
)的插入非常不同。
让我们以ST_GeogFromText("POINT(120.12 30.16)")
为例,ST_GeogFromText
是一个地理位置信息解析功能,它接受WKT中的地理位置数据的字符串类型(著名文本)标准格式。
POINT(120.12 30.16)
代表一个地理点,其经度为120°12,而纬度为30°16。 ST_GeogFromText
函数解析并从WKT参数构建地理数据对象,然后INSERT
语句将其存储在WKB(著名的二进制)标准中的Nebulagraph中。
地理空间功能
nebulagraph支持的地理空间功能可以分为以下主要类别:
-
构建功能
-
ST_Point(longitude, latitude)
:基于纬度和经度对构建一个geography point
对象。
-
-
解析功能
-
ST_GeogFromText(wkt_string)
:解析wkt文本的geography
对象。 -
ST_GeogFromWKB(wkb_string)
:从WKB文本中解析geography
对象。 #尚未支持,因为Nebulagraph尚未支持二进制字符串。
-
-
格式设置功能
-
ST_AsText(geography)
:以WKT文本格式输出geography
对象。 -
ST_AsBinary(geography)
:以WKB文本格式输出geography
对象。 #尚未支持,因为Nebulagraph尚未支持二进制字符串。
-
-
转换功能
-
ST_Centroid(geography)
:计算geography
对象的重心,这是geography point
对象。
-
-
谓词函数
-
ST_Intersects(geography_1, geography_2)
:确定两个geography
是否相交。 -
ST_Covers(geography_1, geography_2)
:确定第一个geography
对象是否完全覆盖了第二个。 -
ST_CoveredBy(geography_1, geography_2)
:st_covers的倒数。 -
ST_DWithin(geography_1, geography_2, distance_in_meters)
:确定两个geography
对象之间的最短距离是否小于给定的距离。
-
-
公制函数
-
ST_Distance(geography_1, geography_2)
:计算两个geography
对象之间的距离。
-
这些功能接口遵循OpenGIS简单功能访问和ISO SQL/MM标准。有关详细信息,请参见NebulaGraph doc。
地理空间指数
什么是地理空间索引?
地理空间索引是索引,可用于基于谓词ST_Intersects
和ST_Covers
函数快速过滤数据。
Nebulagraph使用Google S2库作为地理空间索引。
S2库将地球的表面投射到切线正方形,然后递归四倍的平方表面四倍,并使用填充空间曲线,即希尔伯特曲线,以连接这些小方形晶格的中心。<<<<<<<<<<<<<<<<< /p>
当n无限大时,此希尔伯特曲线几乎填满了正方形。
S2库使用订单30的希尔伯特曲线。
下图显示地球充满了希尔伯特曲线。
可以看出,这些希尔伯特曲线将地球表面分为细胞。对于地球表面上的任何地理形状,例如城市,河流或人的位置,我们可以使用其中几个细胞完全覆盖地理形状。
每个单元通过唯一的INT64细胞识别。因此,地理对象的空间索引是构建以完全覆盖地理形状的S2单元的集合。
构造地理空间对象的索引时,构造了完全覆盖索引对象的不同S2单元的集合。基于空间谓词函数的索引查询通过在覆盖查询对象的一组S2单元与覆盖索引对象的S2单元之间找到相交来迅速过滤大量无关的地理对象。
。 创建地理索引
CREATE TAG any_shape_geo_index on any_shape(geo)
对于带有point
类型的地理空间数据,它可以由30顺序的S2单元表示,因此一个点对应于一个索引条目。对于使用inestring
类型和polygon
的地理空间数据,我们使用多个不同级别的S2单元格来覆盖它,因此它将对应于多个索引条目。
空间索引用于加快所有地理谓词的查找,例如:
LOOKUP ON any_shape WHERE ST_Intersects(any_shape.geo, ST_GeogFromText("LINESTRING(3 8, 4.7 73.23)"));
当any_shape
的geo
列上没有空间索引时,此语句将首先将any_shape
的所有数据读取到内存中,然后使用它来计算它是否与点(3.0,8.0)相交,这通常是更多昂贵的。当any_shape
中的数据量很大时,计算开销将是不可接受的。
当any_shape
的geo
列具有空间索引时,该语句将首先使用空间索引来滤除该行相交的大多数数据,但是当读取内存,读取中时,仍然会有一些数据可能会相交。因此,仍然还有一个计算要做。这样,空间索引迅速滤除了大多数不太可能以较小成本相交的数据,并且很小的百分比被过滤,从而大大降低了计算开销。