一般的なジオプロセシング タスクとは、多数のデータセットを新しいデータセットまたは既存のデータセットにマージし、より広いエリアを網羅するデータセットや、多数のレコードを含むテーブルを作成することです。 マージ操作やアペンド操作で使用されるすべての入力では、属性 (またはフィールド) は同じであることがほとんどですが、それらが一致せず、名前とタイプが異なるフィールド間でリレーションシップをマッピングしなくてはならないことがあります。 フィールドのマッピングの一例として、[マージ (Merge)] ツールを使用すれば、データが適切な出力フィールドに正しい値で配置されるように、この関係のマッピングを容易に行うことができます。
FieldMap
The FieldMap object provides a field definition and a list of input fields from a set of tables or feature classes that provide its values.
The properties of the FieldMap object include the start and end position of an input text value, so an output value can be created using a slice of an input value. If a FieldMap object contains multiple input fields from the same table or feature class, each record's values are merged using the mergeRule property. This is a convenient way to join values, such as a street name that is held in one field and a street type that is held in another, for example, Eureka and Street. The joinDelimiter property of the FieldMap object is used when Join is specified as the mergeRule value. Any set of characters, such as a space, can be used as a delimiter. In the example above, this would create a value of Eureka Street.
FieldMappings
The FieldMappings object is a collection of FieldMap objects, and it is used as the parameter value for tools that perform field mapping, such as Merge. The easiest way to work with these objects is to first create a FieldMappings object, then initialize its FieldMap objects by adding the input feature classes or tables that are to be combined. Once all inputs are provided, the FieldMappings object will contain one FieldMap object, or output field, for each unique field name from all the inputs. You can modify this list by adding new fields, altering the properties or contents of an output field, or removing unwanted output fields.
例
次の例では、米国の国勢調査データを含むフィーチャクラスをいくつかをマージし、新しいフィーチャクラスを作成します。 すべての入力に含まれる入力属性の 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
arcpy.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)
次の例では、FieldMap オブジェクトの addTable メソッドを使用して FieldMappings オブジェクトを作成した後、このオブジェクトを変更する方法を示します。 この方法は、異なる名前を持つ入力のフィールドが、論理的には同じ値を含んでいる場合に重要となります。
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"))
# Run the Merge tool.
arcpy.Merge_management([fc1, fc2], outfc, fieldmappings)