Pythonで凸包を生成する

GISアプリ

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 #地理情報

コメント

タイトルとURLをコピーしました