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

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 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么