読者です 読者をやめる 読者になる 読者になる

bekkou68の日記

開発しているサービス, IT技術, 英語など。

Geohash について調べたことのメモ

Geohash

はじめに

表題どおりの個人向けメモです。

Geohash とは

ハッシュの桁数と距離

趣旨

近くの人を探すと言っても、どのくらいの距離感かを知りたい。桁数と距離の関係を知りたい。

そのために一つのグリッドの縦と横の長さ、および近接検索した場合の縦と横の長さ (要は3倍した値) を算出する。

スクリプト

こちらの記事 を参考にしスクリプトをざっくり組む。

# 東京付近のGeoHashの精度を算出するスクリプト
# 一つのグリッドの各辺の長さを算出する
# また、pr_geohash の .neighbor の距離感を得るため 3倍した値も算出する
#
# 地球の半径 .. 約 6,400km
# 地球の外周 .. 約40,000km

header = '| 桁数 | 南北の距離 | 東西の距離 | 南北距離3倍 | 東西距離3倍 |'
bodies = (1..10).map {|i|
  print_i = sprintf('%6d', i)

  lng_bit = (5 * i / 2.0).ceil
  lng_grid_size = (360.0 / (2 ** lng_bit))*(25.0*60*60)
  print_lng_grid_size = sprintf("%11.2fm", lng_grid_size)

  lat_bit = (5 * i / 2.0).floor
  lat_grid_size = (180.0 / (2 ** lat_bit))*(30.8*60*60)
  print_lat_grid_size = sprintf("%11.2fm", lat_grid_size)

  neighbor_lng_grid_size = lng_grid_size * 3.0
  print_neighbor_lng_grid_size = sprintf("%12.2fm", neighbor_lng_grid_size)

  neighbor_lat_grid_size = lat_grid_size * 3.0
  print_neighbor_lat_grid_size = sprintf("%12.2fm", neighbor_lat_grid_size)

  [print_i, print_lat_grid_size, print_lng_grid_size, print_neighbor_lng_grid_size, print_neighbor_lat_grid_size]
}
puts header
puts bodies.map{|r| "|#{r.join('|')}|"}.join("\n")

出力はこちら。地図上の大まかな規模をコメントで補足した。

| 桁数 |   南北の距離 |   東西の距離 |  南北距離3倍 |   東西距離3倍 | #   3倍のグリッドにおいて
|     1| 4989600.00m| 4050000.00m| 12150000.00m| 14968800.00m| #-> ロシアを覆うくらい
|     2|  623700.00m| 1012500.00m|  3037500.00m|  1871100.00m| #-> 日本を覆うくらい
|     3|  155925.00m|  126562.50m|   379687.50m|   467775.00m| #-> 日本の5分の1くらい
|     4|   19490.62m|   31640.62m|    94921.88m|    58471.88m| #-> 都道府県を覆うくらい
|     5|    4872.66m|    3955.08m|    11865.23m|    14617.97m| #-> 市町村を覆うくらい
|     6|     609.08m|     988.77m|     2966.31m|     1827.25m|
|     7|     152.27m|     123.60m|      370.79m|      456.81m|
|     8|      19.03m|      30.90m|       92.70m|       57.10m|
|     9|       4.76m|       3.86m|       11.59m|       14.28m|
|    10|       0.59m|       0.97m|        2.90m|        1.78m|

参考文献

おまけ

GeoHex という技術もある。Ruby の v3 のライブラリがなかったのが惜しい。