入力フィールドから出力フィールドへのマッピング
一般的なジオプロセシング タスクの 1 つは、複数のデータセットを新規または既存のデータセット 1 つに統合して、より広いエリアをカバーするデータセットまたはより多くのレコードを含んだテーブルを作成することです。マージ操作やアペンド操作に使用する入力のすべての属性やフィールドが同じであることが多いですが、時々それらが一致せず、名前やタイプが異なるフィールド間の関係をマッピングしなければならないことがあります。フィールドのマッピングの一例として、[データ管理 ツール] ツールボックスの [マージ(Merge)] ツールを使用すれば、データが適切な出力フィールドに正しい値で配置されるように、この関係のマッピングを容易に行うことができます。
FieldMap オブジェクトは、値を提供する一連のテーブルまたはフィーチャクラスから入力フィールドの定義とそれらのリストを提供します。
FieldMap オブジェクトのプロパティには、入力テキスト値の開始位置と終了位置が含まれるため、入力値の一部を使って新しい出力値を作成することができます。FieldMap オブジェクトに同じテーブルまたはフィーチャクラスからの複数入力フィールドが含まれる場合、各レコードの値は mergeRule プロパティを使用してマージされます。これは、たとえば「国道」と「1 号」のように、道路タイプが含まれているフィールドと道路名が含まれているフィールドの値を結合するのに役立ちます。FieldMap の joinDelimiter プロパティは、mergeRule の値として Join が指定されている場合に使用されます。スペースなど、任意の文字のセットを区切り文字として使用できます。前記の例では、「国道 1 号」という値が作成されます。
プロパティ |
説明 |
---|---|
inputFieldCount |
定義されている入力フィールドの数。 |
joinDelimiter |
出力フィールドのタイプが文字列であり、mergeRule が Join である場合に、同じテーブルからの入力値を区切るために使用される文字列値。 |
mergeRule |
同じ入力テーブルからの複数フィールドの値を単一の出力値にマージする方法を定義します。有効な選択項目は次のとおりです。
|
outputField |
出力フィールドのプロパティが設定されるか、フィールド オブジェクトに返されます。 |
メソッド |
説明 |
---|---|
addInputField(table_dataset, field_name, {start_position}, {end_position}) |
フィールドの名前を指定して、入力フィールドのリストにフィールドを追加します。パラメータには、フィールドの入力テーブルまたはフィーチャクラスのパス、フィールドの名前、およびフィールド値の開始位置と終了位置(テキスト フィールドからの入力値の場合)が含まれます。 |
findInputFieldIndex (table_dataset, field_name) |
FieldMap の入力フィールドのリストに含まれる特定のフィールドのインデックス位置を返します。 |
getEndTextPosition(index) |
新しい出力値の終了位置として使用される、入力フィールド値の中の位置を返します。このプロパティは、入力フィールドのタイプがテキストである場合のみ使用されます。 |
getInputFieldName(index) |
特定の入力フィールドのフィールド名を返します。 |
getInputTableName(index) |
特定の入力フィールドのテーブル名を返します。 |
getStartTextPosition(index) |
新しい出力値の開始位置として使用される、入力フィールド値の中の位置を返します。このプロパティは、入力フィールドのタイプがテキストである場合のみ使用されます。 |
removeAll() |
FieldMap の入力フィールドのリスト内容を削除します。 |
removeInputField(index) |
FieldMap の入力フィールドのリストから入力フィールドを削除します。 |
setEndTextPosition(index, end_position) |
新しい出力値の定義に使用される、入力値の最終文字の位置を示す値を定義します。このプロパティは、入力フィールドのタイプがテキストである場合のみ使用されます。 |
setStartTextPosition(index, start_position) |
新しい出力値の定義に使用される、入力値の先頭文字の位置を示す値を定義します。このプロパティは、入力フィールドのタイプがテキストである場合のみ使用されます。 |
FieldMappings オブジェクトは FieldMap オブジェクトのコレクションで、マージ などのフィールド マッピングを実行するツールのパラメータ値として使用されます。これらのオブジェクトを操作する最も簡単な方法は、まず FieldMappings オブジェクトを作成した後、結合対象の入力フィーチャクラスまたはテーブルを追加することにより、そのオブジェクトの FieldMap オブジェクトを初期化することです。すべての入力が指定された後、FieldMappings オブジェクトには、そのすべての入力の一意なフィールド名ごとに FieldMap オブジェクトまたは出力フィールドを 1 つずつ含まれます。このリストは、新しいフィールドを追加する、出力フィールドのプロジェクトまたは内容を変更する、必要のない出力フィールドを削除することにより、変更できます。
プロパティ |
説明 |
---|---|
fieldCount |
出力フィールドの数。 |
fieldValidationWorkspace |
ワークスペース タイプによって、属性フィールドの命名規則が定義されます。これらの規則は、出力フィールド名を決定する際に使用されます。これらの名前は、入力テーブルまたはフィーチャクラスからの入力フィールドの名前を基にしています。たとえば、シェープファイルを含むファイル システム ワークスペースのフィールド名は、最大長 10 文字に制限されます。 |
fields |
field オブジェクトのリスト。それぞれのフィールド オブジェクトは、それぞれの出力フィールドのプロパティを表します。 |
メソッド |
説明 |
---|---|
addFieldMap(field_map) |
新しい出力フィールドを定義する FieldMap オブジェクトを追加します。 |
addTable(table_dataset) |
出力フィールドの定義に使用されるフィールドをもつテーブルまたはフィーチャクラスを指定します。 |
exportToString() |
FieldMappings オブジェクトの内容を文字列値に保存します。 |
findFieldMapIndex(field_map_name) |
出力フィールドの名前を使用して、出力フィールドを定義する FieldMap オブジェクトのリストに含まれる、そのフィールドの FieldMap オブジェクトの位置を返します。 |
getFieldMap(index) |
FieldMap のリスト内でのインデックス位置を使用して、出力フィールドのリストに含まれる FieldMap オブジェクトを返します。 |
loadFromString() |
FieldMappings オブジェクトの文字列定義を使用して、FieldMappings オブジェクトの内容を設定します。 |
removeAll() |
FieldMap リストの内容を削除して、出力フィールドが定義されていない状態にします。 |
removeFieldMap(index) |
出力フィールドを定義する FieldMap オブジェクトのリストにある出力フィールドを削除します。 |
replaceFieldMap(index, value) |
出力フィールドを定義する FieldMap オブジェクトのリストにある既存の出力フィールドを、新しい FieldMap オブジェクトからの出力フィールドに置き換えます。 |
次の例では、米国の国勢調査データが含まれているいくつかのフィーチャクラスをマージして、新しいフィーチャクラスを作成します。すべての入力に含まれている入力属性の 1 つに、数値フィールド STFID があります。この 15 桁の値は、アメリカのすべての国勢調査ブロックを一意に識別します。この値は 4 つの構成要素に分割することができます。最初の 2 桁は州コード、次の 3 桁は郡コード、次の 6 桁は国勢調査区域、最後の 4 桁は国勢調査ブロックを示します。360899912001006 という値は、ニューヨーク州(36)セントローレンス郡(089)の国勢調査区域(991200)にある、ニューヨーク州ポツダムのニューヨーク州立大学が含まれている国勢調査ブロック(1006)を表しています。入力データには STFID 属性しか含まれていないため、このスクリプト例ではこれらのフィーチャクラスをマージし、さらに 2 つの新しいフィールド TRACTID および BLOCKID を作成します。そのためには、addTable メソッドを使って FieldMappings オブジェクトを初期化し、それぞれの入力を追加します。続いて、2 つの新しい FieldMap オブジェクトを作成し、そのプロパティを設定し、それらを FieldMappings オブジェクトに追加することにより、デフォルトの FieldMappings オブジェクトを変更します。
import arcpy from arcpy import env env.workspace = "C:/Data/CityBlocks.gdb" outfc = "C:/Data/CityBlocks.gdb/AllBlocks" # Each of the input Feature classes has an STFID, which is the # combination of the Tract ID and Block ID for each block. # Separate these values out from this field into two new # fields, TRACTID and BLOCKID. # # Create a fieldmappings and two new fieldmaps. # fieldmappings = arcpy.FieldMappings() fldmap_TRACTID = arcpy.FieldMap() fldmap_BLOCKID = arcpy.FieldMap() # List all the feature classes in the workspace that start with # 'block' in their name and are of polygon feature type. # fcs = arcpy.ListFeatureClasses("block*", "Polygon") # Create a value table that will hold the input feature classes to Merge # vTab = arcpy.ValueTable() for fc in fcs: # Adding a table is the fast way to load all the fields from the # input into fieldmaps held by the fieldmappings object. # fieldmappings.addTable(fc) # In this example also create two fieldmaps by 'chopping up' # an input field. Feed the chopped field into the new fieldmaps. # fldmap_TRACTID.addInputField(fc, "STFID") fldmap_BLOCKID.addInputField(fc, "STFID") # Populate the input value table with feature classes # vTab.addRow(fc) # Set the starting and ending position of the fields going into the # TractID fieldmap. This is the location in the STFID field where the # TractID falls. # for x in range(0, fldmap_TRACTID.inputFieldCount): fldmap_TRACTID.setStartTextPosition(x, 5) fldmap_TRACTID.setEndTextPosition(x, 10) # Set the Name of the Field output from this field map. # fld_TRACTID = fldmap_TRACTID.outputField fld_TRACTID.name = "TRACTID" fldmap_TRACTID.outputField = fld_TRACTID # Set the starting and ending position of the fields going into the # BlockID fieldmap. This is the location in the STFID field where the # blockID falls. # for x in range(0, fldmap_BLOCKID.inputFieldCount): fldmap_BLOCKID.setStartTextPosition(x, 11) fldmap_BLOCKID.setEndTextPosition(x, 16) # Set the Name of the Field output from this field map. # fld_BLOCKID = fldmap_BLOCKID.outputField fld_BLOCKID.name = "BLOCKID" fldmap_BLOCKID.outputField = fld_BLOCKID # Add the custom fieldmaps into the fieldmappings object. # fieldmappings.addFieldMap(fldmap_TRACTID) fieldmappings.addFieldMap(fldmap_BLOCKID) # Run the Merge tool. # arcpy.Merge_management(vTab, outfc, fieldmappings)
次の例では、FieldMappings オブジェクトの addTable メソッドを使用して FieldMap オブジェクトを作成した後、このオブジェクトを変更する方法を示します。この方法は、異なる名前を持つ入力のフィールドが、論理的には同じ値を含んでいる場合に重要となります。
import arcpy outfc = "C:/data/CityData.gdb/AllBlocks" # Want to merge these two feature classes together. Have a field # that has the same content but the names are slightly different: # Blocks1 has TRACT2000 and Blocks2 TRACTCODE. Name the output # the same as Blocks1. # fc1 = "C:/data/CityData.gdb/Blocks1" fc2 = "C:/data/CityData.gdb/Blocks2" # Create a new fieldmappings and add the two input feature classes. # fieldmappings = arcpy.FieldMappings() fieldmappings.addTable(fc1) fieldmappings.addTable(fc2) # First get the TRACT2000 fieldmap. Then add the TRACTCODE field # from Blocks2 as an input field. Then replace the fieldmap within # the fieldmappings object. # fieldmap = fieldmappings.getFieldMap(fieldmappings.findFieldMapIndex("TRACT2000")) fieldmap.addInputField(fc2, "TRACTCODE") fieldmappings.replaceFieldMap(fieldmappings.findFieldMapIndex("TRACT2000"), fieldmap) # Remove the TRACTCODE fieldmap. # fieldmappings.removeFieldMap(fieldmappings.findFieldMapIndex("TRACTCODE")) # Create a value table that will hold the inputs for Merge. # vTab = arcpy.ValueTable() vTab.addRow(fc1) vTab.addRow(fc2) # Run the Merge tool. # arcpy.Merge_management(vTab, outfc, fieldmappings)