文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  空間 Geohash 函數

14.16.10 空間 Geohash 函數

Geohash 是一種將任意精度的經緯度座標編碼為文字字串的系統。Geohash 值是僅包含從 "0123456789bcdefghjkmnpqrstuvwxyz" 中選擇的字元的字串。

本節中的函數可以操作 geohash 值,為應用程式提供匯入和匯出 geohash 資料、以及索引和搜尋 geohash 值的功能。

除非另有說明,否則本節中的函數會按如下方式處理其幾何引數

  • 如果任何引數為 NULL,則傳回值為 NULL

  • 如果任何引數無效,則會發生錯誤。

  • 如果任何引數的經度或緯度超出範圍,則會發生錯誤

    顯示的範圍以度為單位。由於浮點算術,確切的範圍限制會略有偏差。

  • 如果任何點引數沒有 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)                         |
    +---------------------------------------+