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