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|
参考文献
- Geohash - Wikipedia, the free encyclopedia
- Big Data Modeling: Visualizing Geohash
- Geohashエリア確認ツール2
- GeoHashのdecodeのアルゴリズムの解説します & ScalaのGeoHashライブラリを作ってみました(仮) - ( ꒪⌓꒪) ゆるよろ日記
- 緯度経度を文字列で表すGeoHash | @masuidrive blog
- masuidrive/pr_geohash