0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-12-05

はじめに

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

本記事の内容

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

処理内容

Pythonのバージョン

python --version # Python 3.8.10

ライブラリのバージョン

geopandas.__version__ # 0.13.2
shapely.__version__ # 2.0.2
pyproj.__version__ # 3.3.1
pandas.__version__ # 1.4.2

必要なライブラリのインポート

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」と定義され、地域ごとによって異なる点に注意が必要です。
# 中心座標を定義
lon,lat = (139.74479267884593,35.67599877752559) #国会議事堂

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

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

円を作成する関数

中心の緯度経度、半径、平面直角座標系から円のPolygonを作成する関数です。

  • project1は地理座標系(epsg:4326, 経度緯度)から、指定された平面直角座標系に変換する設定です。project2は逆にその平面直角座標系から、地理座標系に変換する設定です。
  • transformを用いて、地理座標系と平面直角座標系の変換を行っています。
  • buffer(radius)は、指定された半径で円(実際は多角形に近い形状)を作成します。
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の円を出力します。

# 円形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とは、Uber社が開発した地理空間データを可視化するためのツールです。このサイトでGET STARTEDをクリックし、先ほど作成したcircle_polygon.csvをアップロードすることで、ブラウザ上で今回作成した円を可視化できます。

  • 以下を確認すると、Google Mapから取得した国会議事堂(赤点)を中心に、円を作成できていることがわかります。
    スクリーンショット 2024-11-15 16.09.12.png

本当に半径700mなのかを確認

上記のkepler.glで可視化した円が本当に半径700mなのかをGoogle Mapを用いて確認します。

  • 上記のkepler.glを確認すると、左に見える東京メトロ赤坂見附駅国会議事堂から約700mだとわかります。
  • Google Mapの距離測定機能を用いて、確認しました。距離測定はマウスを手動で動かすので、誤差はありますが、Google Mapからも赤坂見附駅国会議事堂の直線距離が約700mだと確認できます。スクリーンショット 2024-11-15 16.20.19.png

結論

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

おわりに

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

また、こちらの記事を読んでGEOTRAに興味を持ってくださった方は、是非Wantedlyから会社紹介記事もご覧ください!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では、引き続き地理空間情報に関する情報を中心に技術系のテクニックを発信していきます。今後も皆さんのお役に立てるコンテンツを配信できればと思っておりますので、皆様のいいね・フォローをお待ちしています!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?