在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中查找面状要素锐角
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)