TrueMicky 2022-11-10 15:44 采纳率: 33.3%
浏览 94
已结题

Arcpy实现图层点顺时针编号

Arcpy实现一个点图层按照一个面图层的边界走向来选取任意一个点为起点后顺时针排序怎么写?就像下面这个图一样,点图层在面图层的边界上,选了左上角为第一个点后顺时针排序。

img

最开始想的是找到这个面图层的中心点然后求取每个点到中心点的向量与标准向量的角度比较来排序,但是这必须要凸边形才能成功,比如下面这种按角度排序就不行了。

img

  • 写回答

2条回答 默认 最新

  • Ko-walski 2022-11-10 21:32
    关注

    img

    import arcpy
    
    ##  input parameters
    mxd = arcpy.mapping.MapDocument("CURRENT")
    polygons = arcpy.mapping.ListLayers(mxd,"PGONS")[0]
    points = arcpy.mapping.ListLayers(mxd,"POINTS")[0]
    
    ##truncated coordinate as string
    def truncate(f, n):
        s = '{}'.format(f)
        i, p, d = s.partition('.')
        return '.'.join([i, (d+'0'*n)[:n]])        
    
    with arcpy.da.SearchCursor(polygons,["SHAPE@","MB2013"]) as cursor:
        for shp,idL in cursor:
    ##      get extent NW corner
            ext=shp.extent
            UL=arcpy.PointGeometry(ext.upperLeft)
            Q='"MB2013" = %s'%("'"+idL+"'")
            points.definitionQuery=Q
            aList=[];pLine=shp.boundary()
    ##      order points along boundary at new start
            dMin=1e6
            with arcpy.da.SearchCursor(points,"SHAPE@") as pCur:
                for line in pCur:
                    pnt=line[0].firstPoint
                    L=pLine.measureOnLine(pnt)
                    d=UL.distanceTo(pnt)
                    if d<dMin: dMin=d;lMin=L
                    aList.append([L,pnt])
            for i,(L,pnt) in enumerate(aList):
                if L>=lMin: aList[i][0]=L-lMin
                else:aList[i][0]=L+pLine.length-lMin
    ##     dictionary of points signatures and chainage
            newList=sorted(aList)
            aDict={}
            for i,(L,pnt) in enumerate(newList):
                aKey=truncate(pnt.X,2)+truncate(pnt.Y,2)
                aDict[aKey]=i+1
    ##      transfer new order to points table
            with arcpy.da.UpdateCursor(points,("SHAPE@","GroupNo")) as pCur:
                for pnt,no in pCur:
                    aKey=truncate(pnt.firstPoint.X,2)+truncate(pnt.firstPoint.Y,2)
                    pCur.updateRow((pnt,aDict[aKey]))
    

    怕你访问不了 请参考。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月19日
  • 已采纳回答 11月11日
  • 创建了问题 11月10日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵