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

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日

悬赏问题

  • ¥200 如何使用postGis实现最短领规划?
  • ¥15 pyinstaller打包错误
  • ¥20 cesm的气溶胶排放文件
  • ¥30 关于#wpf# devexpress的问题:选中时是黑色未选中是白色字体,想要更改未选中时字体的颜色(语言-c#)
  • ¥15 逐月累计,月份不连续,补齐月份
  • ¥15 应用简单的Python代码完成一个学生成绩管理系统
  • ¥15 用matlab求微分方程初值问题
  • ¥15 vscode下编写第三方库opencv与pcl代码时没有代码提示
  • ¥15 能够跑通不报错,如何解决?(标签-matlab)
  • ¥15 MOS在RDS较大,频率高时开关波形异常