以下是使用ArcPy计算图层要素的折点,并将符合条件的折点记录到CSV文件中的代码:
import arcpy
import math
import csv
# 设置输入和输出路径
input_feature = r"C:\data.gdb\input_feature"
output_csv = r"C:\data.csv"
# 计算两个向量之间的夹角,单位为度
def compute_angle(vector1, vector2):
dot_product = vector1[0] * vector2[0] + vector1[1] * vector2[1]
magnitude_product = math.sqrt(vector1[0]**2 + vector1[1]**2) * math.sqrt(vector2[0]**2 + vector2[1]**2)
angle_cos = dot_product / magnitude_product
angle_rad = math.acos(angle_cos)
angle_deg = math.degrees(angle_rad)
return angle_deg
# 初始化变量
filtered_points = []
# 遍历所有要素
with arcpy.da.SearchCursor(input_feature, ["OID@", "SHAPE@"]) as cursor:
for row in cursor:
feature_id = row[0]
feature_shape = row[1]
# 遍历单个要素的所有折点
vertices = feature_shape.getPart(0)
for i in range(1, len(vertices)-1):
prev_point = vertices[i-1]
curr_point = vertices[i]
next_point = vertices[i+1]
# 计算两个向量之间的夹角是否小于5度
prev_vector = (curr_point.X - prev_point.X, curr_point.Y - prev_point.Y)
next_vector = (next_point.X - curr_point.X, next_point.Y - curr_point.Y)
angle = compute_angle(prev_vector, next_vector)
if angle < 5:
filtered_points.append([feature_id, curr_point.X, curr_point.Y])
# 将符合条件的折点写入CSV文件
with open(output_csv, 'w', newline='') as csvfile:
csvwriter = csv.writer(csvfile)
csvwriter.writerow(['OID', 'X', 'Y'])
for point in filtered_points:
csvwriter.writerow(point)
print(f"已将{len(filtered_points)}个折点写入CSV文件: {output_csv}")
上述代码会遍历指定图层(`input_feature`)的每一个要素及其折点,并计算当前折点与相邻两个折点之间的夹角。如果夹角小于5度,则将当前折点的 OID、X 坐标和 Y 坐标记录下来,最后写入 CSV 文件中(`output_csv`)。如果没有符合条件的折点,CSV 文件会保持为空。