YouTube | Facebook | X(Twitter) | RSS

ソートしたテーブルの作成

2016/9/1 (木)

'******************************************************************************
' 定義      :Private Function CreateSortedTable()
' 概要      :ソートしたテーブル・フィーチャクラスの取得
' 備考      :元のテーブルをソートしてInMemoryWorkspaceへ出力して返す
' 第1引数   :Table          入力テーブル・フィーチャクラス
' 第2引数   :FieldName      ソート対象フィールド名
' 第3引数   :Ascending      (オプション デフォルト値:True)昇順
' 第4引数   :CaseSensitive  (オプション デフォルト値:False)大文字・小文字の区別
' 戻り値    :ITable         Table・FeatureClass
' 更新履歴  :2010-04-16 作成
'******************************************************************************
Private Function CreateSortedTable(Table As ITable, FieldName As String, Optional Ascending As Boolean = True, Optional CaseSensitive As Boolean = False) As ITable
 
    Dim pTableSort As ITableSort
    Set pTableSort = New TableSort
    pTableSort.Ascending(FieldName) = Ascending
    pTableSort.CaseSensitive(FieldName) = CaseSensitive
    pTableSort.Fields = FieldName
    Set pTableSort.Table = Table
    pTableSort.Sort Nothing
     
    Dim pCursor As ICursor
    Set pCursor = pTableSort.Rows
     
    Dim pFeatureWorkspace As IFeatureWorkspace
    Set pFeatureWorkspace = GetInMemoryWorkspace("temp")
     
    Dim pTable As ITable
     
    If Table Is IFeatureClass Then
        Set pTable = pFeatureWorkspace.CreateFeatureClass("Temp", Table.Fields, Nothing, Nothing, esriFTSimple, "Shape", "")
    Else
        Set pTable = pFeatureWorkspace.CreateTable("Temp", Table.Fields, Nothing, Nothing, "")
    End If
     
    Dim i As Long
     
    Dim pRow As IRow
    Set pRow = pCursor.NextRow
     
    Dim pInsertCursor As ICursor
    Set pInsertCursor = pTable.Insert(True)
     
    Dim pInsertRow As IRow
    Set pInsertRow = pTable.CreateRowBuffer
 
    Do Until pRow Is Nothing
 
        For i = 1 To pTable.Fields.FieldCount - 1
             
            If Not pRow.Fields.Field(i).Name = "Shape_Length" And _
                Not pRow.Fields.Field(i).Name = "Shape_Area" And _
                Not pRow.Fields.Field(i).Name = "OBJECTID" Then
                 
             pInsertRow.Value(i) = pRow.Value(i)
              
            End If
             
        Next i
         
        pInsertCursor.InsertRow pInsertRow
 
        Set pRow = pCursor.NextRow
    Loop
     
    pInsertCursor.Flush
     
    Set SortTable = pTable
 
 
End Function
 
'******************************************************************************
' 定義      :Private Function GetInMemoryWorkspace()
' 概要      :InMemoryWorkspaceの取得
' 備考      :このWorkspaceではCreateFeatureDatasetやCreateQyeryDefは無効
' 第1引数   :String         Workspace名
' 第2引数   :Boolean        (オプション デフォルト値:True)InMemoryWorkspaceを新規作成するかどうか
' 第3引数   :IPropertySet   (オプション デフォルト値:Nothing)DBMSへの接続情報
' 第4引数   :Long           (オプション デフォルト値:0)ウィンドウ ハンドル
' 戻り値    :IWorkspace     Workspace
' 更新履歴  :2008-05-28 作成
'******************************************************************************
Private Function GetInMemoryWorkspace(Name As String, Optional Create As Boolean = True, Optional ConnectionProperties As IPropertySet = Nothing, Optional hWnd As Long = 0) As IWorkspace
    Dim pWorkspaceFactory As IWorkspaceFactory
    Dim pName As IName
    Set pWorkspaceFactory = New InMemoryWorkspaceFactory
     
    If Create = True Then
        Set pName = pWorkspaceFactory.Create("", Name, ConnectionProperties, hWnd)
        Set GetInMemoryWorkspace = pName.Open
    Else
        Set GetInMemoryWorkspace = pWorkspaceFactory.Open(ConnectionProperties, hWnd)
    End If
     
End Function
  • この記事を書いた人

羽田 康祐

伊達と酔狂のGISエンジニア。GIS上級技術者、Esri認定インストラクター、CompTIA CTT+ Classroom Trainer、潜水士、PADIダイブマスター、四アマ。WordPress は 2.1 からのユーザーで歴だけは長い。 代表著書『"地図リテラシー入門―地図の正しい読み方・描き方がわかる』 GIS を使った自己紹介はこちら。ESRIジャパン(株)所属、元青山学院大学非常勤講師を兼務。日本地図学会第31期常任委員。発言は個人の見解です。

-プログラミング, ArcGIS
-,