arcgis 快速删点方法,删除线上两点距离过小的点,距离小于某值得点

想要工具箱直接私信我哦!!!

在处理矢量数据时,线上有时会有很多密集的点,一个个手动删除太麻烦了

下面我来展示一个快速删点方法

1,原始没删点之前

 

2运行工具脚本

 

3运行脚本后结果

 


import arcpy
import os
import sys
import math
import numpy
import arcpy.mapping as mapping
reload(sys)
sys.setdefaultencoding('utf-8')
arcpy.env.overwriteOutput = True
inFeatures= arcpy.GetParameterAsText(0)
dis= arcpy.GetParameterAsText(1)
outpath= arcpy.GetParameterAsText(2)

#workspace=arcpy.mapping.MapDocument("current")

def getdis(x1,y1,x2,y2):#两点间距离
    return math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

def getpointlist(pList):
    #2点列表pList重新排列xyList
    
#    
#    arcpy.AddMessage("-----pList:"+str(pList))
    num=len(pList)
#    arcpy.AddMessage("点的个数num:"+str(num))
    dis_list1=[]
    for i in range(num-1):
        x1=float(pList[i].split(";")[0])
        y1=float(pList[i].split(";")[1])
        x2=float(pList[i+1].split(";")[0])
        y2=float(pList[i+1].split(";")[1])
        d=getdis(x1,y1,x2,y2)#计算相邻两点的距离
        dis_list1.append(d)
#        arcpy.AddMessage("循环两点的距离:"+str(d))
#    arcpy.AddMessage("循环dis_list1距离列表:"+str(dis_list1))
    d_mix1=min(dis_list1)
#    arcpy.AddMessage("d_mix列表:"+str(d_mix1))

    if d_mix1<float(dis):
        count=len(dis_list1)
        for i in range(0,count):
            if dis_list1[i]<float(dis):
                del pList[i+1]
                xyList=pList
#                arcpy.AddMessage("pList列表3:"+str(xyList))
                break
    dis_list2=[]
    n=len(xyList)
    for i in range(n-1):
        x1=float(xyList[i].split(";")[0])
        y1=float(xyList[i].split(";")[1])
        x2=float(xyList[i+1].split(";")[0])
        y2=float(xyList[i+1].split(";")[1])
        d=getdis(x1,y1,x2,y2)#计算相邻两点的距离
        dis_list2.append(d)
#    arcpy.AddMessage("循环dis_list2距离列表:"+str(dis_list2))
    d_mix2=min(dis_list2)
    if d_mix2<float(dis):
        getpointlist(xyList)
    if d_mix2>=float(dis):
#        xyList=pList
#        arcpy.AddMessage("xyList列表2:"+str(xyList))
        return xyList
#    arcpy.AddMessage("xyList列表1:"+str(xyList))
    return xyList


sr=arcpy.Describe(inFeatures).spatialReference
#1得到点列表pList
desc=arcpy.Describe(inFeatures)
ptype=desc.shapeType
arcpy.AddMessage("ptype:"+str(ptype))
pList=[]
with arcpy.da.UpdateCursor(inFeatures,("OID@","SHAPE@"))as cursor:
    for row in cursor:
        FID=row[0]
        feat=row[1]
#        arcpy.AddMessage("FID=%i"%FID)
#        pList.append("FID=%i"%FID)
        pList1=[]
        partnum=0
        for part in feat:
            i=0
            for pnt in feat.getPart(partnum):
                if pnt:
                    x=pnt.X
                    y=pnt.Y
                    pList1.append(str(x)+";"+str(y))
                else:
#                    pList.append("Interior Ring:")
                    arcpy.AddMessage("Interior Ring:")
                i=i+1
            partnum+=1
#        arcpy.AddMessage("pList1:"+str(pList1))
        #2点列表pList重新排列xyList
        pList.append(getpointlist(pList1))

#arcpy.AddMessage("pList:"+str(pList))
if ptype=="Polygon":
    xylist=[]
    num=len(pList)
    for i in range(0,num):
        n=len(pList[i])
        List1=[]
        for j in range(0,n):
            x=float(pList[i][j].split(";")[0])
            y=float(pList[i][j].split(";")[1])
            pnt=arcpy.Point(x,y)
            List1.append(pnt)
        xylist.append(List1)
    features = []
    for feature in xylist:
        List2=[]
        for coords in feature:
            List2.append(coords)
        array = arcpy.Array(List2)
        array.append(array[0])
        features.append(arcpy.Polygon(array))
    arcpy.CopyFeatures_management(features, os.path.join(outpath,"点处理后面.shp"))
    arcpy.env.workplace =outpath
    mxd=arcpy.mapping.MapDocument("current")
    df = arcpy.mapping.ListDataFrames(mxd)[0]
    insertLayer = arcpy.mapping.Layer(os.path.join(outpath,"点处理后面.shp"))
    arcpy.mapping.AddLayer(df, insertLayer, "TOP")
    arcpy.AddMessage("!!!OK!!!")

if ptype=="Polyline":
    xylist=[]
    num=len(pList)
    for i in range(0,num):
        n=len(pList[i])
        List1=[]
        for j in range(0,n):
            x=float(pList[i][j].split(";")[0])
            y=float(pList[i][j].split(";")[1])
            pnt=arcpy.Point(x,y)
            List1.append(pnt)
        xylist.append(List1)
    features = []
    for feature in xylist:
        List2=[]
        for coords in feature:
            List2.append(coords)
        array = arcpy.Array(List2)
        arcpy.Polyline(array)

        features.append(arcpy.Polyline(array))
    arcpy.CopyFeatures_management(features, os.path.join(outpath,"点处理后线.shp"))
    arcpy.env.workplace =outpath
    mxd=arcpy.mapping.MapDocument("current")
    df = arcpy.mapping.ListDataFrames(mxd)[0]
    insertLayer = arcpy.mapping.Layer(os.path.join(outpath,"点处理后线.shp"))
    arcpy.mapping.AddLayer(df, insertLayer, "TOP")
    arcpy.AddMessage("!!!OK!!!")

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值