同一値を持つレコードの検出(Find Identical) (データ管理)
サマリ
フィールドの一覧内で同一値を持つ、フィーチャクラスまたはテーブルのレコードを報告し、同一値を持つこれらのレコードを示すテーブルを生成します。Shape フィールドが選択されている場合は、フィーチャ ジオメトリが照合されます。
同一値を持つレコードを検出して削除するには、[同一値を持つレコードの削除(Delete Identical)] ツールを使用します。
図
使用法
-
選択した入力フィールドの値が同じレコードは、同一とされます。入力データセット内の複数のフィールドにある値を照合することができます。複数のフィールドが指定された場合、レコードは、最初のフィールド内の値によって照合された後、2 番目のフィールドの値によって照合されるという具合に、順次照合されます。
-
フィーチャクラスまたはフィーチャ レイヤを入力に指定して、[フィールド] パラメータでフィールド Shape を選択すると、同一値を持つフィーチャを位置によって検索するためにフィーチャ ジオメトリが照合されます。[XY 許容値] と [Z 許容値] パラメータは、入力フィールドの 1 つとして Shape が選択されている場合のみ有効になります。
Shape フィールドが選択されていて、入力フィーチャの M 値または Z 値が有効な場合、同一フィーチャの判定に M 値または Z 値も使用されます。
出力テーブルの対象を重複レコードだけにする場合は、[重複レコードのみを出力] パラメータをオンにします。このパラメータがオフの場合、出力は入力データセットと同数のレコードを持ちます(デフォルト)。
-
出力テーブルには、IN_FID と FEAT_SEQ という 2 つのフィールドがあります。
- IN_FID フィールドを使用すると、出力テーブルのレコードを入力データセットと結合できます。
- 同一レコードは同じ FEAT_SEQ 値を持ちます。一方、同一でないレコードは連続した値を持ちます。FEAT_SEQ の値と入力レコードの ID に関連性はありません。
構文
パラメータ | 説明 | データ タイプ |
in_dataset |
同一値を持つレコードを検出するテーブルまたはフィーチャクラス。 | Table View |
out_dataset |
同一値を持つレコードを報告する出力テーブル。入力テーブルの FEAT_SEQ フィールドは、同一レコードでは同じ値を持ちます。 | Table |
fields [fields,...] | 同一値を持つレコードを検出するために値が照合されるフィールド。 | Field |
xy_tolerance (オプション) |
別のフィーチャ内に同一値の頂点が存在するかどうかを評価するときに各頂点に適用される XY 許容値。このパラメータは、Shape がフィールドの 1 つとして選択されている場合のみ有効になります。 | Linear unit |
z_tolerance (オプション) |
別のフィーチャ内に同一値の頂点が存在するかどうかを評価するときに各頂点に適用される Z 許容値。このパラメータは、Shape がフィールドの 1 つとして選択されている場合のみ有効になります。 | Double |
output_record_option (オプション) |
出力テーブルに重複レコードだけを出力するかどうかを選択します。
| Boolean |
コードのサンプル
次の Python ウィンドウ スクリプトは、イミディエイト モードで FindIdentical(同一値を持つレコードの検出)関数を使用する方法を示しています。
import arcpy
# Find identical records based on a text field and a numeric field.
arcpy.FindIdentical_management("C:/data/fireincidents.shp", "C:/output/duplicate_incidents.dbf", ["ZONE", "INTENSITY"])
次のスタンドアロン スクリプトは、FindIdentical(同一値を持つレコードの検出)ツールを使用して、テーブルまたはフィーチャクラスの重複するレコードを識別する方法を示しています。
# Name: FindIdentical_Example2.py
# Description: Finds duplicate features in a dataset based on location (Shape field) and fire intensity
import arcpy
from arcpy import env
env.overwriteOutput = True
# Set workspace environment
env.workspace = "C:/data/findidentical.gdb"
try:
# Set input feature class
in_dataset = "fireincidents"
# Set the fields upon which the matches are found
fields = ["Shape", "INTENSITY"]
# Set xy tolerance
xy_tol = ".02 Meters"
out_table = "duplicate_incidents"
# Execute Find Identical
arcpy.FindIdentical_management(in_dataset, out_table, fields, xy_tol)
print arcpy.GetMessages()
except arcpy.ExecuteError:
print arcpy.GetMessages(2)
except Exception as ex:
print ex.args[0]
オプションの [重複レコードのみを出力] パラメータを使用する方法を示しています。ツール ダイアログ ボックスでオンにするか、ONLY_DUPLICATES の値を設定すると、一意のレコードは出力からすべて削除され、重複レコードだけが残されます。
# Name: FindIdentical_Example3.py
# Description: Demonstrates the use of the optional parameter Output only duplicated records.
import arcpy
from arcpy import env
env.overwriteOutput = True
# Set workspace environment
env.workspace = "C:/data/redlands.gdb"
try:
in_data = "crime"
out_data = "crime_dups"
# Note that XY Tolerance and Z Tolerance parameters are not used
# In that case, any optional parameter after them must assign
# the value with the name of that parameter
arcpy.FindIdentical_management(in_data, out_data, ["Shape"], output_record_option="ONLY_DUPLICATES")
print arcpy.GetMessages()
except Exception as ex:
print arcpy.GetMessages(2)
print ex.args[0]
FindIdentical(同一値を持つレコードの検出)ツールの出力を読み取り、FEAT_SEQ 値によって同一レコードをグループ化します。
import arcpy
from itertools import groupby
from operator import itemgetter
# Set workspace environment
arcpy.env.workspace = r"C:\data\redlands.gdb"
# Run Find Identical on feature geometry only.
result = arcpy.FindIdentical_management("parcels", "parcels_dups", ["Shape"])
# List of all output records as IN_FID and FEAT_SEQ pair - a list of lists
out_records = []
for row in arcpy.SearchCursor(result.getOutput(0), fields="IN_FID; FEAT_SEQ"):
out_records.append([row.IN_FID, row.FEAT_SEQ])
# Sort the output records by FEAT_SEQ values
# Example of out_records = [[3, 1], [5, 3], [1, 1], [4, 3], [2, 2]]
out_records.sort(key = itemgetter(1))
# records after sorted by FEAT_SEQ: [[3, 1], [1, 1], [2, 2], [5, 3], [4, 3]]
# records with same FEAT_SEQ value will be in the same group (i.e., identical)
identicals_iter = groupby(out_records, itemgetter(1))
# now, make a list of identical groups - each group in a list.
# example identical groups: [[3, 1], [2], [5, 4]]
# i.e., IN_FID 3, 1 are identical, and 5, 4 are identical.
identical_groups = [[item[0] for item in data] for (key, data) in identicals_iter]
print identical_groups