GIS奮闘記

現役GISエンジニアの技術紹介ブログ。主にPythonを使用。

PythonでESRIの日本地図(全国市区町村界データ)を加工してみる ~オープンデータを自分の欲しい形にしてみよう~

本日は当ブログでもよく使用しているESRIさんの日本地図を加工してみようと思います。このデータは全国の市区町村ごとのポリゴンデータなのですが、県ごとのポリゴンが欲しいという方もいるかと思います。単純に県ごとにするだけなら簡単なのですが、人口や世帯数といったデータも一緒に集約することはArcMapではできない?!のではないでしょうか。←自分がやり方を知らないだけかもですが・・・

また、今回のソースと加工したデータはGitHubで公開しました。
https://github.com/sanvarie/MinnanoArcGIS

URL

以下サイトでダウンロード可能です。
全国市区町村界データ | 製品 | ESRIジャパン

仕様

ただのコピペですが。

データ仕様

・フォーマット シェープファイル
・図形タイプ ポリゴン
・座標系 地理座標系 日本測地系 2000(緯度経度 JGD 2000)

属性情報

フィールド名
JCODE・・・市区町村コード
KEN・・・都道府県名
SICHO ・・・支庁名・振興局名
GUN・・・郡名(町村部のみ)
SEIREI・・・政令指定都市の市名
SIKUCHOSON・・・市区町村名
CITY_ENG・・・市区町村名(英語)
P_NUM・・・人口
H_NUM・・・世帯数

県ごとのポリゴンを作成

ディゾルブを行います。以下スクリプトを実行してください。また、事前に「ArcPyJapan.gdb」というgdbを作成しておいてください。ちなみにここまでは【Pythonで分析】ArcpyとPandasを使用して将来推計人口を視覚化する - GIS奮闘記でやりましたね。よく考えたら今回はほとんどこの時と同じようなことをしているような・・・でもまぁ気にしません(笑)

サンプルコード

dissolve.py

# -*- coding: utf-8 -*-
import arcpy

#ディゾルブ
arcpy.Dissolve_management("D:\python\soccer\japan_ver80.shp", "C:\ArcPySample\ArcPyJapan.gdb\Japan",
                           "KEN", "", "MULTI_PART",
                           "DISSOLVE_LINES")

結果を確認します。県ごとのポリゴンが完成しました。ただ、このままだと人口、世帯数がありませんね。
f:id:sanvarie:20160226080736p:plain

カラム追加

上記で作成したポリゴンに人口、世帯数カラムを追加します。

サンプルコード

addcolumn.py

# -*- coding: utf-8 -*-
import arcpy

arcpy.env.workspace = "C:\ArcPySample\ArcPyJapan.gdb"
arcpy.AddField_management("Japan", "P_NUM", "Long")
arcpy.AddField_management("Japan", "H_NUM", "Long")

カラムが追加されましたね。
f:id:sanvarie:20160226081351p:plain

県ポリゴンに人口、世帯数を与える

上記で追加した人口、世帯数カラムに値を付与します。

インストール

Pandasのインストールをお願いします。

サンプルコード

updatejapanmap.py

# -*- coding: utf-8 -*-
import arcpy
import pandas as pd

#日本地図のShape
inFeatures = "D:\python\soccer\japan_ver80.shp"

#更新するフィーチャクラスがあるgdb
arcpy.env.workspace = "C:\ArcPySample\ArcPyJapan.gdb"

field_list = []
for field in arcpy.ListFields(inFeatures):
    if field.type != "Geometry":
        field_list.append(field.name)

df = pd.DataFrame(arcpy.da.FeatureClassToNumPyArray(inFeatures,field_list,null_value=-9999))

#グルーピング
df_group = df.groupby('KEN')['P_NUM','H_NUM'].sum()

for key,row in df_group.iterrows():
    cursorJ = arcpy.UpdateCursor("Japan")
    for rowJ in cursorJ:
        if key == rowJ.KEN:
            rowJ.setValue("P_NUM", row.P_NUM)
            rowJ.setValue("H_NUM", row.H_NUM)
            cursorJ.updateRow(rowJ)

人口、世帯数を持った県ごとのポリゴンの作成に成功しました。
f:id:sanvarie:20160226082040p:plain

最近、オープンデータの数が増加している気がしますが、自分の求めているものとちょっと違っていたりする経験がある方が多いのではないでしょうか。こういった技術を使えば、オープンデータを自分の欲しかったデータに加工することが可能です(今回はかなり簡単な例でしたが)。

以上、本日は「PythonESRIの日本地図(全国市区町村界データ)を加工してみる」でした!