FAQ
IBasicGeoprocessorのDissolveメソッドを使用する方法

ナレッジ番号:5510 | 登録日:2023/07/27 | 更新日:2024/11/21

【概要】

IBasicGeoprocessorは5つのメソッド(Dissolve, Merge, Clip, Intersect, Union)を持っています。
Dissolveは指定したフィールド値に基づく入力テーブル内のレコードを集めて新規テーブルを作成します。
以下に、新規フィーチャ・レイヤとスタンドアロン・テーブルを作成するためにDissolveを使用して
出力テーブルを作成する方法を示します。


【手順】

Dissolveの構文は以下の通りです。



Set variable = object.Dissolve(InputTable, useSelected, dissolveField, _

  summaryFields, outputName)


object - IBasicGeoprocessorオブジェクトを評価するオブジェクト式
variable - ITableを実装するオブジェクトへの参照
InputTable - ITableオブジェクト
useSelected - useSelectedの状態を表すBoolean式。InputTableの選択サブセットがディゾルブされるかどうかを制御します。
Trueに設定すると選択サブセットがディゾルブされます。Falseに設定すると選択 サブセットが無視され、
全体のセットでディゾルブされます。
dissolveField - dissolveFieldを表す文字列式
summaryFields - summaryFieldsを表す文字列式
outputName - IDatasetNameオブジェクト

summaryFields引数は生成されるサマリ・フィールドのリストのカンマ・デリミタ文字列です。
サマリ・オペレーションは以下のものを含みます。

  • Dissolve
  • Count
  • Minimum
  • Maximum
  • Sum
  • Average
  • Variance
  • StdDev

    summaryFields引数の構文は以下の通りです。

    
    
    "オペレーション1.フィールド名1, オペレーション2.フィールド名2, ... , 
    
                               オペレーションN.フィールド名N"
    
    
    

    新規フィーチャレイヤを作成するために出力テーブルを使用する場合、
    summaryFields文字列の最初にDissolve.Shapeを挿入する必要があります。

    
    
    "Dissolve.Shape, Sum.Area, StdDev.Population" 
    
    
    

    スタンドアロン・サマリ・テーブルを作成したい場合、summaryFields文字列からDissolve.Shapeを省略します。

    
    
    "Sum.Area, StdDev.Population"
    
    
    
  • 以下のサンプルはSUB_REGIONとAREAというフィールドを持ったSTATESというレイヤがあると仮定しています。

例1:


Public Sub Dissolve()
  Dim pDoc As IMxDocument
  Set pDoc = ThisDocument
  Dim pMap As IMap
  Set pMap = pDoc.FocusMap 

                      




  ' STATESレイヤを取得します。
  Dim pLayer As ILayer
  Dim pInputFeatLayer As IFeatureLayer
  Dim intCount As Integer
  For intCount = 0 To pMap.LayerCount - 1
    Set pLayer = pMap.Layer(intCount)
    If TypeOf pLayer Is IFeatureLayer Then
      If pLayer.Name = "STATES" Then
        Set pInputFeatLayer = pLayer
        Exit For
      End If
    End If
  Next
  If pInputFeatLayer Is Nothing Then
    MsgBox "STATESレイヤは見つかりませんでした"
    Exit Sub
  End If

  ' 入力テーブルを取得します。
  ' レイヤからITableインタフェースを使用します。
  Dim pInputTable As ITable
  Set pInputTable = pInputFeatLayer

  ' エラーチェック
  If pInputTable Is Nothing Then
    MsgBox "TableへのQIに失敗しました"
    Exit Sub
  End If

  ' 入力レイヤにSUB_REGIONフィールドがあるかどうか確認します。
  If pInputTable.FindField("SUB_REGION") = -1 Then
    MsgBox "STATESレイヤにSUB_REGIONフィールドが必要です"
    Exit Sub
  End If

  ' 出力用フィーチャクラスのFeatureClassNameを作成します。
  Dim pInputFeatCLass As IFeatureClass
  Set pInputFeatCLass = pInputFeatLayer.FeatureClass
  Dim pFeatClassName As IFeatureClassName
  Set pFeatClassName = New FeatureClassName
  With pFeatClassName
    .FeatureType = esriFTSimple
    .ShapeFieldName = "Shape"
    .ShapeType = pInputFeatCLass.ShapeType
  End With

  ' 出力先フォルダと出力FeatureClassNameを設定します。
  Dim pNewWSName As IWorkspaceName
  Set pNewWSName = New WorkspaceName
  pNewWSName.WorkspaceFactoryProgID = _
  "esriCore.ShapefileWorkspaceFactory.1"
  pNewWSName.PathName = "c:\temp"

  Dim pDatasetName As IDatasetName
  Set pDatasetName = pFeatClassName
  pDatasetName.Name = "Dissolve_result"

  Set pDatasetName.WorkspaceName = pNewWSName

  ' ディゾルブを実行します。
  ' 引数としてサマリ・フィールドを示す文字列(Dissolve.Shape, 



  ' 


Minimum.state_name ...)があります。
  ' これは作成するサマリ・フィールドをカンマ区切りで区切った文字列になります。
  ' 書式は以下のとおりです。
  ' <オペレーション・コード1>.<フィールド名1>, <オペレーション・コードN>.<フィールド名N>
  ' オペレーション・コード:Dissolve, Count, Minimum, Maximum, Sum, Average, 

  ' 
Variance, StdDev
  ' 
  ' 空間データをディゾルブするため、Dissolve.Shapeが必要となります。
  Dim iBGP As IBasicGeoprocessor
  Set iBGP = New BasicGeoprocessor
  Dim pOutputTable As ITable
  Set pOutputTable = iBGP.Dissolve(pInputTable, False, "SUB_REGION", _
  "Dissolve.Shape, Minimum.SUB_REGION, Count.SUB_REGION, Average.AREA", _
  pDatasetName)

  ' 出力結果をマップに追加します。
  Dim pOutputFeatClass As IFeatureClass
  Set pOutputFeatClass = pOutputTable

  ' エラーチェック
  If pOutputFeatClass Is Nothing Then
    MsgBox "FeatureClassへのQIに失敗しました"
    Exit Sub
  End If

  Dim pOutputFeatLayer As IFeatureLayer
  Set pOutputFeatLayer = New FeatureLayer
  Set pOutputFeatLayer.FeatureClass = pOutputFeatClass
  pOutputFeatLayer.Name = pOutputFeatClass.AliasName
  pMap.AddLayer pOutputFeatLayer
End sub



例2:


Sub CreateSummaryTable()
  ' Dissolveメソッドを使用してサマリ・テーブルを作成し、



  ' 


スタンドアロン・テーブルとしてArcMapへ追加します。
  ' マクロを実行し、TOCのソース・タブをクリックすると新規テーブルが表示されます。

  Dim pDoc As IMxDocument
  Set pDoc = ThisDocument
  Dim pMap As IMap
  Set pMap = pDoc.FocusMap




  ' STATESレイヤを取得します。



  Dim pLayer As ILayer
  Dim pInputFeatLayer As IFeatureLayer
  Dim intCount As Integer
  For intCount = 0 To pMap.LayerCount - 1
    Set pLayer = pMap.Layer(intCount)
    If TypeOf pLayer Is IFeatureLayer Then
      If pLayer.Name = "STATES" Then
        Set pInputFeatLayer = pLayer
        Exit For
      End If
    End If
  Next
  If pInputFeatLayer Is Nothing Then
    MsgBox "


STATESレイヤは見つかりませんでした


"
    Exit Sub
  End If




  ' 入力テーブルを取得します。
  ' レイヤからITableインタフェースを使用します。



  Dim pInputTable As ITable
  Set pInputTable = pInputFeatLayer




  ' エラーチェック



  If pInputTable Is Nothing Then
    MsgBox "


TableへのQIに失敗しました


"
    Exit Sub
  End If




  ' 入力レイヤにSUB_REGIONフィールドがあるかどうか確認します。



  If pInputTable.FindField("SUB_REGION") = -1 Then
    MsgBox "


STATESレイヤにSUB_REGIONフィールドが必要です


"
    Exit Sub
  End If

  ' 出力先を設定します。
  Dim pNewWSName As IWorkspaceName
  Set pNewWSName = New WorkspaceName
  pNewWSName.WorkspaceFactoryProgID = _
  "esriCore.ShapefileWorkspaceFactory.1"
  pNewWSName.PathName = "c:\temp"

  ' 出力用テーブルのTableNameを作成します。
  Dim pOutTabName As ITableName
  Set pOutTabName = New TableName
  Dim pDatasetName As IDatasetName
  Set pDatasetName = pOutTabName
  pDatasetName.Name = "dissolve_summary_tab"
  Set pDatasetName.WorkspaceName = pNewWSName




  ' ディゾルブを実行します。
  ' 引数としてサマリ・フィールドを示す文字列(Dissolve.Shape, 





  ' 




Minimum.state_name ...)があります。
  ' これは作成するサマリ・フィールドをカンマ区切りで区切った文字列になります。
  ' 書式は以下のとおりです。
  ' <オペレーション・コード1>.<フィールド名1>, <オペレーション・コードN>.<フィールド名N>
  ' オペレーション・コード:Dissolve, Count, Minimum, Maximum, Sum, Average, 





  ' 




Variance, StdDev
  ' 



  ' スタンドアロン・テーブルを作成するので、Dissolve.Shapeは指定しません。
  Dim iBGP As IBasicGeoprocessor
  Set iBGP = New BasicGeoprocessor
  Dim pOutputTable As ITable
  Set pOutputTable = iBGP.Dissolve(pInputTable, False, "SUB_REGION", _
  "Minimum.SUB_REGION, Count.SUB_REGION, Average.AREA", pDatasetName)




  ' 出力結果をマップに追加します。



  Dim pStTab As IStandaloneTable
  Set pStTab = New StandaloneTable
  Set pStTab.Table = pOutputTable
  Dim pStTabColl As IStandaloneTableCollection
  Set pStTabColl = pMap
  pStTabColl.AddStandaloneTable pStTab

  ' TOCを再描画します。
  pDoc.UpdateContents
End Sub

メタデータ

機能

種類

製品