FAQ
テーブルにアタッチメント テーブルを追加する方法

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

概要

テーブルにアタッチメント テーブルを追加して、個々のフィーチャに対して形式にとらわれない付加情報を追加することができます。 アタッチメントと BLOB フィールドとの違いは、1つのフィーチャに対して複数の付加情報をもたせることができ、追加した情報の型や名称も同時に保存できることです。 リンク元のフィーチャが削除されると、アタッチメントテーブル内の情報も削除されます。

アタッチメントは、内部的にはリレーションシップ クラスを使用して実現しています。そのため、アタッチメントの作成には ArcGIS for Desktop Standard / Advanced、もしくは ArcGIS Engine Enterprise GDB ライセンスが必要です。

サンプルコード

アタッチメント テーブルを作成(すでに存在する場合は削除)

//最上位のレイヤーからフィーチャクラスを取得
IMxDocument mxDocument = ArcMap.Document;
IMap map = mxDocument.FocusMap;
ILayer layer = map.get_Layer(0);
IFeatureLayer featureLayer = (IFeatureLayer)layer;
IFeatureClass featureClass = (featureLayer.FeatureClass;

//アタッチメント テーブルを作成
ITableAttachments tableAttachments = (ITableAttachments)featureClass;
if (tableAttachments.HasAttachments)
{
   //すでにアタッチメント テーブルがある場合は削除
   tableAttachments.DeleteAttachments();
}
else
{
   tableAttachments.AddAttachments();
}           
'最上位のレイヤーからフィーチャクラスを取得
Dim mxDocument As IMxDocument = My.ArcMap.Document
Dim map As IMap = mxDocument.FocusMap
Dim layer As ILayer = map.Layer(0)
Dim featureLayer As IFeatureLayer = CType(layer, IFeatureLayer)
Dim featureClass As IFeatureClass = featureLayer.FeatureClass

'アタッチメント テーブルを作成
Dim tableAttachments As ITableAttachments = CType(featureClass, ITableAttachments)
If (tableAttachments.HasAttachments) Then
   'すでにアタッチメント テーブルがある場合は削除
   tableAttachments.DeleteAttachments()
Else
   tableAttachments.AddAttachments()
End If

アタッチメントの追加

//最上位のレイヤーの編集開始
IWorkspace pWorkspace = ((IDataset)ArcMap.Document.FocusMap.get_Layer(0)).Workspace;
UID uID = new UID();
uID.Value = "esriEditor.Editor";
IEditor m_editor;
m_editor = ArcMap.Application.FindExtensionByCLSID(uID) as IEditor;
m_editor.StartEditing(workspace);
m_editor.StartOperation();

IFeatureClass featrueclass =((IFeatureLayer)ArcMap.Document.FocusMap.get_Layer(0)).FeatureClass;
ITableAttachments tableAttachments = (ITableAttachments)featureClass;

if (tableAttachments.HasAttachments)
{
   //アタッチメント オブジェクト新規作成
   IAttachmentManager attachmentManager = tableAttachments.AttachmentManager;
   IAttachment myAttachment1 = new AttachmentClass();
   IAttachment myAttachment2 = new AttachmentClass();

   //アタッチメントする画像の取得
   IMemoryBlobStream memoryBlobStream = new MemoryBlobStreamClass();
   memoryBlobStream.LoadFromFile(@"D:\Sample\Sample1.JPG");
   MemoryBlobStream memoryBlobStream2 = new MemoryBlobStreamClass();
   memoryBlobStream2.LoadFromFile(@"D:\Sample\Sample2.JPG");


   //OID 1 にアタッチメントの追加
   myAttachment1.ContentType = "image/jpeg";
   myAttachment1.Data = memoryBlobStream;
   myAttachment1.Name = "Sample1.JPG";
   attachmentManager.AddAttachment(1, myAttachment1);
   //OID 2 にアタッチメントの追加
   myAttachment2.ContentType = "image/jpeg";
   myAttachment2.Data = memoryBlobStream2;
   myAttachment2.Name = "Sample2.JPG";
   attachmentManager.AddAttachment(2, myAttachment2);

   System.Windows.Forms.MessageBox.Show("アタッチメントの追加完了");
}

//レイヤーの編集終了
m_editor.StopOperation("");
m_editor.StopEditing(true);
'最上位のレイヤーの編集開始
Dim workspace As IWorkspace = (CType(My.ArcMap.Document.FocusMap.Layer(0), IDataset)).Workspace
Dim uID As UID = New UID()
uID.Value = "esriEditor.Editor"
Dim m_editor As IEditor
m_editor = CType(My.ArcMap.Application.FindExtensionByCLSID(uID), IEditor)
m_editor.StartEditing(workspace)
m_editor.StartOperation()

Dim featureClass As IFeatureClass = CType(My.ArcMap.Document.FocusMap.Layer(0), IFeatureLayer).FeatureClass
Dim tableAttachments As ITableAttachments = CType(featureClass, ITableAttachments)

If (tableAttachments.HasAttachments) Then

   'アタッチメント オブジェクト新規作成
   Dim attachmentManager As IAttachmentManager = tableAttachments.AttachmentManager
   Dim myAttachment1 As IAttachment = New AttachmentClass()
   Dim myAttachment2 As IAttachment = New AttachmentClass()

   'アタッチメントする画像の取得()
   Dim memoryBlobStream1 As IMemoryBlobStream = New MemoryBlobStreamClass()
   memoryBlobStream1.LoadFromFile("D:\Sample\Sample1.JPG")
   Dim memoryBlobStream2 As IMemoryBlobStream = New MemoryBlobStreamClass()
   memoryBlobStream2.LoadFromFile("D:\Sample\Sample2.JPG")

   'OID 1 にアタッチメントの追加
   myAttachment1.ContentType = "image/jpeg"
   myAttachment1.Data = memoryBlobStream1
   myAttachment1.Name = "Sample1.JPG"
   attachmentManager.AddAttachment(1, myAttachment1)
   'OID 2 にアタッチメントの追加
   myAttachment2.ContentType = "image/jpeg"
   myAttachment2.Data = memoryBlobStream2
   myAttachment2.Name = "Sample2.JPG"
   attachmentManager.AddAttachment(2, myAttachment2)

   MessageBox.Show("アタッチメントの追加完了")

End If

'レイヤーの編集終了()
m_editor.StopOperation("")
m_editor.StopEditing(True)

追加したアタッチメントの取得

//フィーチャクラスの取得
IFeatureClass featureClass = ((IFeatureLayer)ArcMap.Document.FocusMap.get_Layer(0)).FeatureClass;
//アタッチメント テーブルの取得
ITableAttachments tableAttachments = (ITableAttachments)featureClass;
IAttachmentManager attachmentManager = tableAttachments.AttachmentManager;

//2 つのアタッチメントを列挙型として取得
ILongArray parentIdArray = new LongArrayClass();
parentIdArray.Add(1);
parentIdArray.Add(2);
IEnumAttachment enumAttachment = attachmentManager.GetAttachmentsByParentIDs(parentIdArray, true);
enumAttachment.Reset();
IAttachment attachment = null;

//取得したリストから各アタッチメントを取得
while ((attachment = enumAttachment.Next()) != null)
{
   MessageBox.Show(attachment.AttachmentID + "   " + attachment.Name);
}
'フィーチャクラスの取得
Dim aFeatureClass As FeatureClass = CType(My.ArcMap.Document.FocusMap.Layer(0), IFeatureLayer).FeatureClass
'アタッチメント テーブルの取得
Dim tableAttachments2 As ITableAttachments = CType(aFeatureClass, ITableAttachments)
Dim attachmentManager2 As IAttachmentManager = tableAttachments2.AttachmentManager

'2 つのアタッチメントを列挙型として取得
Dim parentIdArray As ILongArray = New LongArrayClass()
parentIdArray.Add(1)
parentIdArray.Add(2)
Dim enumAttachment As IEnumAttachment = attachmentManager2.GetAttachmentsByParentIDs(parentIdArray, True)
enumAttachment.Reset()
Dim attachment As IAttachment = Nothing
attachment = enumAttachment.Next()

'取得したリストから各アタッチメントを取得
Do Until (attachment Is Nothing)

   MessageBox.Show(attachment.AttachmentID & "   " & attachment.Name)
   attachment = enumAttachment.Next()

Loop

追加したアタッチメントの削除

//レイヤーのアタッチメント テーブルを取得
IFeatureLayer featureLayer = (IFeatureLayer)ArcMap.Document.FocusMap.get_Layer(0);
IFeatureClass featureClass = featureLayer.FeatureClass;
ITableAttachments tableAttachments = (ITableAttachments)featureClass;
IAttachmentManager attachmentManager = tableAttachments.AttachmentManager;

//レイヤーの編集開始
IDataset dataset = (IDataset)featureLayer;
IWorkspace workspace = dataset.Workspace;
UID uID = new UID();
uID.Value = "esriEditor.Editor";
IEditor m_editor;
m_editor = ArcMap.Application.FindExtensionByCLSID(uID) as IEditor;
m_editor.StartEditing(workspace);
m_editor.StartOperation();

//OID 1 にあるアタッチメントのみ削除
attachmentManager.DeleteAttachmentsForParent(1);

//レイヤーの編集終了
m_editor.StopOperation("");
m_editor.StopEditing(true);

MessageBox.Show("アタッチメントの削除完了");
'レイヤーのアタッチメント テーブルを取得
Dim featureLayer As IFeatureLayer = CType(My.ArcMap.Document.FocusMap.Layer(0), IFeatureLayer)
Dim featureClass As FeatureClass = featureLayer.FeatureClass
Dim tableAttachments As ITableAttachments = CType(featureClass, ITableAttachments)
Dim attachmentManager As IAttachmentManager = tableAttachments.AttachmentManager

'最上位のレイヤーの編集開始
Dim dataset As IDataset = CType(FeatureClass, IDataset)
Dim workspace As IWorkspace = dataset.Workspace
Dim uID As UID = New UID()
uID.Value = "esriEditor.Editor"
Dim m_editor As IEditor
m_editor = CType(My.ArcMap.Application.FindExtensionByCLSID(uID), IEditor)
m_editor.StartEditing(workspace)
m_editor.StartOperation()

'OID 1 にあるアタッチメントのみ削除
attachmentManager.DeleteAttachmentsForParent(1)

'レイヤーの編集終了
m_editor.StopOperation("")
m_editor.StopEditing(True)

MessageBox.Show("アタッチメントの削除完了")

メタデータ

機能

種類

製品