Geohashの個人的メモ

# Geohashとは

地図上のある程度の範囲（四角形）をまとめたものです。
メッシュコードとほぼ同じ概念で、区切り方にクセがあります。
詳細な概念説明は以下のYahoo!のサイトをご確認ください。

https://techblog.yahoo.co.jp/entry/20191210786752/

## Geohashの種類（桁数）

4,5,6,7以外は使わなそうなので、雑に記載しています

|桁数|横の長さ|縦の長さ|
|---|---|---|
|1|5000km|4000km|
|2|600km|1000km|
|3|160km|130km|
|4|19.5km|31.6km|
|5|4.82km|3.96km|
|6|609m|989m|
|7|152m|124m|
|8|19m|31m|
|9|5m|4m|
|10|0.6m|1m|

（上記Yahoo!のサイトより転記）

## Geohashの大まかな地図

メッシュコードだと「5339は東京！」など（経験がある人は）分かるのですが、
Geohash初心者には直感的にわからないので、地図を作成してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789636/aa99f43a-7189-ea52-3663-ccc11a68d404.png)

（[サンプル的にFoliumで作ったGeohash3の地図](https://diuxamlfu3f0g.cloudfront.net/files/20240517_geohash3_check.html)）

大体・・・
- 札幌：xps
- 東京：xn7
- 名古屋：xn3かxn1
- 大阪：xn0
- 博多：wvu
- 那覇：wud

ですね、完全に理解した

# 緯度経度←→Geohashの変換

## Web上

こちらのサイトの検索ボタンなどで良い感じにできそうです。

https://geohashsite.app/

## Python

`pip install python-geohash` で入る以下のライブラリのメモです。
ドキュメントがほぼ皆無？なので、実験結果を残しております。

https://pypi.org/project/python-geohash/

```python
import geohash
```

### サンプル

例えば、`35.71439205890935, 139.7473860851063`という点はGeohash＝xn77hjの中にあります。
Geohash＝xn77hjは、南北方向は、`35.7110595703125 - 35.716552734375`の範囲、
東西方向は、`139.74609375 - 139.757080078125`の範囲にあります。
この範囲にあるので、Geohashの中心は`35.71380615234375, 139.7515869140625`にあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789636/507a9847-0049-d677-0c10-f66929528028.png)

### 緯度経度→Geohash

```python
geohash.encode(Latitude, Longitude [, 桁数])
```

Sample

```python
geohash.encode(35.71439205890935,139.7473860851063, 6)
# xn77hj
```

### Geohash→中心緯度経度

```python
geohash.decode(Geohash)
```

Sample

```python
geohash.decode('xn77hj')
# (35.71380615234375, 139.7515869140625)
```

### Geohash→上下左右の緯度経度（その1）

```python
geohash.bbox(Geohash)
```

Sample

```py
geohash.bbox('xn77hj')
# {'s': 35.7110595703125,
# 'w': 139.74609375,
# 'n': 35.716552734375,
# 'e': 139.757080078125}
```

### Geohash→領域の大きさ

```python
geohash.decode_exactly(Geohash)
# Center_Latitude, Center_Longitude, Vertical_Length/2, Horizontal_Length/2
```

Sample

```python
geohash.decode_exactly('xn77hj')
# (35.71380615234375, 139.7515869140625, 0.00274658203125, 0.0054931640625)
```

Geohashの領域は、縦の長さがVertical_Length*2、横の長さがHorizontal_Length*2となります。

### 周辺のGeohash

Yahoo!のサイトのこのイメージで周囲8つを返します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789636/9a40796f-fdae-4465-ea79-84e454a6883f.png)

```py
geohash.neighbors(Geohash)
```

Sample

```py
geohash.neighbors('xpskzwj')
# ['xpskzwh',
#  'xpskzwn',
#  'xpskztv',
#  'xpskztu',
#  'xpskzty',
#  'xpskzwm',
#  'xpskzwk',
#  'xpskzwq']
```

### メモ

```python
dir(geohash)
```

<details><summary>result</summary>
['LONG_ZERO',
 '__all__',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 '__version__',
 '_base32',
 '_base32_map',
 '_decode_c2i',
 '_encode_i2c',
 '_float_hex_to_int',
 '_geohash',
 '_int_to_float_hex',
 '_uint64_deinterleave',
 '_uint64_interleave',
 'bbox',
 'decode',
 'decode_exactly',
 'decode_uint64',
 'encode',
 'encode_uint64',
 'expand',
 'expand_uint64',
 'neighbors',
 'sys']
</details>