入力フィールドから出力フィールドへのマッピング
一般的なジオプロセシング タスクの 1 つは、複数のデータセットを新規または既存のデータセット 1 つに統合して、より広いエリアをカバーするデータセットまたはより多くのレコードを含んだテーブルを作成することです。マージ操作やアペンド操作に使用する入力のすべての属性やフィールドが同じであることが多いですが、時々それらが一致せず、名前やタイプが異なるフィールド間の関係をマッピングしなければならないことがあります。フィールドのマッピングの一例として、[データ管理] ツールボックスの [マージ(Merge)] ツールを使用すれば、データが適切な出力フィールドに正しい値で配置されるように、この関係のマッピングを容易に行うことができます。
FieldMap
FieldMap オブジェクトは、値を提供する一連のテーブルまたはフィーチャクラスから入力フィールドの定義とそれらのリストを提供します。
FieldMap オブジェクトのプロパティには、入力テキスト値の開始位置と終了位置が含まれるため、入力値の一部を使って新しい出力値を作成することができます。FieldMap オブジェクトに同じテーブルまたはフィーチャクラスからの複数入力フィールドが含まれる場合、各レコードの値は mergeRule プロパティを使用してマージされます。これは、たとえば「国道」と「1 号」のように、道路タイプが含まれているフィールドと道路名が含まれているフィールドの値を結合するのに役立ちます。FieldMap の joinDelimiter プロパティは、mergeRule の値として Join が指定されている場合に使用されます。スペースなど、任意の文字のセットを区切り文字として使用できます。前記の例では、「国道 1 号」という値が作成されます。
Fieldmappings
FieldMappings オブジェクトは FieldMap オブジェクトのコレクションで、[マージ(Merge)] などのフィールド マッピングを実行するツールのパラメータ値として使用されます。これらのオブジェクトを操作する最も簡単な方法は、まず FieldMappings オブジェクトを作成した後、結合対象の入力フィーチャクラスまたはテーブルを追加することにより、そのオブジェクトの FieldMap オブジェクトを初期化することです。すべての入力が指定された後、FieldMappings オブジェクトには、そのすべての入力の一意なフィールド名ごとに FieldMap オブジェクトまたは出力フィールドを 1 つずつ含まれます。このリストは、新しいフィールドを追加する、出力フィールドのプロジェクトまたは内容を変更する、必要のない出力フィールドを削除することにより、変更できます。
例
次の例では、米国の国勢調査データが含まれているいくつかのフィーチャクラスをマージして、新しいフィーチャクラスを作成します。すべての入力に含まれている入力属性の 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)