12.16.10 空间 Geohash 函数
Geohash 是用于将任意精度的纬度和经度坐标编码为文本字符串的系统。 Geohash 值是仅包含从"0123456789bcdefghjkmnpqrstuvwxyz"
中选择的字符的字符串。
本节中的功能使您能够操纵 geohash 值,从而为应用程序提供导入和导出 geohash 数据以及索引和搜索 geohash 值的功能。
ST_GeoHash(经度,纬度,最大长度), ST_GeoHash(point, max_length)
返回连接字符集和排序规则中的 geohash 字符串。
如果任何参数为NULL
,则返回值为NULL
。如果任何参数无效,则会发生错误。
对于第一种语法,* longitude
必须是[-180,180]范围内的数字,而 latitude
*必须是[-90,90]范围内的数字。对于第二种语法,需要POINT
值,其中 X 和 Y 坐标分别在经度和纬度的有效范围内。
结果字符串不超过* max_length
字符(上限为 100)。该字符串可能比 max_length
字符短,这是因为创建 geohash 值的算法会 continue 进行,直到创建的字符串完全相同为止位置的 table 示形式或 max_length
*字符,以先到者为准。
mysql> SELECT ST_GeoHash(180,0,10), ST_GeoHash(-180,-90,15);
+----------------------+-------------------------+
| ST_GeoHash(180,0,10) | ST_GeoHash(-180,-90,15) |
+----------------------+-------------------------+
| xbpbpbpbpb | 000000000000000 |
+----------------------+-------------------------+
ST_LatFromGeoHash(geohash_str)
从 geohash 字符串值返回纬度,以[_90,90]范围内的DOUBLE值形式。
如果参数为NULL
,则返回值为NULL
。如果参数无效,则会发生错误。
ST_LatFromGeoHash()解码功能从* geohash_str
*参数中读取的字符数不超过 433 个。这代 table 了坐标值内部 table 示中信息的上限。超过 433rd 的字符将被忽略,即使它们是非法的并产生错误。
mysql> SELECT ST_LatFromGeoHash(ST_GeoHash(45,-20,10));
+------------------------------------------+
| ST_LatFromGeoHash(ST_GeoHash(45,-20,10)) |
+------------------------------------------+
| -20 |
+------------------------------------------+
ST_LongFromGeoHash(geohash_str)
从 geohash 字符串值返回经度,以[_180,180]范围内的DOUBLE值形式。
如果参数为NULL
,则返回值为NULL
。如果参数无效,则会发生错误。
ST_LatFromGeoHash()的描述中有关从* geohash_str
*参数处理的最大字符数的说明也适用于ST_LongFromGeoHash()。
mysql> SELECT ST_LongFromGeoHash(ST_GeoHash(45,-20,10));
+-------------------------------------------+
| ST_LongFromGeoHash(ST_GeoHash(45,-20,10)) |
+-------------------------------------------+
| 45 |
+-------------------------------------------+
ST_PointFromGeoHash(geohash_str, srid)
给定 geohash 字符串值,返回包含已解码 geohash 值的POINT
值。
该点的 X 坐标和 Y 坐标分别是[-180,180]范围内的经度和[-90,90]范围内的纬度。
如果任何参数为NULL
,则返回值为NULL
。如果任何参数无效,则会发生错误。
srid
*参数是一个无符号的 32 位整数。
ST_LatFromGeoHash()的描述中有关从* geohash_str
*参数处理的最大字符数的说明也适用于ST_PointFromGeoHash()。
mysql> SET @gh = ST_GeoHash(45,-20,10);
mysql> SELECT ST_AsText(ST_PointFromGeoHash(@gh,0));
+---------------------------------------+
| ST_AsText(ST_PointFromGeoHash(@gh,0)) |
+---------------------------------------+
| POINT(45 -20) |
+---------------------------------------+