地理空间¶
地理空间(GEOGRAPHY)是由经纬度构成的表示地理空间信息的数据类型。NebulaGraph当前支持简单地理要素中的 Point、LineString 和 Polygon 三种地理形状。支持 SQL-MM 3 中的部分核心 geo 解析、构造、格式设置、转换、谓词和度量等函数。
GEOGRAPHY¶
GEOGRAPHY 的基本类型是点,由经纬度确定一个点,例如"POINT(3 8)"
表示经度为3°
,纬度为8°
。多个点可以构成线段或多边形。
类型 | 示例 | 说明 |
---|---|---|
Point | "POINT(3 8)" |
点类型 |
LineString | "LINESTRING(3 8, 4.7 73.23)" |
线段类型 |
Polygon | "POLYGON((0 1, 1 2, 2 3, 0 1))" |
多边形类型 |
Note
请勿直接插入上述类型的 GEOGRAPHY 数据,例如INSERT VERTEX any_shape(geo) VALUES "1":("POINT(1 1)")
,需要使用 geo 函数指定数据类型后才能插入,例如INSERT VERTEX any_shape(geo) VALUES "1":(ST_GeogFromText("POINT(1 1)"));
。
示例¶
//创建 Tag,允许存储任意形状地理空间数据类型。
nebula> CREATE TAG IF NOT EXISTS any_shape(geo geography);
//创建 Tag,只允许存储点形状地理空间数据类型。
nebula> CREATE TAG IF NOT EXISTS only_point(geo geography(point));
//创建 Tag,只允许存储线段形状地理空间数据类型。
nebula> CREATE TAG IF NOT EXISTS only_linestring(geo geography(linestring));
//创建 Tag,只允许存储多边形形状地理空间数据类型。
nebula> CREATE TAG IF NOT EXISTS only_polygon(geo geography(polygon));
//创建 Edge type,允许存储任意形状地理空间数据类型。
nebula> CREATE EDGE IF NOT EXISTS any_shape_edge(geo geography);
//创建存储多边形地理空间的点。
nebula> INSERT VERTEX any_shape(geo) VALUES "103":(ST_GeogFromText("POLYGON((0 1, 1 2, 2 3, 0 1))"));
//创建存储多边形地理空间的边。
nebula> INSERT EDGE any_shape_edge(geo) VALUES "201"->"302":(ST_GeogFromText("POLYGON((0 1, 1 2, 2 3, 0 1))"));
//查询点 103 的属性 geo。
nebula> FETCH PROP ON any_shape "103" YIELD ST_ASText(any_shape.geo);
+---------------------------------+
| ST_ASText(any_shape.geo) |
+---------------------------------+
| "POLYGON((0 1, 1 2, 2 3, 0 1))" |
+---------------------------------+
//查询边 201->302 的属性 geo。
nebula> FETCH PROP ON any_shape_edge "201"->"302" YIELD ST_ASText(any_shape_edge.geo);
+---------------------------------+
| ST_ASText(any_shape_edge.geo) |
+---------------------------------+
| "POLYGON((0 1, 1 2, 2 3, 0 1))" |
+---------------------------------+
//为 geo 属性创建索引并使用 LOOKUP 查询。
nebula> CREATE TAG INDEX IF NOT EXISTS any_shape_geo_index ON any_shape(geo);
nebula> REBUILD TAG INDEX any_shape_geo_index;
nebula> LOOKUP ON any_shape YIELD ST_ASText(any_shape.geo);
+---------------------------------+
| ST_ASText(any_shape.geo) |
+---------------------------------+
| "POLYGON((0 1, 1 2, 2 3, 0 1))" |
+---------------------------------+
为 geo 属性创建索引时,还可以指定 geo 索引的参数。说明如下。
参数 | 默认值 | 说明 |
---|---|---|
s2_max_level |
30 |
S2 cell 用于填充的最大等级。取值:1 ~30 。设置为小于默认值时,意味着会使用较大的单元格进行填充。 |
s2_max_cells |
8 |
S2 cell 用于填充的最大数量,可以限制填充时的工作量。取值:1 ~30 。对于复杂形状的区域(例如细矩形),可以使用更大的值。 |
Note
指定如上两个参数对 Point 类型属性没有影响,Point 类型属性的s2_max_level
强制为30
。
nebula> CREATE TAG INDEX IF NOT EXISTS any_shape_geo_index ON any_shape(geo) with (s2_max_level=30, s2_max_cells=8);
更多索引说明请参见索引介绍。
最后更新:
January 31, 2024