経度、緯度の配列からメッシュコードを計算する

# 経度、緯度の配列からメッシュコードを計算する

jismeshで予期しない値が返ってきたので、自前で実装し直し。

[latlon2mesh](https://www.gis-py.com/entry/py-latlon2mesh) があったから、numpyの配列を指定できるように改良してみた。

```python
import numpy as np

def latlon2mesh(lat, lon):
    #1次メッシュ上2けた
    lat60 = np.round(lat * 60, decimals=7)
    quotient_lat, remainder_lat = np.divmod(lat60, 40)
    first2digits = quotient_lat.astype(int).astype(str)
    
    #1次メッシュ下2けた
    last2digits = (lon - 100).astype(int).astype(str)
    remainder_lon = lon - lon.astype(int)
    
    #1次メッシュ
    first_mesh = np.char.add(first2digits, last2digits)
    
    #2次メッシュ上1けた
    first1digits, remainder_lat = np.divmod(remainder_lat, 5)
    
    #2次メッシュ下1けた
    remainder_lon60 = np.round(remainder_lon * 60, decimals=7)
    last1digits, remainder_lon = np.divmod(remainder_lon60, 7.5)
    
    #2次メッシュ
    first1digits = first1digits.astype(int).astype(str)
    last1digits  = last1digits.astype(int).astype(str)
    second_mesh = np.char.add(first_mesh, np.char.add(first1digits, last1digits))

    #3次メッシュ上1けた
    remainder_lat60 = np.round(remainder_lat * 60, decimals=7)
    first1digits, remainder_lat = np.divmod(remainder_lat60, 30)

    #3次メッシュ下1けた
    remainder_lon60 = np.round(remainder_lon * 60, decimals=7)
    last1digits, remainder_lon = np.divmod(remainder_lon60, 45)
    
    #3次メッシュ
    first1digits = first1digits.astype(int).astype(str)
    last1digits  = last1digits.astype(int).astype(str)
    third_mesh = np.char.add(second_mesh, np.char.add(first1digits, last1digits))

    print("1次メッシュ:", first_mesh)
    print("2次メッシュ:", second_mesh)
    print("3次メッシュ:", third_mesh)

    
lat0 = 34.875
lon0 = 135.1875

latlon2mesh(
    np.array([lat0, lat0]),
    np.array([lon0, lon0]),
)

```

np.char.add がネストしているところがあるけど、ここカッコ悪い。。。


```python
import numpy as np

def latlon2mesh(lat, lon):
    #1次メッシュ上2けた
    lat60 = np.round(lat * 60, decimals=7)
    quotient_lat, remainder_lat = np.divmod(lat60, 40)
    first2digits = quotient_lat.astype(int)
    
    #1次メッシュ下2けた
    last2digits = (lon - 100).astype(int)
    remainder_lon = lon - lon.astype(int)
    
    #1次メッシュ
    first_mesh = first2digits * 100 + last2digits
    
    #2次メッシュ上1けた
    first1digits, remainder_lat = np.divmod(remainder_lat, 5)
    
    #2次メッシュ下1けた
    remainder_lon60 = np.round(remainder_lon * 60, decimals=7)
    last1digits, remainder_lon = np.divmod(remainder_lon60, 7.5)
    
    #2次メッシュ
    first1digits = first1digits.astype(int) * 10
    last1digits  = last1digits.astype(int)
    second_mesh = first_mesh * 100 + first1digits + last1digits

    #3次メッシュ上1けた
    remainder_lat60 = np.round(remainder_lat * 60, decimals=7)
    first1digits, remainder_lat = np.divmod(remainder_lat60, 30)

    #3次メッシュ下1けた
    remainder_lon60 = np.round(remainder_lon * 60, decimals=7)
    last1digits, remainder_lon = np.divmod(remainder_lon60, 45)
    
    #3次メッシュ
    first1digits = first1digits.astype(int) * 10
    last1digits  = last1digits.astype(int)
    third_mesh = second_mesh * 100 + first1digits + last1digits

    print("1次メッシュ:", first_mesh)
    print("2次メッシュ:", second_mesh)
    print("3次メッシュ:", third_mesh)

    
lat0 = 34.875
lon0 = 135.1875

latlon2mesh(
    np.array([lat0, lat0]),
    np.array([lon0, lon0]),
)
```

文字である必要ないので、intにしてみた。