ArcObjects@PowerShell


多少ネタが溜まって来たのでちょろちょろ吐き出し

PowerShellは.NETが使える。
当然ArcObjectsも動く。ただしComObjectsはリフレクションを経由。
PowerShelはx86のSysWOW64下のものを使う必要がある。
C:\Windows\SysWOW64\WindowsPowerShell\v1.0

コンパイル不要でスクリプト操作できArcPyよりも高機能!って書くとよさげに見えるが微妙だなぁ

[System.Reflection.Assembly]::LoadWithPartialName("ESRI.ArcGIS.Version")
[System.Reflection.Assembly]::LoadWithPartialName("ESRI.ArcGIS.Carto")
[System.Reflection.Assembly]::LoadWithPartialName("ESRI.ArcGIS.Geometry")
[System.Reflection.Assembly]::LoadWithPartialName("ESRI.ArcGIS.Display")
[System.Reflection.Assembly]::LoadWithPartialName("ESRI.ArcGIS.esriSystem")

[ESRI.ArcGIS.RuntimeManager]::BindLicense([ESRI.ArcGIS.ProductCode]::EngineOrDesktop)

$doc = New-Object ESRI.ArcGIS.Carto.MapDocumentClass
$doc.Open("C:\Program Files (x86)\ArcGIS\DeveloperKit10.1\Samples\data\World\World.mxd")

$typeActiveView = [ESRI.ArcGIS.Carto.IActiveView]
$propFocusMap = $typeActiveView.GetProperty("FocusMap")

$map = $propFocusMap.GetValue($doc.ActiveView)

$typeMap = [ESRI.ArcGIS.Carto.IMap]
$propAreaOfInterest = $typeMap.GetProperty("AreaOfInterest")


$t = [ESRI.ArcGIS.Carto.IActiveView]
$p = $t.GetProperty("FullExtent")
$env = $p.GetValue($map)

$typeEnv = [ESRI.ArcGIS.Geometry.IEnvelope]
$methodPutCoords = $typeEnv.GetMethod("PutCoords")

$xmin = $typeEnv.GetProperty("XMin")
$ymin = $typeEnv.GetProperty("YMin")
$width = $typeEnv.GetProperty("Width")
$height = $typeEnv.GetProperty("Height")
$xmin = $xmin.GetValue($env)
$ymin = $ymin.GetValue($env)
$width = $width.GetValue($env)
$height = $height.GetValue($env)

$xmax = $xmin + $width  / 2.0
$ymax = $ymin + $height / 2.0

$array = @( $xmin, $ymin , $xmax, $ymax)
$methodPutCoords.Invoke($env, $array)

$propAreaOfInterest.SetValue($map, $env)
$doc.Save()
カテゴリー: 運用, 開発 タグ: , パーマリンク