凸包


そろそろ作業状態になってきた。。。
Pythonでしかできないことは今のところないし(むしろPythonでは出来ないことが多い)
サンプルレベルでは見た通りExcel VBAレベルなのでArcGISオペレータが多い場合便利かも。
Helpも日本語あるのでHelp見るだけで充分。

SQL クエリ書ける人間の方が多い場合はSQLクエリの方が表現力高いし汎用的。

SciPyとかRの組み合わせやラスタ演算使う必要があれば別だが正直オペレータ用に
GUI用意してやれるのとバージョン互換が期待できるかも程度だと積極的に採用する気にならない。
あとジオプロは、選択セット等ステート持つので不安定だし、大量レコードで落ちたりと言うのも今一つ。

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 = [extentTool]

# Difference
class extentTool(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_layer",
        datatype="GPFeatureLayer",
        parameterType="Required",
        direction="Input")
        
        # 出力FeatureClass
        param1 = arcpy.Parameter(
        displayName="出力フィーチャクラス",
        name="outFeatures",
        datatype="DEFeatureClass",
        parameterType="Required",
        direction="Output")
        return [param0, param1]

    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."""
        return

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

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

        layer = parameters[0].value
        outFullName  = parameters[1].valueAsText

        messages.addMessage(layer.name)
        messages.addMessage(outFullName)

        template = None
        outWs = os.path.dirname(outFullName)
        outFc = os.path.basename(outFullName)

        # messages.addMessage("WS:{0} / Name:{1}".format(outWs,outFc))
        has_m = "DISABLED"
        has_z = "DISABLED"
        spRef = None

        dataset = layer.dataSource
        spRef = arcpy.Describe(dataset).spatialReference
        geomType = "POLYGON" # arcpy.Describe(dataset).shapeType

        arcpy.CreateFeatureclass_management(outWs, outFc, geomType, template, has_m, has_z, spRef)
        arcpy.AddField_management(outFullName, "orgOid", "LONG", 10, "", "", "元のID", "NON_NULLABLE")
        oidCol = arcpy.Describe(layer).OIDFieldName
        outcols = [oidCol,"SHAPE@"]
        
        #if isinstance(extType , unicode):
        #    extType = extType.encode('cp932')
        #else:
        #    extType = str(extType)

        with arcpy.da.SearchCursor(layer, outcols) as cursor, arcpy.da.InsertCursor(outFullName, ["orgOid","SHAPE@"]) as ins:
            for row in cursor:
                
                geom = row[1]
                geom = geom.convexHull()
                 
                ins.insertRow([ row[0], geom ])
        return
カテゴリー: 開発 タグ: パーマリンク