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)傳回一個
POINT值,其中包含已解碼的 geohash 值,給定一個 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) | +---------------------------------------+