範囲連続出力


arcpy画像出力の動かないコード
以前試して駄目だったコードが10.2では動きそう。( mxdを現インスタンスではだめなのかも 確かファイルでも試した気はするが…)

取り敢えず範囲指定(メートル座標の範囲)を画像出力しラスタカタログ化するコードをおいとく。
枚数表示できるかと思いきや出来なかったがまあいいか。
デフォルトのツールにあっても良さげだがパッと見ないところを見るとないのかな。

そろそろ飽きた、てか作業なのでつまらないからもうそろそろ別の事をやろうと思いつつネタ探し中

import os.path
import arcpy

# Python ツールボックスのツール動作のカスタマイズ
# http://resources.arcgis.com/ja/help/main/10.1/index.html#//00150000002m000000
class Toolbox(object):
    def __init__(self):
        """Define the toolbox (the name of the toolbox is the name of the
        .pyt file)."""
        self.label = "MyToolbox"
        self.alias = ""

        # ツールのリスト設定 ( クラス設定 )
        self.tools = [exportGeoImg]

# Difference
class exportGeoImg(object):
    def __init__(self):
        self.label = "タイル画像出力"
        self.description = "タイル画像出力"
        self.canRunInBackground = False

    def getParameterInfo(self):
        # Python ツールボックスでのパラメータの定義
        # http://resources.arcgis.com/ja/help/main/10.1/index.html#//001500000028000000
        # getParameterの型一覧
        # http://resources.arcgis.com/ja/help/main/10.1/index.html#//001500000035000000
        # パラメータリファレンス
        # http://resources.arcgis.com/ja/help/main/10.1/index.html#//018z00000063000000

        # ドキュメント
        param0 = arcpy.Parameter(
        displayName="マップドキュメント",
        name="in_mxd",
        datatype="DEMapDocument",
        parameterType="Required",
        direction="Input")

        # 範囲 GPEnvelope / GPExtent
        param1 = arcpy.Parameter(
        displayName="範囲",
        name="in_env",
        datatype="GPExtent",
        parameterType="Required",
        direction="Input")
        
        # 画像タイプ
        param2 = arcpy.Parameter(
        displayName="画像タイプ",
        name="in_imgType",
        datatype="GPString",
        parameterType="Required",
        direction="Input")

        param2.filter.type = "ValueList"
        param2.filter.list = ["JPEG", "PNG", "TIF"]
        param2.value = "JPEG"

        # 画像幅 GPLong
        param3 = arcpy.Parameter(
        displayName="画像幅[px]",
        name="in_pxW",
        datatype="GPLong",
        parameterType="Required",
        direction="Input")
        param3.value = 800

        # 画像高 GPLong
        param4 = arcpy.Parameter(
        displayName="画像高[px]",
        name="in_pxH",
        datatype="GPLong",
        parameterType="Required",
        direction="Input")
        param4.value = 600

        # DPI GPLong
        param5 = arcpy.Parameter(
        displayName="DPI ピクセル/インチ",
        name="in_dpi",
        datatype="GPLong",
        parameterType="Required",
        direction="Input")
        param5.value = 96

        # 縮尺 GPLong
        param6 = arcpy.Parameter(
        displayName="縮尺",
        name="in_scale",
        datatype="GPLong",
        parameterType="Required",
        direction="Input")
        param6.value = 25000

        # 出力フォルダ
        param7 = arcpy.Parameter(
        displayName="出力先フォルダ",
        name="in_OutDir",
        datatype="DEFolder",
        parameterType="Required",
        direction="Output")

        # 出力画像数 (表示用)
        param8 = arcpy.Parameter(
        displayName="出力画像数",
        name="in_imgCount",
        datatype="GPLong",
        parameterType="Required",
        direction="Input")
        param8.value = 0
        param8.enabled = True

        return [param0, param1, param2, param3, param4, param5, param6, param7] #, param8]

    def isLicensed(self):
        """Set whether tool is licensed to execute."""
        return True

    def updateParameters(self, parameters):
        """Modify the values and properties of parameters before internal
        validation is performed.  This method is called whenever a parameter
        has been changed."""
        #try:
        #    ext = parameters[1].valueAsText
        #   
        #    ext = ext.split(" ")
        #    ext = arcpy.Extent(float(ext[0]),float(ext[1]),float(ext[2]),float(ext[3]))
        #    pxW = parameters[3].value
        #    pxH = parameters[4].value
        #    mW = self.pxToMeter(pxW, dpi, scale)
        #    mH = self.pxToMeter(pxH, dpi, scale)
            
        #    wCnt = math.ceil( ext.width / mW )
        #    hCnt = math.ceil( ext.height / mH )
        #    wCnt = int(wCnt)
        #    hCnt = int(hCnt)
        #    parameters[8].value = wCnt * hCnt
        #    parameters[8].enabled = False
        #except Exception as e:
        #    parameters[8].setWarningMessage(e)
            
        return

    def updateMessages(self, parameters):
        """Modify the messages created by internal validation for each tool
        parameter.  This method is called after internal validation."""
        return

    # pxを縮尺とDPIで実距離mに変換
    def pxToMeter(self, px, dpi, scale):

        m = (px / dpi) * 0.0254
        return m * scale
    
    def execute(self, parameters, messages):
        # Python ツールボックスでのメッセージの書き込み
        # http://resources.arcgis.com/ja/help/main/10.1/index.html#//001500000036000000

        mxd = parameters[0].valueAsText
        ext = parameters[1].valueAsText
        imgType = parameters[2].valueAsText
        pxW = parameters[3].value
        pxH = parameters[4].value
        dpi = parameters[5].value
        scale = parameters[6].value
        outDir = parameters[7].valueAsText

        messages.addMessage(ext)
        ext = ext.split(" ")
        ext = arcpy.Extent(float(ext[0]),float(ext[1]),float(ext[2]),float(ext[3]))

        mW = self.pxToMeter(pxW, dpi, scale)
        mH = self.pxToMeter(pxH, dpi, scale)
        
        wCnt = math.ceil( ext.width / mW )
        hCnt = math.ceil( ext.height / mH )
        wCnt = int(wCnt)
        hCnt = int(hCnt)

        messages.addMessage("出力MXD:{0}".format(mxd))
        messages.addMessage("画像:{0}".format(imgType))

        mxd = arcpy.mapping.MapDocument(mxd);
        df = arcpy.mapping.ListDataFrames(mxd)[0]

        messages.addMessage("MXD距離単位:{0}".format(df.mapUnits))
        if df.mapUnits != "Meters":
            messages.addWarningMessage("距離単位はメートル以外を想定していません。")

        os.mkdir(outDir)
        arcpy.CreateFileGDB_management(outDir, "fgdb.gdb")
        outfgdb =  os.path.join(outDir,"fgdb.gdb")
        arcpy.CreateRasterCatalog_management(outfgdb, "images", df.spatialReference , df.spatialReference, raster_management_type = "UNMANAGED")
        outrc = os.path.join(outfgdb,"images")

        for w in range(0, wCnt):
            for h in range(0, hCnt):
                imgPath = os.path.join(outDir, "img" + str(w) + "_" + str(h))
                newExtent = df.extent
                newExtent.XMin, newExtent.YMax = ext.XMin + mW * w, ext.YMax - mH * h
                newExtent.XMax, newExtent.YMin = newExtent.XMin + mW, newExtent.YMax - mH
                df.extent = newExtent
                if imgType == "JPEG":
                    imgPath = imgPath + ".jpg"
                    messages.addMessage(imgPath)
                    arcpy.mapping.ExportToJPEG (mxd, imgPath, df, df_export_width=pxW, df_export_height=pxH, world_file=True)
                elif imgType == "PNG":
                    imgPath = imgPath + ".png"
                    messages.addMessage(imgPath)
                    arcpy.mapping.ExportToPNG(mxd, imgPath, df, df_export_width=pxW, df_export_height=pxH, world_file=True)
                else:
                    imgPath = imgPath + ".tif"
                    messages.addMessage(imgPath)
                    arcpy.mapping.ExportToTIFF(mxd, imgPath, df, df_export_width=pxW, df_export_height=pxH, geoTIFF_tags=True)
                    
        arcpy.WorkspaceToRasterCatalog_management(outDir, outrc)
        return
カテゴリー: 開発 タグ: パーマリンク