https://gkukan.jp オープンデータを活用して、地理情報システム(GIS)についてわかりやすく解説するサイトです。初心者から上級者まで、GISの活用方法や便利なツールを学べる情報を提供します。地域情報の可視化や地図データの使い方について知識を深めたい方におすすめです。

Pythonで凸包を生成する


Pythonで凸包を生成する



Pythonで凸包を生成する

凸包とは、平面上の点群を全て含む最小の凸多角形です。
簡単に言うと、点群の外側を囲む最小の輪郭を作るものです。
この凸多角形は、すべての点を内側に含み、外向きの曲がりがないという特徴を持ちます。
例えば、地図上の複数の地点が与えられたとき、それらの外側を取り囲む境界線を計算するのに役立ちます。



凸包は、地理情報システム(GIS)、画像処理、3Dモデリング、パターン認識など、さまざまな分野で活用されています。
これを使うことで、与えられた点の最小の囲い込みや、外部境界を簡単に計算することができます。



Pythonを使って凸包を生成する方法についてご紹介します。
前回の記事「ボロノイ図を使った最寄り医療機関の可視化」では、ボロノイ図を用いた医療機関の可視化を紹介しましたが、今回は「凸包」をPythonでどのように作成するか、ソースコードの解説を行います。

入力ファイルについて


凸包を生成するためには、「緯度」「経度」という特定のカラム名が含まれたCSVファイルが必要です。
このカラム名は漢字で固定されており、入力データに必ずこの名称で情報が存在していなければなりません。
以下のようなCSVファイル形式が適しています。

入力ファイルの例


    経度,緯度
139.6917,35.6895
135.5023,34.6937
140.1234,36.5678


ソースコードの解説


以下に、Pythonを使って凸包を生成し、GeoJSON形式で出力するスクリプトの全体を示します。
このスクリプトでは、特定の形式に従ったCSVファイル(「緯度」と「経度」カラムを持つ)を読み込み、そのデータをもとに凸包を計算します。

必要なライブラリ


pip install pandas geopandas scipy shapely chardet


CSVファイルの読み込み


def load_csv(file_path):
with open(file_path, 'rb') as f:
result = chardet.detect(f.read())
encoding = result['encoding']
df = pd.read_csv(file_path, encoding=encoding)
return df


凸包の生成


def generate_convex_hull(df):
points = df[['経度', '緯度']].values # 「経度」と「緯度」のカラムを使用
hull = ConvexHull(points) # 凸包を生成
polygon = [points[i] for i in hull.vertices]
convex_hull_polygon = Polygon(polygon) # ポリゴンに変換
return convex_hull_polygon


GeoJSONへのエクスポート


def export_to_geojson(polygon, output_file):
gdf = gpd.GeoDataFrame(geometry=[polygon])
gdf.to_file(output_file, driver='GeoJSON', encoding='utf-8')


メイン処理


def main():
script_path = os.path.dirname(os.path.abspath(__file__))
csv_file = os.path.join(script_path, 'input.csv')
geojson_file = os.path.join(script_path, 'output2.geojson')

df = load_csv(csv_file)
convex_hull_polygon = generate_convex_hull(df)
export_to_geojson(convex_hull_polygon, geojson_file)
print(f"GeoJSONファイルが{geojson_file}に保存されました。")


結論


Pythonを使って「緯度」と「経度」カラムを持つCSVファイルを基に凸包を生成する方法を紹介しました。
カラム名は固定ですが、データさえ整備されていれば、このスクリプトを使用することで、簡単に領域の凸包を生成できます。
応用例として、地理的データの境界線の計算や最小領域の囲い込みなど、さまざまな分野で活用できるでしょう。

#Python #データサイエンス #GIS #凸包 #プログラミング #データ可視化 #GeoJSON #地理情報

同じカテゴリー(オープンデータ)の記事
今日は冬至です
今日は冬至です(2024-12-21 05:06)

コメント

名前
上の画像に書かれている文字を入力して下さい
削除
Pythonで凸包を生成する
    コメント(0)