緯度・経度（中心）から円のポリゴンを作成する方法

# はじめに
はじめまして！データサイエンティストの丸山虹樹です。株式会社GEOTRA([@GEOTRA](https://qiita.com/GEOTRA))にてGIS（Geographic Information System：地理情報システム）データを用いた分析、機械学習モデルの構築等を行っています。

# 本記事の内容
本記事では、`Python`を用いて、任意の緯度経度を中心とする円を作成する方法を紹介します。

# 処理内容
### Pythonのバージョン
``` python
python --version # Python 3.8.10
```
### ライブラリのバージョン
``` python
geopandas.__version__ # 0.13.2
shapely.__version__ # 2.0.2
pyproj.__version__ # 3.3.1
pandas.__version__ # 1.4.2
```
### 必要なライブラリのインポート
```python
import geopandas as gpd
from shapely.geometry import Point
from shapely.ops import transform
import pyproj
from functools import partial
import pandas as pd
```
### 緯度経度と円の半径、平面直角座標系を定義
ここでは、中心となる緯度経度と、円の半径(メートル)、平面直角座標系を定義しています。
- 平面直角座標系とは、地球表面を平面上で表現するための座標系の一つです。
- 地球の曲面を扱う地理座標系（緯度・経度）とは異なり、平面上の直交するX軸（東向き）とY軸（北向き）を用いて位置を表現します。すなわち、地理座標系（緯度・経度）が角度で表現するに対して、平面直角座標系はメートルで表現されます。
- 平面直角座標系の取得は、https://lemulus.me/column/epsg-list-gis から取得できます。東京23区が「`epsg:6677`」と定義されるのに対して、大阪は「`epsg:6674`」と定義され、地域ごとによって異なる点に注意が必要です。
```python
# 中心座標を定義
lon,lat = (139.74479267884593,35.67599877752559) #国会議事堂

# 半径(m)を定義
radius = 700 # 700m

# 平面直角座標系を定義
crs_code = 'epsg:6677'
```

### 円を作成する関数
中心の緯度経度、半径、平面直角座標系から円の`Polygon`を作成する関数です。
- `project1`は地理座標系（`epsg:4326`, 経度緯度)から、指定された平面直角座標系に変換する設定です。`project2`は逆にその平面直角座標系から、地理座標系に変換する設定です。
- `transform`を用いて、地理座標系と平面直角座標系の変換を行っています。
- `buffer(radius)`は、指定された半径で円（実際は多角形に近い形状）を作成します。
```python
def create_circle(lon,lat,radius, crs_code):
    # 中心点の座標
    center = Point(lon,lat)

    # 座標系の変換を定義
    project1 = partial(
        pyproj.transform,
        pyproj.Proj(init='epsg:4326'),
        pyproj.Proj(init=crs_code))
    
    project2 = partial(
        pyproj.transform,
        pyproj.Proj(init=crs_code),
        pyproj.Proj(init='epsg:4326'))

    
    # 平面直角座標系へ変換
    center = transform(project1, center)
    
    # 円形のポリゴンを作成
    circle = Point(center).buffer(radius)
    
    # 地理座標系へ変換
    return transform(project2, circle)
```

### 実行例
ここでは実際に、`国会議事堂`を中心とする半径`700m`の円を出力します。
```python
# 円形polygonを作成
polygon = create_circle(lon=lon,lat=lat,radius=radius,crs_code=crs_code)

# csvとして保存
polygon_df = pd.DataFrame({"geometry":[polygon],"lon":[lon],"lat":[lat]})
polygon_df.to_csv("circle_polygon.csv",index=False)
```
### kepler.glで表示
[kepler.gl](https://kepler.gl/)とは、Uber社が開発した地理空間データを可視化するためのツールです。このサイトで`GET STARTED`をクリックし、先ほど作成した`circle_polygon.csv`をアップロードすることで、ブラウザ上で今回作成した円を可視化できます。
- 以下を確認すると、[Google Map](https://www.google.co.jp/maps)から取得した`国会議事堂`（赤点）を中心に、円を作成できていることがわかります。
![スクリーンショット 2024-11-15 16.09.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782914/a5efcc6b-5387-112b-e96a-5c8651a3e849.png)

### 本当に半径700mなのかを確認
上記の`kepler.gl`で可視化した円が本当に半径`700m`なのかを`Google Map`を用いて確認します。
- 上記の`kepler.gl`を確認すると、左に見える`東京メトロ`の`赤坂見附駅`が`国会議事堂`から約700mだとわかります。
- `Google Map`の距離測定機能を用いて、確認しました。距離測定はマウスを手動で動かすので、誤差はありますが、`Google Map`からも`赤坂見附駅`と`国会議事堂`の直線距離が約700mだと確認できます。![スクリーンショット 2024-11-15 16.20.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782914/eab6c45d-4258-5e8a-dec8-b4e0b68d4140.png)

# 結論
Pythonを用いて、任意の緯度・経度を中心とする円のポリゴンを作成することができました。

# おわりに
最後までお読みくださりありがとうございました。

また、こちらの記事を読んでGEOTRAに興味を持ってくださった方は、是非[Wantedly](https://www.wantedly.com/stories/s/geotra_introduction)から会社紹介記事もご覧ください！GEOTRAは、学生インターンを含め、現在一緒に働く仲間を募集しております。興味をお持ちの方は、Wantedly上の募集ページやストーリー、各種サイトをご確認ください！

**企業HP：** https://www.geotra.jp/

**note：** https://note.com/2022geotra/

**Wantedly：** https://www.wantedly.com/stories/s/geotra_introduction

**LinkedIn：** https://www.linkedin.com/company/%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BEgeotra/

GEOTRAのQiitaでは、引き続き地理空間情報に関する情報を中心に技術系のテクニックを発信していきます。今後も皆さんのお役に立てるコンテンツを配信できればと思っておりますので、皆様のいいね・フォローをお待ちしています！