首页 > 编程语言 >ArcGIS Python 修改面的左上角为第一个点

ArcGIS Python 修改面的左上角为第一个点

时间:2022-12-22 14:36:45浏览次数:42  
标签:return pt Python ArcGIS y1 左上角 y2 arcpy pt2

  面的节点夹角大于30并且小于150,距离外界矩形左上角最近的点为第一个点,对于多部件每一个都修改,修改面的开始点位置,运行界面如图14-10所示。

 

 

#coding=utf8
import arcpy

import os
import sys
import math
isEdit=False
def getdis(x1,y1,x2,y2): #获得两个点距离
    return math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
###############
def getXYAngle(x1,y1,x2,y2):#点x1,y1和点x2,y2的角度
    if (math.fabs(x1 - x2) < 0.00001):
        if (y1 < y2):
            return 90
        else:
            return 270;
    else:
        k = (y2 - y1) / (x2 - x1);
        k = math.atan(k) * 180 / math.pi
        if (x2 < x1):  #二、三象限
            return k + 180;
        elif (y2 >= y1): #//一象限
            return k;
        else:#四象限
            return k + 360

def getAngle(pt1,pt2):#获得两个点的角度
    x1=pt1.X
    y1=pt1.Y
    x2=pt2.X
    y2=pt2.Y
    return getXYAngle(x1,y1,x2,y2)



def getLineAngle(pt1, pt2, pt3,mydir):#mydir是true顺时针,false是逆时针
    if (pt1==None):
        #arcpy.AddMessage("pt1为空")
        return -1
    if (pt2==None):
        #arcpy.AddMessage("pt2为空")
        return -2
    if (pt3==None):
        #arcpy.AddMessage("pt3为空")
        return  -3

    A1 = getAngle(pt1, pt2)
    A2 = getAngle(pt2, pt3)
    angle = 0;
    if mydir:
        angle = 180 + A2 - A1
    else:
        angle = 180 + A1 - A2
    if (angle >= 360):
        angle = angle - 360
    if (angle < 0):
        angle = angle + 360
    return angle


def getintersectionAnge(pt1, pt2, pt3):#获得夹角
    a=getLineAngle(pt1, pt2, pt3,True)
    if a>180:
        a=a-180
    return a
def getminXmaxY(array):#获得最小的X和最大Y
    num=len(array)
    minx=999999999999
    maxy=0;

    for i in range(num):
        pt=array[i]
        if pt:
            if pt.X<minx:
                minx=pt.X
            </minx:
if pt.Y>maxy:
                maxy=pt.Y
    return minx,maxy

###########
def splitNgeometry(mgeometry):
    num=mgeometry.count
    Sumarray = arcpy.Array()
    parray = arcpy.Array()
    for i in range(num): #pntcount
        pt=mgeometry[i]
        if pt:
            parray.add(pt)
        else:#内边形
            Sumarray.add(parray)
            parray.removeAll()
    Sumarray.add(parray)
    return Sumarray

################
def MINPoint(partgeometry):#按照左上点,修改图形
    global isEdit

    Topx,Topy=getminXmaxY(partgeometry)
    num=partgeometry.count

    #arcpy.AddMessage("partgeometry.extent:"+str(Topx)+":y="+str(Topy))
    maxd=99999999999;
    idx=0;
    for i in range(num):

        pt=partgeometry[i]

        x=pt.X
        y=pt.Y

        d= getdis(x,y,Topx,Topy)
        #arcpy.AddMessage("KKK"+str(i)+",坐标x="+str(x)+",y="+str(y)+",d="+str(d))
        if (d<maxd):
            </maxd):
#计算夹角
            if (i>1):
                p1=partgeometry[i-1]
            else:
                p1=partgeometry[num-1]

            if i<(num-1):
                p2=partgeometry[i+1]
            else:
                p2=partgeometry[0]
            myAngle= getintersectionAnge(p1, pt, p2)

            #arcpy.AddMessage("i:"+str(i)+",myAngle="+str(myAngle))

            if myAngle>=30 and myAngle<=150:
                idx=i
                maxd=d
    #arcpy.AddMessage("idx============:"+str(idx)+",min="+str(maxd))
    if idx<1:

        return partgeometry
    else:
        isEdit=True

        array = arcpy.Array()
        for i in range(idx,num):
            #arcpy.AddMessage("i===========:"+str(i))
            if partgeometry[i]:

                array.add(partgeometry[i])
        for i in range(idx):
            #arcpy.AddMessage("i++++++++++:"+str(i))
            if partgeometry[i]:
                array.add(partgeometry[i])
        return array

inFeature  = arcpy.GetParameterAsText(0)
outFeature  = arcpy.GetParameterAsText(1)
arcpy.Select_analysis(inFeature, outFeature, '')
desc = arcpy.Describe(outFeature)
shapeName = desc.ShapeFieldName
OIDField=desc.OIDFieldName

result = arcpy.GetCount_management(inFeature)
count= int(result.getOutput(0))
if count < 1:
    arcpy.AddMessage(inFeature+u"没有数据")
else:

    rows = arcpy.UpdateCursor(outFeature)

    n=1

    try:
        for row in rows:
            isEdit=False
            arcpy.SetProgressorPosition()
            arcpy.SetProgressorLabel(u"正在等待,完成"+str(round(1.0*n*100/count,1))+"%...")
            geometry = row.getValue(shapeName)
            FID=row.getValue(OIDField)
            part_count = geometry.partCount #有几部分
            #arcpy.AddMessage("FID:"+str(FID)+",part_count:"+str(part_count))
            Sumarray = arcpy.Array()
            for i in range(part_count):
                partgeometry=geometry.getPart(i)
                SpliArray=splitNgeometry(partgeometry)
                N=SpliArray.count
                #arcpy.AddMessage("NNNNN=====:"+str(N))
                for j in range(N):
                    Splitgeometry=SpliArray[j]

                    array=MINPoint(Splitgeometry)
                #if (part_count>1):
                    try:
                        Sumarray.add(array)
                    except Exception as err:
                        arcpy.AddError(u"错误=============j:"+str(j)+","+err.message)

            if isEdit:
                #row.setValue(shapeName, array)
                row.setValue(shapeName, Sumarray)
                rows.updateRow(row)
                arcpy.AddMessage("FID:"+str(FID)+u"修改")
            n=n+1

    finally:
        arcpy.ResetProgressor()
        #del row
        del rows

 

标签:return,pt,Python,ArcGIS,y1,左上角,y2,arcpy,pt2
From: https://www.cnblogs.com/suoyike1001/p/16998584.html

相关文章

  • 教你用Python实现BMI计算器
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!<br/>我们来用Python相关知识,做一个BMI计算器的案例。你可以通过控制台的提示信息,输入身高和体重,注意单......
  • python 虚拟环境搭建全流程
    首先,建立python虚拟环境test_env:python3-mvenvtest_env#激活虚拟环境source./test_env/bin/activate#linuxvenv/Scripts/activate#windows#停止虚拟环......
  • 37python的创建虚拟环境和项目
    如需打包所运行的第三方库版本命令如下:pipfreeze>requirements.txt构建虚拟环境个人习惯加点(表示隐藏)安装其它库出现此错误解决方法一:管理员的方式打开......
  • Python__10--函数结构之循环结构与嵌套结构
    1循环结构循环结构有一个循环体,循环体是一段代码。对于循环结构来说,关键在于根据判断的结果,来决定循环体执行多少次。range函数range函数一般配合for循环使用range......
  • python获取当前项目的根目录路径
    def__init__(self):self.object_name='UIAutoProject'defget_root_path(self):cur_path=os.getcwd()returncur_path[:cur_path.fin......
  • python之图片与视频互转
    图片转视频defimage_to_video(image_dir,video_dir,fps):im_list=[iforiinos.listdir(image_dir)ifi.endswith('jpg')]im_list.sort(key=lambdax:......
  • python之调用高德、百度api解析经纬度地址
    调用高德#高德地图根据经纬度反查地址,每天只能调用5000次defgaode_excute_single_query(coordStrings,currentkey='你自己的api-key'):#1-将coordList中的经纬......
  • python实现计算精度、召回率和F1值
    python实现计算精度、召回率和F1值  摘要:在深度学习的分类任务中,对模型的评估或测试时需要计算其在验证集或测试集上的预测精度(prediction/accuracy)、召回率(recall)和F1值......
  • 关于python网络爬虫——摘取新闻标题及链接
    Python是最近流行的编程语言,最近学习了python编程,并在网络爬虫方面进行了研究,下面给出简单实例来实现网络信息的获取步骤一:要有python开发环境,可下载python3.5版本,或anacond......
  • Python之异常
    一、了解异常当检测到⼀个错误时,解释器就⽆法继续执⾏了,反⽽出现了⼀些错误的提示,这就是所谓的"异常"。例如:以r⽅式打开⼀个不存在的⽂件。open('test.txt','r')二、异常......