近邻分析 (Analysis)
插图
用法
-
以下两个字段将被添加到输入要素的属性表中。如果字段已存在,将更新字段值。
- 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 的值为空。
-
输入要素和邻近要素均可为点、多点、线或面。
-
邻近要素可包括一个要素类或不同 shape 类型的多个要素类。
-
同一数据集既可用作输入要素,又可用作邻近要素。当输入要素的最近要素是其本身(NEAR_DIST 为 0)时,此要素将在计算中被忽略,并将搜索除此要素之外的最近要素。
-
输入要素可以是您已执行要素选择的图层。使用工具执行操作时将使用并更新所选要素。其余要素将新建字段(例如 NEAR_FID 和 NEAR_DIST)的值设置为 -1。
此工具计算的距离将使用输入要素坐标系的单位。如果输入地理坐标系的数据,并且希望以线性单位(而不是十进制度)测量输出距离,必须首先使用“投影”工具将输入数据投影到投影坐标系。要获得最佳结果,请使用等距投影或适用于您的研究区域的投影(例如 UTM)。
当多个邻近要素与输入要素之间的最短距离相同时,随机选择其中一个邻近要素来作为最邻近要素。
语法
参数 | 说明 | 数据类型 |
in_features |
输入要素可以是点、折线、面或多点类型。 | Feature Layer |
near_features [near_features,...] |
用于查找与输入要素距离最近的要素的值。可以有一个或多个邻近要素的条目;每个条目可以是点、折线、面或多点类型。当指定邻近要素的多个条目时,会将新字段 NEAR_FC 添加到输入表中,以存储含有最近要素的源要素类的路径。 | Feature Layer |
search_radius (可选) |
指定用于搜索候选邻近要素的半径。将考虑此半径中的邻近要素来计算最近的要素。如果未指定值,即使用默认(空)半径,将在计算中考虑所有的邻近要素。搜索半径的单位默认为输入要素坐标系的单位。可以将单位更改为任何其他单位。但是,这对 NEAR_DIST 单位不会产生任何影响,后者基于输入要素的坐标系单位。 | Linear unit |
location (可选) |
指定是否将邻近要素最近位置的 x 和 y 坐标分别写入新字段 NEAR_X 和 NEAR_Y。
| Boolean |
angle (可选) |
指定是否计算以十进制度为单位的邻近角度值,以及是否将其写入新字段 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 脚本演示了如何在独立脚本中使用近邻分析 (Near) 函数。
# 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.
演示了使用“近邻分析”工具的派生输出进行后处理。脚本为每个邻近要素查找最接近的输入要素。
# 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]}