ArcObjects実践
ーオブジェクト・モデル・ダイアグラムの 読み方とヘルプの活用ー
概要
• ArcObjectsとは • COMクラス – インタフェース • オブジェクト・モデル・ダイアグラム(OMD)の読み 方 • ヘルプの読み方 • コーディング例ArcObjectsとは
• ArcGIS Desktopの基となるCOM(Component Object Model)コンポーネント群
• COMに準拠した開発環境で利用可能 – VBA、Visual Basic、Visual C++、・・・ • 単体の製品ではない
COMクラス
• 1つ以上のインタフェースを持つ • インタフェース – プロパティ、メソッドを機能的にグループ化したもの • インタフェースを介してオブジェクトへアクセス GarbageTruck Accelerate Brake Fuel PickUp Dump IGarbage IDrive RaceCar Accelerate Brake Fuel PitStop LapTime IRace IDriveクラスとオブジェクト
• クラス – オブジェクトを作成するためのテンプレート – オブジェクトに対して行うメソッドとプロパティの定義情 報のみが含まれる Map プロパティ Name Scale Layers Projection6
COMクラスの利用方法
• インタフェースを介してCOMクラスのオブジェクトをインス タンス化 1.変数宣言:Dim <オブジェクト変数> As <インタフェース名> 2.オブジェクトのインスタンス化(Set) 3.メソッドの実行、プロパティの取得 / 設定 • 宣言したインタフェースにあるプロパティとメソッドのみ利 用可能 RaceCar Accelerate Brake Fuel PitStop LapTime IRace IDriveSet pCar = New RaceCar
pCar.Accelerate
pCar.Fuel = "Full"
pCar.PitStop ‘エラーが発生
他のインタフェースの利用
• QueryInterface(QI)
– 他のインタフェースのプロパティ、メソッドへアクセス
‘IDriveインタフェースで新規RaceCarを作成
Dim pCar As IDrive
Set pCar = New RaceCar pCar.Accelerate
‘インタフェースの切り替え
Dim pRace As IRace
Set pRace = pCar pRace.PitStop Q I RaceCar Accelerate Brake Fuel PitStop LapTime IRace IDrive
OMD
• ArcMap、ArcCatalog、ArcSceneの設計図 – 各クラスのインタフェース、プロパティ、メソッド – 各クラス間の関連(リレーションシップ)
– UML(Unified Modeling Language)に準拠 • 格納場所(PDF形式)
– ¥arcgis¥arcexe82¥ArcObjects Developer Kit ¥Object Model Diagramsフォルダ
OMD
OMD
• 詳細版(23枚)
Application Framework Map Layer
ArcCatalog Network
ArcMap Output
ArcMap Editor Raster
ArcObjects Controls Spatial Reference
Display Styles
Geocoding TIN
Geodatabase 3D Analyst Extension
Geodatabase(Supplemental) Spatial Analyst Extension
Geometry StreetMap Europe Extension
IMS StreetMap USA Extension
クラスの種類:CoClass
• 新規作成可能
– Newキーワードでオブジェクトを作成
• 他のオブジェクトから取得可能
• 記号:色付きの3Dボックス
Dim pMap As IMap
Set pMap = New Map
Dim pMap As IMap
クラスの種類:Class
• 新規作成不可能
– Newキーワードで作成できない
• 他のオブジェクトから取得可能
• 記号:色なしの3Dボックス
Dim pRow As IRow
クラスの種類:Abstract Class
• 新規作成も他のオブジェクトから取得も不可能 • サブクラスに共通のインタフェースを定義 – サブクラスはAbstract Classにある インタフェースを利用可能 • 記号:色付きの2Dボックスリレーションシップの記号
• 継承 • コンポジション • インスタンス化 • 多重度 • 関連 * _____ Bird Abstract Egg Class Chicken CoClass Farm CoClass Nest CoClass *ArcMapのオブジェクト
* Map Layer FeatureLayer Application Feature FeatureClass 0 .. 1 MxDocument * • クラスとそれらに相当するオブジェクトインタフェース
• プロパティ,メソッドを機能的にグループ化したもの • 各クラスは必ず1つ以上のインタフェースを実装 • インタフェース名:「I∼」 – IMxDocument、IMap、ILayer、・・・ • 記号: ( )プロパティ、メソッドの記号
• プロパティ • メソッド 取得 (read) 取得 (read) (write)設定 設定 (write) 右がRight(Write)プロパティの設定(Write)
• 値渡し(ByVal) – 値あるいはオブジェクトのコピーを設定 • 参照渡し(ByRef) – オブジェクトの参照のみを設定 • 参照先オブジェクトが変更されると同時に影響を受ける pMap.Name = “日本” ‘Setキーワード不要 ‘Setキーワード必要プロパティの取得(Read)
• 値を返す
– Name:String
• オブジェクトの参照(インタフェース)を返す – Document:IDocument
Dim strName As String
strName = Application.Name MsgBox strName
Dim pDoc As IDocument
利用可能なインタフェース
これらのインタフェースも利用可能。 プロパティ、メソッドは別の場所に記述 されている。 これらのインタフェースも利用可能。 プロパティ、メソッドは別の場所に記述 されている。 このインタフェースは利用可能。 全てのプロパティ、メソッドが記述。 このインタフェースは利用可能。 全てのプロパティ、メソッドが記述。 Abstract Classのインタフェースは利用可能 Abstract Classのインタフェースは利用可能復習:COMクラスの利用方法
• インタフェースを介してCOMクラスのオブジェクトをインス タンス化 1.変数宣言:Dim <オブジェクト変数> As <インタフェース名> 2.オブジェクトのインスタンス化(Set) 3.メソッドの実行、プロパティの取得 / 設定 RaceCar Accelerate Brake Fuel PitStop LapTime IRace IDriveSet pCar = New RaceCar
pCar.Accelerate
pCar.Fuel = "Full"
復習:他のインタフェースの利用
• QueryInterface(QI)
– 他のインタフェースのプロパティ、メソッドへアクセス
‘IDriveインタフェースで新規RaceCarを作成
Dim pCar As IDrive
Set pCar = New RaceCar pCar.Accelerate
‘インタフェースの切り替え
Dim pRace As IRace
Set pRace = pCar pRace.PitStop pCar.Accelerate ‘**pCarとpRaceは同じオブジェクトを指す** Q I RaceCar Accelerate Brake Fuel PitStop LapTime IRace IDrive
ArcObjectsでのQI
Dim pDoc As IDocument
Set pDoc = Application.Document MsgBox pDoc.Title
Dim pMxDoc As IMxDocument Set pMxDoc = pDoc 'QI
Dim pLayer As ILayer
コーディングをどこから始めるか? OMDの開始点 • 事前定義されているオブジェクト変数 – Application • IApplicationインタフェースで宣言したApplicationオブジェクト – ThisDocument • IDocumentインタフェースで宣言したMxDocumentオブジェクト Application MxDocument Application IApplication IMxApplication ThisDocument IDocument IMxDocument
ArcObjects Developer Help
• スタート > プログラム > ArcGIS から起動 • 内容
– Getting Started
– Object Model Overviews – Object Model Diagrams – Technical Documents – Utilities
– ArcObjects Controls
– ArcObjects Component Help
ArcObjects Developer Help
• ArcObjects Component Help
F1キー
ArcObjects Component Help
• クラス
• インタフェース
• プロパティ、メソッド • 定数
クラス
解説
インタフェース
解説
インタフェース
プロパティ、メソッド
文法(戻り値) インタフェースへ 解説 Read/Write? 使い方、注意点などの参考情報定数
例:MxDocument > Map > Layer
• レイヤ・タイプを調べる – フィーチャ・レイヤ? – ラスタ・レイヤ? – ?? MxDocument FeatureLayer * MapDim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pMap As IMap
Set pMap = pMxDoc.FocusMap
Dim pLayer As ILayer
Set pLayer = pMap.Layer(1)
‘pLayerはFeatureLayerか?
If TypeOf pLayer Is IFeatureLayer Then
MsgBox "これはフィーチャ・レイヤです"
End If
Layer
*
例:MxDocument > Map > Layer
• MxDocumentオブジェクトの取得 – ThisDocument(事前定義されているオブジェクト変数) • IDocumentインタフェースを指す – Mapを取得するためのプロパティがIMxDocumentイン タフェースに存在 • IDocument ⇒ IMxDocumentにQIDim pMxDoc As IMxDocument
例:MxDocument > Map > Layer
• アクティブなMapオブジェクトの取得 – Map = データ フレーム
– IMxDocumentインタフェースのFocusMapプロパティ
*
Dim pMap As IMap
例:MxDocument > Map > Layer
• Layerオブジェクトの取得
– IMapインタフェースのLayerプロパティ – 引数としてインデックス番号を指定
Dim pLayer As ILayer
Set pLayer = pMap.Layer(1)
0 0
1 1
42
例:MxDocument > Map > Layer
• Layerオブジェクトのタイプを調べる – 取得したLayerオブジェクトはどのようなインタフェース を実装しているか? – TypeOfキーワードを利用 • FeatureLayer⇒IFeatureLayer • RasterLayer⇒IRasterLayer • ・・・
If TypeOf pLayer Is IFeatureLayer Then
MsgBox “これはフィーチャ・レイヤです” Dim pFLayer As IFeatureLayer
Set pFLayer = pLayer 'QI
End If
??Layer
Map Layer OMD Layer ILayer
More ?
• 「VBAによるArcObjectsプログラミング」