在ArcMap中查找面状要素畸形部分

在ArcMap中查找面状要素畸形部分,第1张

在ArcMap中查找面状要素畸形部分

在ArcMap中可以通过图形边界长与等面积的圆周长之比查找畸形面状要素
比值越大,图形与圆形相差越大, 形状越不规则

在要素图层新建一个双精度的字段,把比值计算到这个字段
将字段降序排列,很快就可以找到畸形面状要素

在计算字段时『解析程序』选择『VB』
表达式框中输入

[Shape_Length] /Sqr ( [Shape_Area] * 3.14 * 4 )


但有时面状要素整体并不畸形,只是有部分边界比较狭长
使用上面的方法计算的比值可能会偏小
如果要优先找这一类的图形可以使用下面的方法


在计算字段时『解析程序』选择『Python』
『预逻辑脚本代码:』输入如下代码

import arcpy,json,math
from itertools import combinations

def jixinglv(a,b):    #参数a形如:([1.0,2.0],[3.0,4.0]),包含两个点的坐标,参数b是线对象
    mxd = arcpy.mapping.Mapdocument("CURRENT")    #获取当前工程
    sp = mxd.activeDataframe.spatialReference    #获取当前工程当前数据框的坐标系
    Dist = math.sqrt((a[0][0]-a[1][0])**2 + (a[0][1]-a[1][1])**2)    #计算两点距离
    c = arcpy.PointGeometry(arcpy.Point(a[0][0], a[0][1]), sp)    #构造第一个点
    d = arcpy.PointGeometry(arcpy.Point(a[1][0], a[1][1]), sp)    #构造第二个点
    e = b.measureonLine(c)    #从线的起点沿着线到第一个点的距离
    f = b.measureonLine(d)    #从线的起点沿着线到第二个点的距离
    g = b.length    #线的长度
    h = 0.0
    if abs(e-f)>(g/2.0):    #闭合的图形边界被其上两点分割成两段,取短的那一段的长度
        h=g-abs(e-f)
    else:
        h=abs(e-f)
    i=h/Dist    #图形边界上两点直线距离与该两点沿边界最短距离的比值
    j=1.0-((h*4.0)/g)    #减小图形边界上畸形部分的长度超过边界总长四分之一的权重
    k=math.exp(j)    #j的取值范围[-1,1],h的最大值就是g/2.0
    l=i*k
    return l

def zx(a):
    b=[]
    mxd = arcpy.mapping.Mapdocument("CURRENT")
    sp = mxd.activeDataframe.spatialReference
    shapegeneralize=a.generalize(1.0)    #使用指定的最大偏移容差来创建一个简化几何,减少折点减少计算时间
    shapejson=shapegeneralize.JSON    # 返回一个字符串形式的面对象折点坐标
    zidian = json.loads(shapejson)    # 将将已编码的JSON字符串解码为Python对象
    lb1=zidian["rings"]    # 字典rings键的键值是一个多层列表
    lb1len=len(lb1)
    for c in range(0,lb1len):    # 面对象的c个部分
        lb2=lb1[c]
        lineGeom=arcpy.Polyline(arcpy.Array([arcpy.Point(*d) for d in lb2]), sp)    #面对象每个部分的周长
        del lb2[-1]    #删除最后一个点的x、y坐标,因为首末两点坐标完全相同
        comb = combinations(lb2, 2)    #对列表元素进行两两组合,返回迭代结果,这个迭代结果不是列表,在下面通过list()函数转换为列表
        fun = lambda e:jixinglv(e,lineGeom)    #lambda匿名函数,使jixinglv(a,b)函数都参数b得到满足
        lb3 = map(fun,list(comb))    #map函数,fun调用列表list(comb)中的每一个元素,返回包含每次fun返回值的新列表
        b=b+lb3
    return max(b)    #返回最大值


表达式框中输入

zx( !Shape! )


将计算到字段降序排列,就可以找到这种有狭长部分的面状要素

代码中用到的面对象的JSON属性可以参考

在ArcMap中查找面状要素锐角

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5689746.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存