Geohash 是一个将任意精度的经纬度坐标编码为文本字符串的系统。Geohash 值是仅包含从 "0123456789bcdefghjkmnpqrstuvwxyz" 中选择的字符的字符串。
本节中的函数允许操作 geohash 值,这为应用程序提供了导入和导出 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个字符,因为创建 geohash 值的算法会一直运行,直到它创建的字符串是位置的精确表示或max_length个字符,以先到者为准。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)从 geohash 字符串值返回纬度,作为范围 [−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)从 geohash 字符串值返回经度,作为范围 [−180, 180] 内的双精度数字。
关于
ST_LatFromGeoHash()的描述中关于从geohash_str参数中处理的最大字符数的说明也适用于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)返回一个包含解码的 geohash 值的
POINT值,给定一个 geohash 字符串值。点的 X 和 Y 坐标分别是范围 [−180, 180] 内的经度和范围 [−90, 90] 内的纬度。
srid参数是一个 32 位无符号整数。关于
ST_LatFromGeoHash()的描述中关于从geohash_str参数中处理的最大字符数的说明也适用于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) | +---------------------------------------+