14.16.10 空间 Geohash 函数
Geohash 是一种将任意精度的经度和纬度坐标编码为文本字符串的系统。Geohash 值是包含来自 "0123456789bcdefghjkmnpqrstuvwxyz"
的字符串。
本节中的函数使应用程序能够导入和导出 Geohash 数据,并对 Geohash 值进行索引和搜索。
除非另有指定,函数在本节中将其几何形状参数处理如下:
-
如果任何参数为
NULL
,则返回值为NULL
。 -
如果任何参数无效,发生错误。
-
如果任何参数的经度或纬度超出范围,发生错误:
-
如果经度值不在(−180,180]范围内,发生
ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE
错误。 -
如果纬度值不在 [−90,90]范围内,发生
ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE
错误。
显示的范围是以度为单位。实际范围略有不同,因为使用浮点数进行了算术运算。
-
-
如果任何点参数不具有 SRID 0 或 4326,发生
ER_SRS_NOT_FOUND
错误。point
参数 SRID 无效性不被检查。 -
如果任何 SRID 参数引用了未定义的空间参考系统(SRS),发生
ER_SRS_NOT_FOUND
错误。 -
如果任何 SRID 参数超出 32 位无符整数范围,发生
ER_DATA_OUT_OF_RANGE
错误。 -
否则,返回值不是
NULL
。
这些 Geohash 函数可用:
-
ST_GeoHash(
,longitude
,latitude
,max_length
)ST_GeoHash(
point
,max_length
)返回一个在连接字符集和排序规则中的 Geohash 字符串。
对于第一个语法,
longitude
必须是一个在 [−180,180]范围内的数字,latitude
必须是一个在 [−90,90]范围内的数字。对于第二个语法,需要一个POINT
值,其中 X 和 Y 坐标在经度和纬度的有效范围内,分别。生成的字符串不超过
max_length
个字符,这个限制为100个字符。字符串可能比max_length
个字符短,因为创建地理哈希值的算法继续运行,直到创建一个字符串,该字符串是地理位置的exact表示或max_length
个字符的 whichever comes first。ST_GeoHash()
将其参数按照本节介绍中描述的方式处理。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
)从地理哈希字符串值中返回latitude,作为一个在[-90,90]范围内的双精度浮点数。
函数
ST_LatFromGeoHash()
从geohash_str
参数中读取最多433个字符,这是坐标值内部表示中的信息上限。超过433个字符的将被忽略,即使它们是非法的并且会产生错误。ST_LatFromGeoHash()
将其参数按照本节介绍中描述的方式处理。mysql> SELECT ST_LatFromGeoHash(ST_GeoHash(45,-20,10)); +------------------------------------------+ | ST_LatFromGeoHash(ST_GeoHash(45,-20,10)) | +------------------------------------------+ | -20 | +------------------------------------------+
-
ST_LongFromGeoHash(
geohash_str
)从地理哈希字符串值中返回longitude,作为一个在[-180,180]范围内的双精度浮点数。
关于
ST_LatFromGeoHash()
的描述中提到的最大字符数限制也适用于ST_LongFromGeoHash()
。ST_LongFromGeoHash()
将其参数按照本节介绍中描述的方式处理。mysql> SELECT ST_LongFromGeoHash(ST_GeoHash(45,-20,10)); +-------------------------------------------+ | ST_LongFromGeoHash(ST_GeoHash(45,-20,10)) | +-------------------------------------------+ | 45 | +-------------------------------------------+
-
ST_PointFromGeoHash(
geohash_str
,srid
)返回一个
POINT
值,包含解码的地理哈希值。点的X和Y坐标是longitude在[-180,180]范围内和latitude在[-90,90]范围内,分别。
参数
srid
是一个32位无符号整数。关于
ST_LatFromGeoHash()
的描述中提到的最大字符数限制也适用于ST_PointFromGeoHash()
。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) | +---------------------------------------+