最近接(Near) (解析)
図
使用法
-
入力フィーチャの属性テーブルに、次の 2 つのフィールドが追加されます。フィールドがすでに存在する場合、フィールドの値が更新されます。
- NEAR_FID - 最近接フィーチャのフィーチャ ID を保存します。
- NEAR_DIST - 入力フィーチャから最近接フィーチャまでの距離を保存します。このフィールドの値は、入力の座標系の距離単位で表されます。
-
検索範囲内でフィーチャが見つからない場合は、NEAR_FID と NEAR_DIST の値が -1 になります。
近接フィーチャとオプション パラメータのエントリの説明にあるように、オプションで NEAR_X、NEAR_Y、NEAR_ANGLE、および NEAR_FC フィールドを入力フィーチャの属性テーブルに追加できます。フィールドがすでに存在する場合、フィールドの値が更新されます。検索範囲内にフィーチャが見つからない場合、NEAR_X と NEAR_Y の値は -1、NEAR_ANGLE の値はゼロ(0)、NEAR_FC の値は NULL になります。
-
入力フィーチャと近接フィーチャには、ポイント、マルチポイント、ライン、またはポリゴンを指定できます。
-
近接フィーチャにはさまざまな形状タイプの 1 つ以上のフィーチャクラスを含めることができます。
-
入力フィーチャと近接フィーチャは同じデータセットに属していてもかまいません。入力フィーチャの最近接フィーチャがそれ自体の場合([NEAR_DIST] の値が 0)、このフィーチャは無視されて、2 番目に近いフィーチャが検索されます。
-
入力フィーチャには、選択を実行したレイヤを指定できます。選択フィーチャは、ツールの実行中に使用および更新されます。残りのフィーチャには、新規作成されたフィールド(NEAR_FID、NEAR_DIST など)に -1 の値が設定されます。
このツールで計算された距離は、入力フィーチャの座標系の単位となります。入力が地理座標系であり、出力の距離を距離単位(10 進経緯度ではなく)で計測する場合は、まず [投影変換(Project)] ツールを使用して入力を投影座標系に投影する必要があります。最もよい結果を得るためには、正距方位図法または調査領域に適した投影法(UTM など)を使用してください。
入力フィーチャからの最短距離が同じ最近接フィーチャが複数ある場合は、そのうちの 1 つが最近接フィーチャとしてランダムに選択されます。
構文
パラメータ | 説明 | データ タイプ |
in_features |
ポイント、ポリライン、ポリゴン、またはマルチポイント タイプの入力フィーチャ。 | Feature Layer |
near_features [near_features,...] |
入力フィーチャから最近接フィーチャを検出するために使用する値です。近接フィーチャを 1 つ以上入力できます。各エントリは、ポイント、ポリライン、ポリゴン、またはマルチポイント タイプになります。近接フィーチャを複数指定した場合、最近接フィーチャを含むソース フィーチャクラスのパスを格納する新しいフィールド NEAR_FC が入力テーブルに追加されます。 | Feature Layer |
search_radius (オプション) |
近接フィーチャを検索するための半径を指定します。この半径内に存在する近接フィーチャから最近接フィーチャが求められます。値を何も指定しない場合は、デフォルト(空の)半径が使用されます。つまり、すべての近接フィーチャが計算対象となります。デフォルトの検索範囲の単位は入力フィーチャの座標系の単位です。この単位は他の単位に変更できます。ただし、これは入力フィーチャの座標系の単位に基づいて設定される NEAR_DIST の単位に影響を与えません。 | Linear unit |
location (オプション) |
最近接フィーチャの位置を表す X 座標と Y 座標を、それぞれ新しい NEAR_X フィールドと NEAR_Y フィールドに書き込むかどうかを指定します。
| Boolean |
angle (オプション) |
近接する角度値(10 進表記)が計算され、新しい NEAR_ANGLE フィールドに書き込まれます。近接角度は、X 軸(水平軸)から、入力フィーチャとその最近接フィーチャをつなぐ直線までの角度を指しており、0 ~ 180 度または 0 ~ -180 度の範囲になります。0 度が東、90 度が北、180(-180)度が西、-90 度が南です。
| Boolean |
コードのサンプル
次の Python ウィンドウ スクリプトは、イミディエイト モードで Near(最近接)関数を使用する方法を示しています。
import arcpy
arcpy.env.workspace = "C:/data/city.gdb"
## find the nearest road from each house
arcpy.Near_analysis('houses', 'roads')
次の Python スクリプトは、スタンドアロン スクリプトで最近接関数を使用する方法を示しています。
# Name: Near.py
# Description: Finds nearest features from input feature class to near feature class.
import arcpy
from arcpy import env
# Set workspace environment
env.workspace = "C:/data/city.gdb"
try:
# set local variables
in_features = "houses"
near_features = "parks"
# find features only within search radius
search_radius = "5000 Meters"
# find location nearest features
location = "LOCATION"
# avoid getting angle of neares features
angle = "NO_ANGLE"
# execute the function
arcpy.Near_analysis(in_features, near_features, search_radius, location, angle)
# get geoprocessing messages
print arcpy.GetMessages()
except arcpy.ExecuteError:
print arcpy.GetMessages(2)
except Exception as ex:
print ex.args[0]
次の Python スクリプトは、近接角度を方位角に変換する方法を示しています。
# Name: near_angle_to_azimuth.py
import arcpy
# Near tool does not calculate angle in azimuths
# This script, using the output of the tool, converts the angles
# to azimuth angles.
in_table = r"C:/data/city.gdb/near_table"
angles = arcpy.da.SearchCursor(in_table, ["NEAR_ANGLE"])
azimuth_angles = []
with angles as rows:
for row in rows:
angle = row[0]
if angle <= 180 and angle > 90:
azimuth_angles.append(360.0 - (angle - 90))
else:
azimuth_angles.append(abs(angle - 90))
# Use these azimuth angles as necessary.
最近接(Near)ツールの派生出力の後処理を示しています。このスクリプトは、最近接フィーチャごとに、最も近い入力フィーチャを検出します。
# Name: features_closest_to_input.py
"""
This script finds, for each input feature, a list of near feature it is closest to.
If near features 6, 7, 10 are closest to input feature 3 then the
resulting dictionary will have a list [6, 7, 10] as value for key 3
"""
import os
import arcpy
in_fc = r"C:\data\cities.gdb\cities_many"
# create a dictionary to hold the list of near ids for each input id
nearest_dict = dict()
with arcpy.da.SearchCursor(in_fc, ["OID@", "NEAR_FID"]) as rows:
for row in rows:
nearest_id = row[0] # get OID value for that row
input_id = row[1] # get NEAR_FID value
if input_id in nearest_dict:
# if a dict key already exists, append near id to value list for that key
nearest_dict[input_id].append(nearest_id)
else:
# if the key does not exist then create a new list with near id
# and add it to the dictionary
nearest_dict[input_id] = [nearest_id]
print nearest_dict
# output will look like:
# {1: [13, 28], 2: [2, 9, 14, 20, 22], 3: [11, 12, 24, 25]}