arcgis检查面多边形图斑内角角度开源工具箱介绍

3 篇文章 0 订阅
2 篇文章 0 订阅

20231123更新部分代码、说明

下载最新【免费】检查面多边形图斑内角角度(arcgis工具箱-开源)资源-CSDN文库

打开角度检查工具使用说明.pdf,按要求使用即可,工具箱中有具体说明(注意是平面坐标,地理坐标请投影后运行)

特别地:现阶段工具不特别区分内外角,譬如下面截图中红框内角还是统计为锐角

(PS:如有需求可联系Q:775915005,定制修改为统计内角、统计特定角度的数量、统计各内角的角度等)

附工具箱完整代码:

# -*- coding:utf-8 -*-
# ---------------------------------------------------------------------------
# Author: LGZ
# Created on: 2023/02
# Contact: QQ775915005
# Reference:
# ---------------------------------------------------------------------------

import arcpy,math


def ruijiao_number(input_feature,minjiao):
    if "jiaodu" not in [i.name for i in arcpy.ListFields(input_feature)]:
        arcpy.AddMessage(str([i.name for i in arcpy.ListFields(input_feature)]))
        arcpy.AddField_management(input_feature, "jiaodu", "TEXT",field_length= 254)
    with arcpy.da.UpdateCursor(input_feature, ["SHAPE@", "jiaodu"]) as cursor:
        for row in cursor:
            pc = row[0].partCount
            n = 0
            for i0 in range(pc):  # 处理多对象
                p = row[0].getPart(i0)  # 返回Array (arcpy)
                count0 = p.count  # 计算点对象数目
                arcpy.AddMessage(str(count0))
                ls = list()
                list2 = [[]]
                r = 0
                # n = 0
                for i1 in range(count0):  # 根据None点划分制作二维列表
                    ls.append(p.getObject(i1))
                for i2 in ls:
                    if i2:
                        list2[r].append(i2)
                    else:
                        if list2[r] == []:
                            continue
                        else:
                            list2.append([])
                        r += 1
                arcpy.AddMessage(str(list2))
                # n = 0
                for i3 in list2:  # [点1, 点2, 点3,点1]

                    for i4 in range(len(i3)):  # 点1
                        p0x = round(i3[i4].X, 3)  # 点1的X坐标,下同
                        p0y = round(i3[i4].Y, 3)
                        p1x = round(i3[i4 + 1].X, 3)
                        p1y = round(i3[i4 + 1].Y, 3)
                        if i4 == len(i3) - 2:
                            p2x = round(i3[1].X, 3)
                            p2y = round(i3[1].Y, 3)
                        else:
                            p2x = round(i3[i4 + 2].X, 3)
                            p2y = round(i3[i4 + 2].Y, 3)
                        l1x = p0x - p1x
                        l1y = p0y - p1y
                        l2x = p2x - p1x
                        l2y = p2y - p1y
                        l1cd = math.sqrt(l1x * l1x + l1y * l1y)
                        l2cd = math.sqrt(l2x * l2x + l2y * l2y)
                        xljchucd = (l1x * l2x + l1y * l2y) / (l1cd * l2cd)  # cos
                        jiao = math.acos(round(xljchucd,3)) * 180.0 / (math.pi) 
                        if jiao < float(minjiao):  # 统计小于输入角度的点数
                            n += 1
                        if i4 == len(i3) - 2:  # 倒数第2点退出本循环
                            break
            arcpy.AddMessage(str(n))
            row[1] = str(n)
            cursor.updateRow(row)  # 更新行
    #     del row
    # del cursor

    arcpy.RefreshActiveView()
    arcpy.RefreshTOC()


if __name__ == '__main__':

    try:
        # arcpy.env.overwriteOutput = True
        # 注意arcpy.GetParameterAsText获取是文本格式,注意中文注释下面空一行

        argv = tuple(arcpy.GetParameterAsText(i)
                     for i in range(arcpy.GetArgumentCount()))
        arcpy.AddMessage(str(argv))
        ruijiao_number(*argv)

    except arcpy.ExecuteError:
        print(arcpy.GetMessages())

    else:
        arcpy.AddMessage("program success,Q:775915005")


附字段计算器函数式计算代码(实现思路与工具箱一致,结果一致,须在文本类型字段下运行):

import math
def shiftCoordinate(shape,minjiao):
    n = 0
    pc = shape.partCount  # 多少部分
    for i0 in range(pc):
        p = shape.getPart(i0)  # Array (arcpy)
        count0 = p.count
        ls = list()
        list2 = [[]]
        r = 0
        for i1 in range(count0):
            ls.append(p.getObject(i1))
        for i2 in ls:
            if i2:
                list2[r].append(i2)
            else:
                if list2[r] == []:
                    continue
                else:
                    list2.append([])
                r += 1
    
        for i3 in list2:  # [1323, 1312, 345,1323]
            for i4 in range(len(i3)):
                p0x = round(i3[i4].X, 3)
                p0y = round(i3[i4].Y, 3)
                p1x = round(i3[i4+1].X, 3)
                p1y = round(i3[i4+1].Y, 3)
                if i4 == len(i3)-2:
                    p2x = round(i3[1].X, 3)
                    p2y = round(i3[1].Y, 3)
                else:
                    p2x = round(i3[i4+2].X,3)
                    p2y = round(i3[i4+2].Y,3)
                l1x = p0x - p1x
                l1y = p0y - p1y
                l2x = p2x - p1x
                l2y = p2y - p1y
                l1cd = math.sqrt(l1x * l1x + l1y * l1y)
                l2cd = math.sqrt(l2x * l2x + l2y * l2y)
                xljchucd = (l1x * l2x + l1y * l2y) / (l1cd * l2cd)  # cos
                jiao = math.acos(round(xljchucd,3)) * 180.0 / (math.pi) 
                if jiao < minjiao:
                    n += 1
                if i4 == len(i3)-2:
                    break
    return str(n)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的 ArcGIS 工具箱脚本,用于检查图斑夹角: ```python import arcpy, math # 定义工具箱参数 arcpy.AddToolbox("C:/path/to/toolbox.tbx") input_features = arcpy.GetParameterAsText(0) output_feature_class = arcpy.GetParameterAsText(1) angle_threshold = arcpy.GetParameterAsText(2) # 检查夹角 arcpy.AddField_management(input_features, "Angle", "FLOAT") with arcpy.da.UpdateCursor(input_features, ["SHAPE@", "Angle"]) as cursor: for row in cursor: geometry = row[0] angle = 0 for i, part in enumerate(geometry): if i == 0: continue prev_point = part[i-1] curr_point = part[i] angle += math.degrees(math.atan2(curr_point.Y - prev_point.Y, curr_point.X - prev_point.X)) row[1] = angle cursor.updateRow(row) if angle >= float(angle_threshold): arcpy.AddWarning("Feature ID {0} has an angle greater than {1} degrees.".format(row[0], angle_threshold)) # 输出结果 arcpy.CopyFeatures_management(input_features, output_feature_class) ``` 以上代码首先导入了 `arcpy` 和 `math` 模块,并定义了三个工具箱参数:输入要素类、输出要素类和夹角阈值。然后,使用 `AddField_management` 函数向输入要素类添加一个名为 "Angle" 的新字段,用于存储图斑的夹角值。接下来,使用 `UpdateCursor` 函数遍历输入要素类中的每个要素,并计算其夹角。如果夹角大于等于夹角阈值,则使用 `AddWarning` 函数输出警告信息。最后,使用 `CopyFeatures_management` 函数将结果写入输出要素类中。 请注意,以上代码仅为示例,实际使用时需要根据具体情况进行修改和调整。例如,需要根据输入要素类的具体属性字段来修改 UpdateCursor 函数中的字段名称。另外,还需要根据工具箱的实际情况来设置参数和路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值