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

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

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

FieldMap オブジェクトのプロパティには、入力テキスト値の開始位置と終了位置が含まれるため、入力値の一部を使って新しい出力値を作成することができます。FieldMap オブジェクトに同じテーブルまたはフィーチャクラスからの複数入力フィールドが含まれる場合、各レコードの値は mergeRule プロパティを使用してマージされます。これは、たとえば「国道」と「1 号」のように、道路タイプが含まれているフィールドと道路名が含まれているフィールドの値を結合するのに役立ちます。FieldMapjoinDelimiter プロパティは、mergeRule の値として Join が指定されている場合に使用されます。スペースなど、任意の文字のセットを区切り文字として使用できます。前記の例では、「国道 1 号」という値が作成されます。

FieldMap のプロパティ

プロパティ

説明

inputFieldCount

定義されている入力フィールドの数。

joinDelimiter

出力フィールドのタイプが文字列であり、mergeRuleJoin である場合に、同じテーブルからの入力値を区切るために使用される文字列値。

mergeRule

同じ入力テーブルからの複数フィールドの値を単一の出力値にマージする方法を定義します。有効な選択項目は次のとおりです。

  • First: 最初の入力値を使用
  • Last: 最後の入力値を使用。
  • Join: 複数の値を 1 つにマージし、区切り文字値を使用してこれらの値を区切ります(出力フィールド タイプがテキストの場合のみ有効)。
  • Min: 最も小さい入力値を使用(出力フィールド タイプが数値の場合のみ有効)。
  • Max: 最も大きい入力値を使用(出力フィールド タイプが数値の場合のみ有効)。
  • Mean: 入力値を使用して平均値を計算(出力フィールド タイプが数値の場合のみ有効)。
  • Median: 入力値を使用して中央値を計算(出力フィールド タイプが数値の場合のみ有効)。
  • Sum: 入力値を使用して合計値を計算(出力フィールド タイプが数値の場合のみ有効)。
  • StdDev: 入力値を使用して標準偏差を計算(出力フィールド タイプが数値の場合のみ有効)。
  • Count: 統計の計算に含まれる値の数。Null 値以外の値の数をカウント

outputField

出力フィールドのプロパティが設定されるか、フィールド オブジェクトに返されます。

FieldMap のメソッド

メソッド

説明

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 つずつ含まれます。このリストは、新しいフィールドを追加する、出力フィールドのプロジェクトまたは内容を変更する、必要のない出力フィールドを削除することにより、変更できます。

FieldMappings のプロパティ

プロパティ

説明

fieldCount

出力フィールドの数。

fieldValidationWorkspace

ワークスペース タイプによって、属性フィールドの命名規則が定義されます。これらの規則は、出力フィールド名を決定する際に使用されます。これらの名前は、入力テーブルまたはフィーチャクラスからの入力フィールドの名前を基にしています。たとえば、シェープファイルを含むファイル システム ワークスペースのフィールド名は、最大長 10 文字に制限されます。

fields

field オブジェクトのリスト。それぞれのフィールド オブジェクトは、それぞれの出力フィールドのプロパティを表します。

FieldMappings のメソッド

メソッド

説明

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)

関連項目


7/10/2012