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) | +---------------------------------------+