如果您想要基于H3网格进行高效地空间分析或查询,可以使用Lindorm GanosBase时空服务提供的H3函数。H3函数可以帮助您轻松地处理H3网格编码,例如转换编码类型、查询网格关系、查询网格层级、计算网格之间的距离等。本文介绍Lindorm GanosBase时空服务支持的所有H3函数。
引擎与版本
函数列表
Lindorm GanosBase支持的H3函数如下表所示。
函数功能分类 | 函数 | 说明 |
导入及转换 | 将经纬度或坐标点转换为指定层级的H3网格编码。 | |
将LONG类型的H3网格编码转换为对应的STRING类型。 | ||
将STRING类型的H3网格编码转换为对应的LONG类型。 | ||
输出多边形对象在指定层级下的H3网格编码数组。 | ||
导出 | 输出指定H3网格的多边形边界。 | |
网格判断 | 判断输入的H3网格编码是否合法。 | |
返回输入的H3网格编码的层级。 | ||
判断两个H3网格在空间上是否邻近,若邻近返回 | ||
判断H3Cells(H3网格编码数组)中对应的网格与指定H3网格是否具备包含关系。 | ||
网格操作 | 输入H3网格编码及指定层级,返回在该指定层级下父网格的网格编码。 | |
返回H3网格编码在指定层级下的子网格的网格编码。 | ||
H3 网格查询 | 获取两个H3网格之间的路径。 | |
指定网格距离k,返回与中心网格距离小于等于k的所有H3网格编码数组。 | ||
距离计算 | 返回指定两个H3网格中心点在二维平面上的欧式距离。 | |
返回指定两个H3网格中心点在WGS84坐标系下的球面距离。 |
导入及转换
H3
将经纬度或坐标点转换为指定层级的H3网格编码。
语法
Long H3(Point p)
Long H3(Double lng, Double lat)
Long H3(Point p, Int resolution)
Long H3(Double lng, Double lat, Int resolution)
参数说明
参数 | 说明 |
p | 坐标点,类型为POINT。 |
lng | 经度,类型为DOUBLE。 |
lat | 纬度,类型为DOUBLE。 |
resolution | 网格层级,类型为INT。取值范围为[0~15],默认值为15。 |
示例
SELECT H3(128.2, 20.5) AS H3Cell;
SELECT H3(128.2, 20.5, 15) AS H3Cell;
SELECT H3(ST_MakePoInt(128.2, 20.5)) AS H3Cell;
SELECT H3(ST_MakePoInt(128.2, 20.5),15) AS H3Cell;
以上示例语句返回结果相同,具体如下:
+--------------------+
| H3Cell |
+--------------------+
| 645317832955184368 |
+--------------------+
H3_H3ToString
将LONG类型的H3网格编码转换为对应的STRING类型。若输入NULL或无效的H3网格编码,则返回空字符串。
语法
String H3_H3ToString(Long H3Cell)
参数说明
参数 | 说明 |
H3Cell | H3网格编码,类型为LONG。 |
示例
示例一:将LONG类型的网格编码转换为STRING类型。
SELECT H3_H3ToString(599686042433355775) AS H3Address;
返回结果:
+-----------------+ | H3Address | +-----------------+ | 85283473fffffff | +-----------------+
示例二:判断输入是否有效,如果输入为空或是无效的网格编码,则返回空字符串。
-- 输入无效网格编码 SELECT H3_H3ToString(0) AS H3Address; -- 输入为空 SELECT H3_H3ToString(NULL) AS H3Address;
返回结果:
+-----------+ | H3Address | +-----------+ | | +-----------+
H3_StringToH3
将STRING类型的H3网格编码转换为LONG类型。如果输入空字符串或无效的H3网格字符串,则返回-1
。
语法
Long H3_StringToH3(string H3Cell)
参数说明
参数 | 说明 |
H3Cell | H3网格编码,类型为STRING。 |
示例
示例一:输入STRING类型的H3网格编码,转换为LONG类型后输出。
SELECT H3_StringToH3('85283473fffffff') AS H3Cell;
返回结果:
+--------------------+ | H3Cell | +--------------------+ | 599686042433355775 | +--------------------+
示例二:判断输入是否有效,如果输入为空或是无效的H3网格字符串,则返回
-1
。-- 输入无效的H3网格字符串 SELECT H3_StringToH3('abc') AS H3Cell; -- 输入空字符串 SELECT H3_StringToH3('') AS H3Cell;
返回结果:
+--------+ | H3Cell | +--------+ | -1 | +--------+
H3_PolygonToCells
输出多边形对象在指定层级下的H3网格编码数组。
语法
Set<Long> H3_PolygonToCells(Polygon poly, Int resolution)
参数说明
参数 | 说明 |
poly | 多边形对象,类型为POLYGON。 |
resolution | 网格层级,取值范围为[0~15]。 |
示例
输入合法的多边形对象,指定H3网格层级为9,输出该多边形对象对应的网格编码数组。
SELECT H3_PolygonToCells(ST_GeomFromText('POLYGON((-122.481889 37.826683,-122.479487 37.808548,-122.474150 37.808904,-122.476510 37.826935,-122.481889 37.826683))'), 9) AS polyCells;
返回结果:
+--------------------------------+
| polyCells |
+--------------------------------+
| [617700171225497599, |
| 617700171167825919, |
| 617700171168874495, |
| 617700171167563775, |
| 617700171168612351, |
| 617700171168350207, |
| 617700171177525247, |
| 617700171188011007, |
| 617700171176476671] |
+--------------------------------+
导出
H3_CellToBoundary
输出指定H3网格的多边形边界。若输入为空、NULL或无效的H3网格编码,则返回空数组。
语法
Set<Point> H3_CellToBoundary(Long H3Cell)
Set<Point> H3_CellToBoundary(string H3Cell)
参数说明
参数 | 说明 |
H3Cell | H3网格编码,类型为LONG或STRING。 |
示例
示例一:输入STRING类型的H3网格编码,输出对应H3网格的多边形边界。
SELECT H3_CellToBoundary('85283473fffffff') AS boundary;
返回结果:
+--------------------------------+ | boundary | +--------------------------------+ | [Point (-121.92354999630157 | | 37.42834118609436), Point | | (-122.02910130919003 | | 37.26319797461824), Point | | (-121.91508032705622 | | 37.27135586673191), | | Point (-122.090428929044 | | 37.33755608435299), Point | | (-121.86222328902491 | | 37.353926450852256), | | Point (-122.03773496427027 | | 37.42012867767779)] | +--------------------------------+
示例二:输入LONG类型的H3网格编码,输出对应H3网格的多边形边界。
SELECT H3_CellToBoundary(599686042433355775) AS boundary;
返回结果:
+--------------------------------+ | boundary | +--------------------------------+ | [Point (-121.92354999630157 | | 37.42834118609436), Point | | (-122.02910130919003 | | 37.26319797461824), Point | | (-121.91508032705622 | | 37.27135586673191), | | Point (-122.090428929044 | | 37.33755608435299), Point | | (-121.86222328902491 | | 37.353926450852256), | | Point (-122.03773496427027 | | 37.42012867767779)] | +--------------------------------+
示例三:输入为空、NULL或无效的H3网格编码,返回空数组。
-- 输入为空 SELECT H3_CellToBoundary('') AS boundary; -- 输入NULL SELECT H3_CellToBoundary(NULL) AS boundary; -- 输入无效的H3网格编码 SELECT H3_CellToBoundary(0) AS boundary;
返回结果:
+----------+ | boundary | +----------+ | [] | +----------+
网格判断
H3_IsValidCell
判断输入的H3网格编码是否合法。若合法返回true
,否则返回false
。若输入为空或NULL,返回false
。
语法
boolean H3_IsValidCell(Long H3Cell)
boolean H3_IsValidCell(string H3Cell)
参数说明
参数 | 说明 |
H3Cell | H3网格编码,类型为LONG或STRING。 |
示例
示例一:判断输入的H3网格编码是否合法。以下是输入合法的示例:
-- 输入LONG类型的H3网格编码 SELECT H3_IsValidCell(599686042433355775) AS isValid; -- 输入STRING类型的H3网格编码 SELECT H3_IsValidCell('85283473fffffff') AS isValid;
返回结果:
+---------+ | isValid | +---------+ | true | +---------+
示例二:判断输入的H3网格编码是否合法。以下是输入不合法的示例:
-- 输入LONG类型的H3网格编码 SELECT H3_IsValidCell(12) AS isValid; -- 输入STRING类型的H3网格编码 SELECT H3_IsValidCell('abc') AS isValid;
返回结果:
+---------+ | isValid | +---------+ | false | +---------+
示例三:输入为空或NULL,返回
false
。-- 输入为空 SELECT H3_IsValidCell('') AS isValid; -- 输入NULL SELECT H3_IsValidCell(NULL) AS isValid;
返回结果:
+---------+ | isValid | +---------+ | false | +---------+
H3_GetResolution
返回输入的H3网格编码的层级。
语法
Int H3_GetResolution(Long H3Cell)
Int H3_GetResolution(string H3Cell)
参数说明
参数 | 说明 |
H3Cell | H3网格编码,类型为LONG或STRING。 |
示例
示例一:输入LONG格式的H3网格编码,返回其网格层级。
SELECT H3_GetResolution(599686042433355775) AS resolution;
返回结果:
+------------+ | resolution | +------------+ | 5 | +------------+
示例二:输入STRING格式的H3网格编码,返回其网格层级。
SELECT H3_GetResolution('85283473fffffff') AS resolution;
返回结果:
+------------+ | resolution | +------------+ | 5 | +------------+
H3_AreNeighborCells
判断两个H3网格是否在空间上邻近,若邻近返回true
,否则返回false
。若任意一个编码不合法、为NULL、或两个编码层级不同,则返回false
。
在使用H3_AreNeighborCells
函数前,可以先通过H3_GetResolution
函数查询H3网格的层级。H3_GetResolution
的使用方法,请参见H3_GetResolution。
语法
boolean H3_AreNeighborCells(Long H3Cell1, Long H3Cell2)
boolean H3_AreNeighborCells(string H3Cell1, string H3Cell2)
参数说明
参数 | 说明 |
H3Cell1、H3Cell2 | H3网格编码,类型为LONG或STRING。 |
示例
示例一:输入两个LONG格式的H3网格编码,判断对应的两个H3网格在空间上是否邻近。
SELECT H3_AreNeighborCells(605546022931791871, 605546023066009599) as isNeighbor;
返回结果:
+------------+ | isNeighbor | +------------+ | true | +------------+
示例二:输入两个STRING格式的H3网格编码,判断对应的两个H3网格在空间上是否邻近。
SELECT H3_AreNeighborCells('86754e66fffffff','86754e64fffffff') as isNeighbor;
返回结果:
+------------+ | isNeighbor | +------------+ | true | +------------+
示例三:输入的H3网格编码不合法、输入NULL,或输入的两个H3网格层级不同,返回
false
。-- 输入的H3网格编码不合法 SELECT H3_AreNeighborCells(1234,5678) as isNeighbor; -- 任意一个H3网格编码输入NULL SELECT H3_AreNeighborCells(1234,NULL) as isNeighbor; -- 输入的两个H3网格层级不同,'85283473fffffff'对应的网格层级为5,'87283082bffffff'对应的网格层级为7 SELECT H3_AreNeighborCells('85283473fffffff','87283082bffffff') as isNeighbor;
返回结果:
+------------+ | isNeighbor | +------------+ | false | +------------+
H3_Contains
判断H3Cells(H3网格编码数组)中对应的网格与指定H3网格是否具备包含关系。
假设H3Cells内某个网格编码对应的网格为A
,指定的H3网格为B
。当满足以下任意一个条件时,返回true
:
A
与B
相同。B
是A
的子网格。
若H3网格编码不合法或为NULL,则返回false
。若H3Cells数组内存在不合法网格编码,在计算时会被忽略,不会报错。
语法
boolean H3_Contains(Set<Long> H3Cells, Long H3)
参数说明
参数 | 说明 |
H3Cells | H3网格编码数组。 |
H3 | 指定的H3网格编码。 |
示例
示例一:判断合法的H3Cells中对应的网格与指定H3网格是否具备包含关系。
SELECT H3_Contains(H3_PolygonToCells(ST_GeomFromText('POLYGON((-122.481889 37.826683,-122.479487 37.808548,-122.474150 37.808904,-122.476510 37.826935,-122.481889 37.826683))'), 9),H3(-122.47801264775836, 37.81777525405899)) AS isContained;
返回结果:
+-------------+ | isContained | +-------------+ | true | +-------------+
结果为
true
,表示具备包含关系。示例二:判断合法的H3Cells中对应的网格与指定H3网格是否具备包含关系。
SELECT H3_Contains(H3_PolygonToCells(ST_GeomFromText('POLYGON((-122.481889 37.826683,-122.479487 37.808548,-122.474150 37.808904,-122.476510 37.826935,-122.481889 37.826683))'), 9), 605546022931791871) AS isContained;
返回结果:
+-------------+ | isContained | +-------------+ | false | +-------------+
结果为
false
,表示不具备包含关系。示例三:输入的H3网格编码不合法或为NULL,返回
false
。-- 输入的H3网格编码为NULL SELECT H3_Contains(H3_PolygonToCells(ST_GeomFromText('POLYGON((-122.481889 37.826683,-122.479487 37.808548,-122.474150 37.808904,-122.476510 37.826935,-122.481889 37.826683))'), 9), NULL) AS isContained; -- 输入的H3网格编码不合法 SELECT H3_Contains(H3_PolygonToCells(ST_GeomFromText('POLYGON((-122.481889 37.826683,-122.479487 37.808548,-122.474150 37.808904,-122.476510 37.826935,-122.481889 37.826683))'), 9), 1233453435457) AS isContained;
返回结果:
+-------------+ | isContained | +-------------+ | false | +-------------+
网格操作
H3_CellToParent
输入H3网格编码及指定层级,返回指定层级下父网格的网格编码。
如果输入的网格编码不合法,或输入的层级为当前编码的子级,则返回-1
或空字符串。若给定的层级与当前网格一致,则返回该网格本身。
在H3网格中层级的数字越大代表层级越低,例如层级5是层级0的子级。您可以通过H3_GetResolution
函数查询网格的层级。使用方法,请参见H3_GetResolution。
语法
Long H3_CellToParent(Long H3Cell, Int resolution)
参数说明
参数名称 | 描述 |
H3Cell | H3网格编码,类型为LONG。 |
resolution | 指定的网格层级,取值范围:(0~指定的网格编码的层级]。假设H3Cell的层级为5,则resolution的取值范围为(0~5]。 |
示例
示例一:输入类型为LONG的H3网格编码,返回0层级下所有父网格的网格编码。
SELECT H3_CellToParent(599686042433355775, 0) AS parent;
返回结果:
+--------------------+ | parent | +--------------------+ | 577199624117288959 | +--------------------+
示例二:输入类型为STRING的H3网格编码,返回5层级下所有父网格的网格编码。
SELECT H3_CellToParent(599686042433355775, 5) AS parent;
返回结果:
+--------------------+ | parent | +--------------------+ | 599686042433355775 | +--------------------+
示例三:输入的网格编码不合法或为NULL,或输入的层级为当前编码的子级或NULL,返回
-1
。-- 输入的网格编码不合法 SELECT H3_CellToParent(123, 5) AS parent; -- 输入的层级为当前编码的子级 SELECT H3_CellToParent(599686042433355775, 9) AS parent; -- 输入的层级为NULL SELECT H3_CellToParent(599686042433355775, NULL) AS parent; -- 输入的网格编码和层级同时为NULL SELECT H3_CellToParent(NULL, NULL) AS parent;
返回结果:
+--------+ | parent | +--------+ | -1 | +--------+
H3_CellToChildren
返回H3网格编码在指定层级的所有子网格编码数组。
如果输入的网格编码不合法、或输入的层级为当前编码的父级或其本身的层级,则返回空数组。
在H3网格中层级的数字越大代表层级越低,例如层级5是层级0的子级。您可以通过H3_GetResolution
函数查询网格的层级。使用方法,请参见H3_GetResolution。
语法
Set<Long> H3_CellToChildren(Long H3Cell, Int resolution)
Set<String> H3_CellToChildren(string H3Cell, Int resolution)
参数说明
参数名称 | 描述 |
H3Cell | H3网格编码,类型为LONG或STRING。 |
resolution | 指定的网格层级,取值范围:(指定的网格编码的层级~15]。假设H3Cell的层级为5,则resolution的取值范围为(5~15]。 |
示例
示例一:输入类型为LONG的H3网格编码,指定网格层级为6,返回在该层级下所有子网格的网格编码。
SELECT H3_CellToChildren(599686042433355775, 6) AS children;
返回结果:
+--------------------------------+ | children | +--------------------------------+ | [604189641121202175, | | 604189641255419903, | | 604189641389637631, | | 604189641523855359, | | 604189641658073087, | | 604189641792290815, | | 604189641926508543] | +--------------------------------+
示例二:输入类型为STRING的H3网格编码,指定网格层级为6,返回在该层级下所有子网格的网格编码。
SELECT H3_CellToChildren('85283473fffffff', 6) AS children;
返回结果:
+--------------------------------+ | children | +--------------------------------+ | [86283470fffffff, | | 862834727ffffff, | | 862834737ffffff, | | 862834707ffffff, | | 862834717ffffff, | | 86283471fffffff, | | 86283472fffffff] | +--------------------------------+
示例三:输入的网格编码不合法,或给定的层级为当前编码的父级或其本身的层级,返回空数组。
-- 输入的网格编码不合法 SELECT H3_CellToChildren(0,15) AS children; -- 给定的层级为当前编码的父级 SELECT H3_CellToChildren('85283473fffffff', 3) AS children; -- 给定的层级为当前编码的层级 SELECT H3_CellToChildren('85283473fffffff', 5) AS children;
返回结果:
+----------+ | children | +----------+ | [] | +----------+
网格查询
H3_GridPathCells
获取两个指定H3网格之间的H3网格路径,包含起点及终点的两个H3网格。如果输入的H3网格编码不合法,返回空数组;如果输入的两个编码精度不同,返回null
。
语法
Set<Long> H3_GridPathCells(Long startCell, Long endCell)
Set<String> H3_GridPathCells(String startCell, String endCell)
参数说明
参数名称 | 描述 |
startCell | 起点H3网格编码,类型为LONG或STRING。 说明 startCell的类型必须与endCell保持一致。 |
endCell | 终点H3网格编码,类型为LONG或STRING。 说明 endCell的类型必须与startCell保持一致。 |
示例
示例一:输入两个H3网格编码,返回两个网格之间的路径。
SELECT H3_GridPathCells(H3(123.1, 25.1, 8),H3(123.2, 25.2, 8)) AS pathCell;
返回结果:
+--------------------------------+ | pathCell | +--------------------------------+ | [613820806174081023, | | 613820806136332287, | | 613820806132137983, | | 613820806325075967, | | 613820789795323903, | | 613820789791129599, | | 613820789942124543, | | 613820806163595263, | | 613820806327173119, | | 613820806314590207, | | 613820789986164735, | | 613820789981970431, | | 613820789944221695, | | 613820789940027391, | | 613820789969387519, | | 613820789965193215, | | 613820789709340671, | | 613820789705146367] | +--------------------------------+
示例二:输入的H3网格编码不合法,返回空数组。
SELECT H3_GridPathCells(587769229395099647, 123) as pathCell;
返回结果:
+----------+ | pathCell | +----------+ | [] | +----------+
示例三:输入的两个网格编码层级不同,返回
null
。-- 两个网格编码层级不同,587769229395099647的层级为2,599686042433355775的层级为5 SELECT H3_GridPathCells(587769229395099647, 599686042433355775) as pathCell;
返回结果:
+----------+ | pathCell | +----------+ | null | +----------+
H3_GridDisk
输入指定H3网格编码和网格距离k,返回该层级下与指定网格距离小于等于k的所有H3网格编码数组。假设输入网格为A
,指定k=1
,则返回以A为中心的外一圈网格及A网格本身;指定k=2
,则返回以A为中心的外两圈网格及A网格本身,以此类推。
如果输入的H3网格编码为NULL或不合法,则返回空数组。如果输入的网格距离k为0,则返回网格本身。
语法
Set<Long> H3_GridDisk(Long H3Cell, Int k)
Set<String> H3_GridDisk(String H3Cell, Int k)
参数说明
参数名称 | 描述 |
H3Cell | H3网格编码,类型为LONG或STRING。 |
k | 网格距离。 |
示例
示例一:返回与中心网格距离小于等于1的所有网格编码。
SELECT H3_GridDisk(599686042433355775, 1) AS grid;
返回结果:
+--------------------------------+ | grid | +--------------------------------+ | [599686015589810175, | | 599686014516068351, | | 599686038138388479, | | 599686042433355775, | | 599686044580839423, | | 599686043507097599, | | 599686030622195711] | +--------------------------------+
示例二:指定距离为0,返回网格本身。
SELECT H3_GridDisk(599686042433355775, 0) AS grid;
返回结果:
+----------------------+ | grid | +----------------------+ | [599686042433355775] | +----------------------+
示例三:输入的H3网格为NULL或不合法,返回空数组。
-- 输入的H3网格编码为NULL SELECT H3_GridDisk(NULL, 0) AS grid; -- 输入的H3网格编码不合法 SELECT H3_GridDisk(123456, 0) AS grid;
返回结果:
+------+ | grid | +------+ | [] | +------+
距离计算
H3_Distance
返回指定两个H3网格中心点在二维平面上的欧式距离。如果输入的H3网格编码为NULL或不合法、或两个网格的层级不同,返回-1
。
语法
Double H3_Distance(Long startCell, Long endCell)
Double H3_Distance(String startCell, String endCell)
参数说明
参数名称 | 描述 |
startCell | 起点H3网格编码,类型为LONG或STRING。 说明 startCell和endCell的类型必须保持一致。 |
endCell | 终点H3网格编码,类型为LONG或STRING。 说明 endCell和startCell的类型必须保持一致。 |
示例
示例一:输入两个类型为LONG的H3网格编码,返回网格中心点在二维平面上的欧式距离。
SELECT H3_distance(587769229395099647, 587026509290536959) as distance;
返回结果:
+-------------------+ | distance | +-------------------+ | 4.489061432072522 | +-------------------+
示例二:输入两个类型为STRING的H3网格编码,返回网格中心点在二维平面上的欧式距离。
SELECT H3_distance('825897fffffffff','8282cffffffffff') as distance;
返回结果:
+-------------------+ | distance | +-------------------+ | 4.489061432072522 | +-------------------+
示例三:输入的H3网格编码为NULL或不合法、或两个网格的层级不同,返回
-1
。-- 输入的H3网格编码不合法 SELECT H3_distance(587769229395099647, 345) AS distance; -- 输入的H3网格编码为NULL SELECT H3_distance(587769229395099647, NULL) AS distance; -- 输入的两个H3网格层级不同,587769229395099647的层级为2,599686042433355775的层级为5 SELECT H3_distance(587769229395099647, 599686042433355775) AS distance;
返回结果:
+----------+ | distance | +----------+ | -1 | +----------+
H3_DistanceSphere
返回指定两个H3网格中心点在WGS84坐标系下的球面距离,单位为米(m)。如果输入的H3网格编码为NULL或不合法、或两个网格的层级不同,返回-1
。
语法
Double H3_DistanceSphere(Long startCell, Long endCell)
Double H3_DistanceSphere(String startCell, String endCell)
参数说明
参数名称 | 描述 |
startCell | 起点H3网格编码,类型为LONG或STRING。 说明 startCell和endCell的类型必须保持一致。 |
endCell | 终点H3网格编码,类型为LONG或STRING。 说明 endCell和startCell的类型必须保持一致。 |
示例
示例一:输入两个类型为LONG的H3网格编码,返回网格中心点在WGS84坐标系下的球面距离。
SELECT H3_DistanceSphere(587769229395099647, 587026509290536959) as distance;
返回结果:
+--------------------+ | distance | +--------------------+ | 497180.06581361144 | +--------------------+
示例二:输入两个类型为STRING的H3网格编码,返回网格中心点在WGS84坐标系下的球面距离。
SELECT H3_DistanceSphere('825897fffffffff','8282cffffffffff') as distance;
返回结果:
+--------------------+ | distance | +--------------------+ | 497180.06581361144 | +--------------------+
示例三:输入的H3网格编码为NULL或不合法、或两个网格的层级不同,返回
-1
。-- 输入的H3网格编码不合法 SELECT H3_DistanceSphere(587769229395099647, 345) AS distance; -- 输入的H3网格编码为NULL SELECT H3_DistanceSphere(587769229395099647, NULL) AS distance; -- 输入的两个网格层级不同,587769229395099647的层级为2,599686042433355775的层级为5 SELECT H3_DistanceSphere(587769229395099647, 599686042433355775) AS distance;
返回结果:
+----------+ | distance | +----------+ | -1 | +----------+