MySQL 5.7のGeoHash

MySQL 5.7で追加された機能一つにBoost.Geometryとの統合によるGISの強化があります。さらにGeoHashという機能が追加されています。GeoHashは地点の情報をハッシュ値として格納する機能で、ハッシュ長によって精度を変えることができます。緯度経度の値から長さの異なるGeoHashを生成し、そこから再度緯度経度の値を算出してみます。今回の例では直線距離で約3km離れた2地点の緯度経度を利用しています。

なお緯度経度の情報および十進表記は下記のサイトの情報を使いました
http://user.numazu-ct.ac.jp/~tsato/webmap/sphere/coordinates/advanced.html

関数 内容
ST_GeoHash() 緯度経度の値またはPOINT型の値からGeoHash値を生成
ST_LatFromGeoHash() GeoHash値から緯度を算出
ST_LongFromGeoHash() GeoHash値から経度を算出
ST_PointFromGeoHash() GeoHash値から緯度経度を算出しPOINT型の値を返す
# 横浜スタジアム ホームベース付近 北緯35°26′35″ 東経139°38′25″ 
# 十進表記 北緯35.442972 東経139.640223

mysql> SELECT
    ->  ST_GeoHash(139.640223, 35.442972, 4) AS GeoHash4,
    ->  ST_GeoHash(139.640223, 35.442972, 32) AS GeoHash32;
+----------+------------------------+
| GeoHash4 | GeoHash32              |
+----------+------------------------+
| xn73     | xn739s4ym0c53e0pys2c9g |
+----------+------------------------+
1 row in set (0.01 sec)

mysql> SELECT
    ->  ST_LatFromGeoHash(ST_GeoHash(139.640223, 35.442972, 4)) AS GeoHash4,
    ->  ST_LatFromGeoHash(ST_GeoHash(139.640223, 35.442972, 32)) AS GeoHash32;
+----------+-----------+
| GeoHash4 | GeoHash32 |
+----------+-----------+
|     35.4 | 35.442972 |
+----------+-----------+
1 row in set (0.00 sec)

mysql> SELECT
    ->  ST_LongFromGeoHash(ST_GeoHash(139.640223, 35.442972, 4)) AS GeoHash4,
    ->  ST_LongFromGeoHash(ST_GeoHash(139.640223, 35.442972, 32)) AS GeoHash32;
+----------+------------+
| GeoHash4 | GeoHash32  |
+----------+------------+
|    139.7 | 139.640223 |
+----------+------------+
1 row in set (0.01 sec)
# 横浜駅きた西口 北緯35°28′2″ 東経139°37′23″
# 十進表記 北緯35.467360 東経139.623148

mysql> SELECT
    ->  ST_GeoHash(139.623148, 35.467360, 4) AS GeoHash4,
    ->  ST_GeoHash(139.623148, 35.467360, 32) AS GeoHash32;
+----------+----------------------------------+
| GeoHash4 | GeoHash32                        |
+----------+----------------------------------+
| xn73     | xn73c0wkr5j52nh2eub7y5bpbpbpbpbp |
+----------+----------------------------------+
1 row in set (0.00 sec)

mysql> SELECT
    ->  ST_LatFromGeoHash(ST_GeoHash(139.623148, 35.467360, 4)) AS GeoHash4,
    ->  ST_LatFromGeoHash(ST_GeoHash(139.623148, 35.467360, 32)) AS GeoHash32;
+----------+-------------------+
| GeoHash4 | GeoHash32         |
+----------+-------------------+
|     35.4 | 35.46736000000001 |
+----------+-------------------+
1 row in set (0.01 sec)

mysql> SELECT
    ->  ST_LongFromGeoHash(ST_GeoHash(139.623148, 35.467360, 4)) AS GeoHash4,
    ->  ST_LongFromGeoHash(ST_GeoHash(139.623148, 35.467360, 32)) AS GeoHash32;
+----------+--------------------+
| GeoHash4 | GeoHash32          |
+----------+--------------------+
|    139.7 | 139.62314800000001 |
+----------+--------------------+
1 row in set (0.00 sec)

ハッシュ長を4桁にした場合は情報が丸められ、同じ緯度経度の情報になっています。プライバシー保護などの観点から、正確な位置を利用するのではなく大まかな場所やエリアで表示させるなどに利用できそうです。