入力フィールドから出力フィールドへのマッピング

一般的なジオプロセシング タスクの 1 つは、複数のデータセットを新規または既存のデータセット 1 つに統合して、より広いエリアをカバーするデータセットまたはより多くのレコードを含んだテーブルを作成することです。マージ操作やアペンド操作に使用する入力のすべての属性やフィールドが同じであることが多いですが、時々それらが一致せず、名前やタイプが異なるフィールド間の関係をマッピングしなければならないことがあります。フィールドのマッピングの一例として、[データ管理] ツールボックスの [マージ(Merge)] ツールを使用すれば、データが適切な出力フィールドに正しい値で配置されるように、この関係のマッピングを容易に行うことができます。

FieldMap

FieldMap オブジェクトは、値を提供する一連のテーブルまたはフィーチャクラスから入力フィールドの定義とそれらのリストを提供します。

FieldMap オブジェクトのプロパティには、入力テキスト値の開始位置と終了位置が含まれるため、入力値の一部を使って新しい出力値を作成することができます。FieldMap オブジェクトに同じテーブルまたはフィーチャクラスからの複数入力フィールドが含まれる場合、各レコードの値は mergeRule プロパティを使用してマージされます。これは、たとえば「国道」と「1 号」のように、道路タイプが含まれているフィールドと道路名が含まれているフィールドの値を結合するのに役立ちます。FieldMapjoinDelimiter プロパティは、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)

関連トピック

5/10/2014