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