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でも問題なく動作します。
latitude | longitude |
35.6812 | 139.7671 |
35.6895 | 139.6917 |
この場合、自動的に "latitude"
→ 緯度、 "longitude"
→ 経度 として認識されます。
他にも以下のような名前にも対応します:
- 緯度:
lat
,latitude
,y
,Y
,Y座標
- 経度:
lon
,longitude
,x
,X
,X座標
使い方
- Pythonの環境を準備(
pandas
,pyshp
をインストール) - このスクリプトを
.py
ファイルとして保存 - CSVファイルをスクリプトと同じフォルダに置く
- スクリプトを実行 →
*_line.shp
が自動生成されます!