spatial-geohash-functions.md 6.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
### 12.17.10 空间 Geohash 函数

Geohash 是一种用于将任意精度的经纬度坐标编码为文本字符串的系统。Geohash 值是仅包含从以下选项中选择的字符的字符串`“0123456789bcdefghjkmnpqrstuvwxyz”`.

本节中的函数支持对 geohash 值的操作,为应用程序提供导入和导出 geohash 数据以及索引和搜索 geohash 值的功能。

除非另有说明,本节中的函数按如下方式处理其几何参数:

-   如果有任何论据`空值`,返回值为`空值`.

-   如果任何参数无效,则会发生错误。

-   如果任何参数的经度或纬度超出范围,则会发生错误:

    -   如果经度值不在 (−180, 180] 范围内,则[`ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_geometry_param_longitude_out_of_range)发生错误([`ER_LONGITUDE_OUT_OF_RANGE`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_longitude_out_of_range)在 MySQL 8.0.12 之前)。

    -   如果纬度值不在范围内[−90, 90], 一个[`ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_geometry_param_latitude_out_of_range)发生错误([`ER_LATITUDE_OUT_OF_RANGE`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_latitude_out_of_range)在 MySQL 8.0.12 之前)。

        显示的范围以度为单位。由于浮点运算,确切的范围限制略有偏差。

-   如果任何点参数不具有 SRID 0 或 4326,则[`ER_SRS_NOT_FOUND`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_srs_not_found)发生错误。*`观点`*不检查参数 SRID 有效性。

-   如果任何 SRID 参数引用未定义的空间参考系统 (SRS),则[`ER_SRS_NOT_FOUND`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_srs_not_found)发生错误。

-   如果任何 SRID 参数不在 32 位无符号整数的范围内,则[`ER_DATA_OUT_OF_RANGE`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_data_out_of_range)发生错误。

-   否则,返回值为非`空值`.

    这些 geohash 函数可用:

-   [](<>)

    [`ST_GeoHash(*`经度`*, *`纬度`*, *`最长长度`*)`](spatial-geohash-functions.html#function_st-geohash), [`ST_GeoHash(*`观点`*, *`最大长度`*)`](spatial-geohash-functions.html#function_st-geohash)

    [](<>)

    返回连接字符集和排序规则中的geohash字符串。

    对于第一种语法*`经度`*必须是范围内的数字[−180, 180],以及*`纬度`*必须是范围内的数字[−90, 90].对于第二种语法`指向`值是必需的,其中X和Y坐标分别位于经度和纬度的有效范围内。

    结果字符串的长度不超过*`最大长度`*字符,上限为100。字符串可能比*`最大长度`*字符,因为创建geohash值的算法会一直持续,直到它创建了一个精确表示位置或位置的字符串*`最大长度`*角色,以先到者为准。

    [`ST_GeoHash()`](spatial-geohash-functions.html#function_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\_街`*)`](spatial-geohash-functions.html#function_st-latfromgeohash)

    [](<>)

    从 geohash 字符串值返回纬度,作为范围内的双精度数字[−90, 90].

    这[`ST_LatFromGeoHash()`](spatial-geohash-functions.html#function_st-latfromgeohash)解码函数读取不超过 433 个字符*`geohash_str`*争论。这代表了坐标值内部表示中信息的上限。超过第 433 个字符将被忽略,即使它们在其他方面是非法的并产生错误。

    [`ST_LatFromGeoHash()`](spatial-geohash-functions.html#function_st-latfromgeohash)如本节介绍中所述处理其参数。

    ```
    mysql> SELECT ST_LatFromGeoHash(ST_GeoHash(45,-20,10));
    +------------------------------------------+
    | ST_LatFromGeoHash(ST_GeoHash(45,-20,10)) |
    +------------------------------------------+
    |                                      -20 |
    +------------------------------------------+
    ```

-   [](<>)

    [`ST_LongFromGeoHash(*`geohash_str`*)`](spatial-geohash-functions.html#function_st-longfromgeohash)

    [](<>)

    从 geohash 字符串值返回经度,作为范围内的双精度数字[,180 180].

    说明中的备注[`ST_LatFromGeoHash()`](spatial-geohash-functions.html#function_st-latfromgeohash)关于从处理的最大字符数*`geohash_str`*论点也适用于[`ST_LongFromGeoHash()`](spatial-geohash-functions.html#function_st-longfromgeohash).

    [`ST_LongFromGeoHash()`](spatial-geohash-functions.html#function_st-longfromgeohash)如本节介绍中所述处理其参数。

    ```
    mysql> SELECT ST_LongFromGeoHash(ST_GeoHash(45,-20,10));
    +-------------------------------------------+
    | ST_LongFromGeoHash(ST_GeoHash(45,-20,10)) |
    +-------------------------------------------+
    |                                        45 |
    +-------------------------------------------+
    ```

-   [](<>)

    [`ST_PointFromGeoHash(*`geohash_str`*, *`斯里德`*)`](spatial-geohash-functions.html#function_st-pointfromgeohash)

    [](<>)

    返回一个`观点`包含解码的 geohash 值的值,给定一个 geohash 字符串值。

    该点的 X 和 Y 坐标是范围内的经度[,180 180]和范围内的纬度[−90, 90], 分别。

    这*`斯里德`*参数是一个 32 位无符号整数。

    说明中的备注[`ST_LatFromGeoHash()`](spatial-geohash-functions.html#function_st-latfromgeohash)关于从处理的最大字符数*`geohash_str`*论点也适用于[`ST_PointFromGeoHash()`](spatial-geohash-functions.html#function_st-pointfromgeohash).

    [`ST_PointFromGeoHash()`](spatial-geohash-functions.html#function_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)                         |
    +---------------------------------------+
    ```