Pythonで大量のCSVファイルをShapefileへ変換

GISデータの前処理でよくあるのが、座標を示すCSVファイルからポリライン(折れ線)のShapefile(SHP)を生成する処理です。しかし、生成するShapefileが大量にあると、時間がかかって面倒ですよね。

そこで、Pythonとpyshpライブラリを使用してポリラインのshpファイルを作成するPythonスクリプトをご紹介します。

スクリプトの特徴

  • 座標のヘッダー名がバラバラでも自動認識(例:”Latitude”, “Y座標”, “X”など)
  • 複数のCSVファイルを一括変換
  • すべての座標を1本のポリラインとして出力

ソースコード

Pythonコードはこちらです。

import os
import pandas as pd
import shapefile

def guess_lat_lon_columns(columns):
    """緯度・経度に該当する列名を推測する"""
    lat_keywords = ['lat', 'latitude', 'y']
    lon_keywords = ['lon', 'longitude', 'x']

    lat_col = None
    lon_col = None

    for col in columns:
        col_lower = col.lower()
        if not lat_col and any(k in col_lower for k in lat_keywords):
            lat_col = col
        if not lon_col and any(k in col_lower for k in lon_keywords):
            lon_col = col

    if not lat_col or not lon_col:
        raise ValueError(f"緯度・経度の列が見つかりません: {columns}")

    return lon_col, lat_col

def csv_to_shp(csv_path, shp_path):
    # CSV読み込み
    df = pd.read_csv(csv_path)

    # 緯度・経度の列名を推定
    lon_col, lat_col = guess_lat_lon_columns(df.columns)

    # 緯度・経度以外の列(属性)を抽出
    attr_cols = [col for col in df.columns if col not in [lon_col, lat_col]]

    # Shapefile Writer作成(ポリライン)
    with shapefile.Writer(shp_path, shapeType=shapefile.POLYLINE) as w:
        # 属性フィールド定義
        for col in attr_cols:
            dtype = df[col].dtype
            if pd.api.types.is_numeric_dtype(dtype):
                w.field(col, 'N', decimal=10)
            else:
                w.field(col, 'C', size=255)

        # ポリラインと属性レコードを書き込み(1本の線として)
        line = df[[lon_col, lat_col]].values.tolist()
        w.line([line])

        # 属性データ(先頭行を代表として使用、必要であれば全行対応可)
        first_row = df.iloc[0]
        attr_values = [first_row[col] for col in attr_cols]
        w.record(*attr_values)

# カレントディレクトリ内のCSVファイルを処理
folder_path = '.'
for file in os.listdir(folder_path):
    if file.endswith('.csv'):
        csv_file = os.path.join(folder_path, file)
        shp_file = os.path.splitext(csv_file)[0] + "_line"
        csv_to_shp(csv_file, shp_file)

print("すべてのCSVファイルをSHPファイルに変換しました。")

ヘッダー名が違ってもOK

例えば、以下のようなCSVでも問題なく動作します。

latitudelongitude
35.6812139.7671
35.6895139.6917

この場合、自動的に "latitude" → 緯度、 "longitude" → 経度 として認識されます。

他にも以下のような名前にも対応します:

  • 緯度:lat, latitude, y, Y, Y座標
  • 経度:lon, longitude, x, X, X座標

使い方

  1. Pythonの環境を準備(pandas, pyshpをインストール)
  2. このスクリプトを .py ファイルとして保存
  3. CSVファイルをスクリプトと同じフォルダに置く
  4. スクリプトを実行 → *_line.shp が自動生成されます!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です