GIS奮闘記

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

Arcpyでフィーチャクラスの座標系を一括で変換する

さて、本日は「Arcpyでフィーチャクラスの座標系を一括で変換する」です。久しぶりにArcGISネタですね。なんとArcMap上ではフィーチャクラスごとにしか座標系の定義をすることができないので、フィーチャクラスが大量に存在している場合、座標系の変換はとても面倒です。そこで、今回は対象のフィーチャクラスの座標系を一括変換するスクリプトを書いてみました。前提条件としては以下です。

・対象のGDBを全て任意のフォルダに格納する

これだけです。とりあえずサンプルとしてこんな感じのフィーチャクラスを作成してみました。

f:id:sanvarie:20151224151941p:plain

座標系はすべて「平面直角座標系第11系(JGD2000)」としてフィーチャクラスを作成しました。

f:id:sanvarie:20151224152727p:plain

この座標系を「平面直角座標系第9系(JGD2000)」に変換したいと思います。

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

#対象のフォルダを設定
folder = u"C:\ArcPySample\座標系変換"

#平面直角座標系第9系(JGD2000)にする
projection ="PROJCS['JGD_2000_Japan_Zone_9',GEOGCS['GCS_JGD_2000',DATUM['D_JGD_2000',SPHEROID['GRS_1980',6378137.0,298.257222101]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]],PROJECTION['Transverse_Mercator'],PARAMETER['False_Easting',0.0],PARAMETER['False_Northing',0.0],PARAMETER['Central_Meridian',139.8333333333333],PARAMETER['Scale_Factor',0.9999],PARAMETER['Latitude_Of_Origin',36.0],UNIT['Meter',1.0]]"

#対象フォルダ
dir = os.listdir(folder)

#gdbフォルダをリストに格納
gdb = []

#対象フォルダ内のgdbフォルダをリストに格納
for d in dir:
    if d.find('.gdb') > -1:
        gdb.append(d)

#mdx情報を取得(これを入れるとArcMap上での実行が必要なので、削除してもOK)
mxd = arcpy.mapping.MapDocument(r"CURRENT")

#gdbの数分ループ
for g in gdb:
    ws = os.path.join(folder , g)

    # ワークスペースの設定
    arcpy.env.workspace = ws

    # フィーチャクラスのリストを取得
    fcList = arcpy.ListFeatureClasses()

    # すべてのフィーチャクラスに対してループで実行
    for fc in fcList:
        #投影法の定義
        arcpy.DefineProjection_management(fc,projection)

        #いちいちマップに読み込んでしまうので一旦削除。ってか他にいい処理の仕方があるはず。
        for df in arcpy.mapping.ListDataFrames(mxd):
            for lyr in arcpy.mapping.ListLayers(mxd, "", df):
                arcpy.mapping.RemoveLayer(df, lyr)

結果を見てみます。

f:id:sanvarie:20151224155153p:plain

「平面直角座標系第9系(JGD2000)」に変換することができました。
簡単ではありますが、本日は「Arcpyでフィーチャクラスの座標系を一括で変換する」でした。