arcpy计算要素折点,要求这个折点与上一个折点之间水平夹角小于5度的点被记录,并将这些符合条件的折点导出到scv文件中

以下是使用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 文件会保持为空。

你可能感兴趣的:(数学建模,arcgis)