• ylpy


    #coding=utf8
    import arcpy
    import os
    import math
    
    #获得各种比例尺的代号
    def getScaleDM(idx):
        return chr(idx + 65)
    
    #有经纬度和图幅序号获得图幅号,
    #idx=0,为1:100万
    #idx=1,为1:50万
    #idx=2,为1:25万
    #idx=3,为1:10万
    #idx=4,为1:5万
    #idx=5,为1:2.5万
    #idx=6,为1:1万
    #idx=7,为1:5千
    #idx=8,为1:2千
    #idx=9,为1:1千
    #idx=10,为1:500
    def getnewtf(ll, bb, idx):
        ScaleDM = getScaleDM(idx)
        a = int(math.floor(bb / 4) + 1);
        #b = int(ll / 6) + 31;
        b = int(ll //6) + 31;
        #cc = int(4.0 / dw);
        cc = int(4.0 // dw);
        #cc1 = int((bb - 4 * (a - 1)) / dw); #(int)((bb - 4 * (a - 1)) / dw)
        cc1 = int((bb - 4 * (a - 1)) // dw); #(int)((bb - 4 * (a - 1)) / dw)
        c = cc - cc1;
        if (c == 0):
            c = cc
            a = a + 1
        #d = (int)((ll - 6 * (b - 31)) / dj) + 1
        d = (int)((ll - 6 * (b - 31)) // dj) + 1
        #arcpy.AddMessage("dddd="+str(d))
        #arcpy.AddMessage("aaa="+str(a))
        #arcpy.AddMessage("bbbb="+str(b))
        resultstr = chr(a + 64) + str(b)
        #arcpy.AddMessage("resultstr="+resultstr)
        if (idx > 0):
            resultstr = resultstr + ScaleDM;
            mystr = str(c).zfill(3)
            resultstr = resultstr + mystr + str(d).zfill(3);
    
        return resultstr;
    #获得一个坐标的地理坐标系
    def getGCSName(sr):
         if sr.type != "Geographic":
             if hasattr(sr, 'GCS'):
                 return sr.GCS
             srname=sr.name
    
             sr1 = arcpy.SpatialReference()
             if srname.startswith("Xian_1980"):
                  sr1.factoryCode=4610 #80
             elif srname.startswith("Beijing_1954") or srname.find("Lambert")>0:
                  sr1.factoryCode=4214 #54
             elif  srname.startswith("CGCS2000"):
                 sr1.factoryCode=4490 #2000
             else:
                 sr1.factoryCode=4326 #1984
             sr1.create()
    
             return sr1
         else:
           return sr
    
    
    #把其他类型转字符串
    def ConverttoStr(v):
        if type(v)==str:
            return v
        else:
            return str(v)
    #字段是否存在
    def FieldExists(TableName,FieldName):
        desc = arcpy.Describe(TableName)
        for field in desc.fields:
            if field.Name.upper() ==FieldName:
                return True
                break
        return False
    #清除选择对象
    def clearselect(in_data):
        arcpy.SelectLayerByAttribute_management(in_data, "CLEAR_SELECTION")
        arcpy.RefreshActiveView()
    #获得记录数
    def getCount(inFeature):
        result = arcpy.GetCount_management(inFeature)
        count= int(result.getOutput(0))
        return count
    #初始化进度条
    def initProgress(hint,num):
        arcpy.SetProgressor("step", u"正在"+hint,0,num,1)
    #进度条
    def step():
        arcpy.SetProgressorLabel(u"正在进行....")
        arcpy.SetProgressorPosition()
    #释放进度条
    def freeProgress():
        arcpy.ResetProgressor()
    #获得字段长度
    def getlength(mystr):
        lenTxt = len(mystr)
        lenTxt_utf8 = len(mystr.decode('utf-8'))
        size = int((lenTxt_utf8 - lenTxt)/2 + lenTxt)
        #arcpy.AddMessage("'{0}'最后长度{1},lenTxt={2},lenTxt_utf8={3}".format(mystr,size,lenTxt,lenTxt_utf8))
    #获得指定条件的记录数
    def getwhereCount(inFeature,wherestr):
        my_temp="my_temp" #临时数据
    
        arcpy.MakeFeatureLayer_management(inFeature,my_temp,wherestr)
        return getCount(my_temp)
    #获得一个表的FID
    def getOIDField(jfb_Select):
        desc = arcpy.Describe(jfb_Select)
        OIDField=desc.OIDFieldName
        return OIDField
    #删除一个要素中图形相同的,可以删除相同的点、线、面
    def delsame(jfb_Select):
        desc = arcpy.Describe(jfb_Select)
        shapeName = desc.ShapeFieldName
        arcpy.DeleteIdentical_management(jfb_Select, [shapeName])
    #获得点的距离
    def pointDistance(pt1,pt2):
        return math.sqrt((pt1.X-pt2.X)*(pt1.X-pt2.X)+(pt1.Y-pt2.Y)*(pt1.Y-pt2.Y))
    #添加一个数据到指定mxd
    def AddLayer(mxd,inFeature):
        df=arcpy.mapping.ListDataFrames(mxd)[0]
        addLayer = arcpy.mapping.Layer(inFeature)
        arcpy.mapping.AddLayer(df, addLayer,"AUTO_ARRANGE") #AUTO_ARRANGE,"BOTTOM",TOP
    #删除一个表的所有字段
    def delAllField(inFeature):
        fieldList = arcpy.ListFields(inFeature)
        for field in fieldList:
              if not (field.type=="Geometry" or field.type=="OID" or not field.editable):
                  arcpy.DeleteField_management(inFeature,field.name)
    #获得一个要素类合并后的图形,使用融合工具
    def getLayerGeomtry(inFeature):
    
        num=getCount(inFeature)
    
        mytemp=inFeature
        if num>1:#融合在
            mytemp="in_memory/mytemp999aa"
            arcpy.Dissolve_management(inFeature, mytemp,"", "", "MULTI_PART")
    
        desc = arcpy.Describe(mytemp)
        shapefieldname = desc.ShapeFieldName
    
        rows = arcpy.SearchCursor(mytemp)
    
        for row in rows:
            pgeometry=row.getValue(shapefieldname)
    
        if row:
            del row
        if rows:
            del rows
        return pgeometry
    #获得一个要素类合并后的图形,自己图形合并
    def getLayerGeomtryPro(inFeature):
        desc = arcpy.Describe(inFeature)
        shapefieldname = desc.ShapeFieldName
        rows = arcpy.SearchCursor(inFeature)
        i=0
        for row in rows:
            if i<1:
                pgeometry=row.getValue(shapefieldname)
            else:
                pgeometry=pgeometry.union(row.getValue(shapefieldname))
    
            i=i+1
        if row:
            del row
        if rows:
            del rows
    
        return pgeometry
    #更新一个表所有图形
    def  updateGeometry(inFeature,pgeometry2):
        desc = arcpy.Describe(inFeature)
        shapefieldname = desc.ShapeFieldName
        rows = arcpy.UpdateCursor(inFeature)
    
        for row in rows:
            row.setValue(shapefieldname,pgeometry2)
            rows.updateRow(row)
    
        if row:
            del row
        if rows:
            del rows
    #度转度分秒
    def dtodmsint(num):
        '''
        bef0: 小数点前面的值
        aft012: 转换后小数点后面第一二位数
        aft034: 转换后小数点后面第三四伴数
        '''
        num = eval(num)
    
        bef0, aft0 = int(num), num-int(num)
    
        aft012, aft034_t = int(aft0*60), aft0*60-int(aft0*60)
    
        aft034 = int(round(aft034_t*60))
    
        if aft034 < 10:
            aft034 = '0'+str(aft034)
    
        elif aft034 == 60:
            aft034='00'
            aft012 += 1
            if aft012==60:
                bef0=bef0+1
                aft012=0
    
        elif aft034 > 60:
            print "error:%s"%aft034
    
        if aft012<10:aft012 = '0' + str(aft012)
    
    
        return "%s°%s′%s″"%(bef0, aft012, aft034)
    #判断一个字符串是否为数字
    def is_number(str):
        try:
            # 因为使用float有一个例外是'NaN'
            if str=='NaN':
                return False
            float(str)
            return True
        except ValueError:
            return False
    #度分秒转度
    def dmstod(dms):
        #arcpy.AddMessage("================================="+dms+"==============================")
        try:
            p = dms.find('°')
            if p<0:
                return str(dms)
            #arcpy.AddMessage("p="+str(p))
            d=string.atof(dms[0:p].strip())
            #arcpy.AddMessage("d="+str(d))
            p1=dms.find('')
            #arcpy.AddMessage("p1="+str(p1))
            if p1<0:
                 p1=dms.find("'")
    
            f=0 #
            if p1>0:
                f=string.atof(dms[p+1:p1].strip())
            else:
                p1=p
            #arcpy.AddMessage("f="+str(f))
    
            p2=dms.find('')
            if p2<0:
                 p2=dms.find('"')
            #arcpy.AddMessage("p2="+str(p2))
    
            s=0 #
            if p2>0:
                s=string.atof(dms[p1+1:p2].strip())
            #arcpy.AddMessage("s="+str(s))
    
            return d+f/60+s/3600
        except ValueError:
            return None
    #获得一个点的投影坐标系
    def getpjxy(gx,gy,sr,GCSsr):
        point = arcpy.Point()
        point.X = gx
        point.Y = gy
    
        pointGeometry = arcpy.PointGeometry(point,GCSsr)
        newpointgeo=  pointGeometry.projectAs(sr)
        p1=newpointgeo.firstPoint
        return p1.X,p1.Y
    #获得一个点的经纬度坐标系
    def getGCSxy(gx,gy,sr,GCSsr):
        point = arcpy.Point()
        point.X = gx
        point.Y = gy
    
        pointGeometry = arcpy.PointGeometry(point,sr)
        newpointgeo=  pointGeometry.projectAs(GCSsr)
        p1=newpointgeo.firstPoint
        return p1.X,p1.Y
    #数字转字符保留几位小数  by gisoracle
    def floattostr(num,xsnum):
        if xsnum==0:
            return str(int(num))
        nd=round(num,xsnum)
        nstr=str(nd)
        idx=nstr.index('.')
        print idx
        p=len(nstr)-idx-1
        print p
        n=xsnum-p
        print n
        s=""
        for i in range(n):
            s=s+"0"
    
        return nstr+s
    
    
    #度转度分秒(秒保留小数位secondNUM)
    def dtodmsbydouble(num,secondNUM):
        '''
        bef0: 小数点前面的值
        aft012: 转换后小数点后面第一二位数
        aft034: 转换后小数点后面第三四伴数
        '''
        if secondNUM<1:
            return dtodmsint(num)
        if not isinstance(num,float):
            num = eval(num)
    
        bef0, aft0 = int(num), num-int(num)
    
        aft012=int(aft0*60)
        aft034_t = aft0*60-int(aft0*60)
    
        aft034 =aft034_t*60
        #arcpy.AddMessage("aft034:"+str(aft034))
        aft034=round(aft034,secondNUM)
    
        if aft034 < 10:
            aft034 = '0'+str(aft034)
    
        elif aft034 == 60:
            aft034='00'
            aft012 += 1
            if aft012==60:
                bef0=bef0+1
                aft012=0
    
        elif aft034 > 60:
            print "error:%s"%aft034
    
        aft034=floattostr(float(aft034),secondNUM)
    
        if aft012<10:aft012 = '0' + str(aft012)
        return "%s°%s′%s″"%(bef0, aft012, aft034)
    
    #获得字段类型是否为文本
    def getFieldTypeIsText(TableName,FieldName):
        desc = arcpy.Describe(TableName)
        FieldName=FieldName.upper()
        for field in desc.fields:
            if field.Name.upper() ==FieldName:
                return field.type=="String"
    
        return False
    #获得指定图层
    def getLayer(layername):
        layername=layername.upper()
        mxd = arcpy.mapping.MapDocument("CURRENT")
        try:
            for lyr in arcpy.mapping.ListLayers(mxd):
                if lyr.name.upper()==layername:
                    return lyr
            return None
        finally:
            del mxd
    #从列表中获得元素的索引idx
    def listindex(mylist,aa):
        num=len(mylist)
        for i in range(num):
            if mylist[i]==aa:
                return i
        return -1
    #两点线
    def gettwoline(pt1,pt2):
        parray=arcpy.Array()
        parray.add(pt1)
        parray.add(pt2)
        polyline = arcpy.Polyline(parray,sr)
        parray.removeAll()
        return polyline
    #有坐标生成点
    def createPoint(x,y):
        point = arcpy.Point() #create an empty Point object
        point.X = float(x)
        point.Y = float(y)
        return point
        #pointGeometry = arcpy.PointGeometry(point,sr)
        #return pointGeometry
    #有最小的xy和最大的XY生成面,有矩形范围生成面
    def createPolygon(xx1,yy1,xx2,yy2):
    
        p1=createPoint(xx1,yy2)
        p2=createPoint(xx2,yy2)
        p3=createPoint(xx2,yy1)
        p4=createPoint(xx1,yy1)
    
        parray=arcpy.Array()
        parray.add(p1)
        parray.add(p2)
        parray.add(p3)
        parray.add(p4)
        parray.add(p1)
        polygon = arcpy.Polygon(parray,sr)
        parray.removeAll()
        return polygon
    #根据一个点创建矩形:
    def getRectbyPoint(pnt,width,hight):
         x=pnt.X
         y=pnt.Y
         xx1=x-width/2
         xx2=x+width/2
    
         yy1=y-hight/2
         yy2=y+hight/2
         pgeo= createPolygon(xx1,yy1,xx2,yy2)
         return pgeo
    #字符串转列表
    def strtoList(text):
        text = text.decode('utf-8')
        pList=[]
        for i in text:
            pList.append(i)
        return pList
    #获得一个数据的工作空间
    def getWorkspace(inFeature):
        desc = arcpy.Describe(inFeature)
        path=desc.path.lower()
        if path.endswith(".mdb") or path.endswith(".gdb"):
            return path
        if os.path.isdir(path):#shp
            return path
        outPath, outFC = os.path.split(path)
        return outPath
    #根据的一个点,距离和角度,获得新点
    def getonePoint(pnt,dis,angle):
        x=pnt.X+dis*math.cos(angle)
        y=pnt.Y+dis*math.sin(angle)
        pt1 =  arcpy.Point(x,y)
        return pt1
    #根据TableName,增加所有字段到outFeature
    def AddAllField(TableName,outFeature):
        desc = arcpy.Describe(TableName)
        plist = []
        for field in desc.fields:
            if field.type!="Geometry" and field.type!="OID":
                plist.append(field.Name)
                arcpy.AddField_management(outFeature,field.Name ,field.type,field.precision,field.scale,field.length)
        return plist
    #旋转某个点,rotateX,rotateY旋转X,y,rotateAngle是旋转角度
    def rotateonePoint(pnt,rotateX,rotateY,rotateAngle):
        x=(pnt.X-rotateX)*math.cos(rotateAngle)-(pnt.Y-rotateY)*math.sin(rotateAngle)+rotateX  # (x - rx0)*cos(a) - (y - ry0)*sin(a) + rx0 ;
        y=(pnt.X-rotateX)*math.sin(rotateAngle)-(pnt.Y-rotateY)*math.cos(rotateAngle)+rotateY #(x - rx0)*sin(a) + (y - ry0)*cos(a) + ry0
        pt1 =  arcpy.Point(x,y)
        return pt1
    #旋转一个点对象
    def MovePoint(pt):
        pnt= pt.getPart(0)
        return rotateonePoint(pnt)
    #旋转多点
    def MoveMPoint(partgeometry):
        array = arcpy.Array()
        num=partgeometry.partCount
    
        for i in range(num):
    
            pt=partgeometry.getPart(i)
            pt=rotateonePoint(pt)
            array.add(pt)
        return array
    #旋转很多点
    def MoveManyPoint(partgeometry):
        array = arcpy.Array()
        num=partgeometry.count
    
    
        for i in range(num):
    
            pt=partgeometry[i]
            pt=rotateonePoint(pt)
            array.add(pt)
        return array
    #把内多边形,分解出来
    def splitNgeometry(mgeometry):
        num=mgeometry.count
        Sumarray = arcpy.Array()
        parray = arcpy.Array()
        for i in range(num):
            pt=mgeometry[i]
            if pt:
                parray.add(pt)
            else:#内多边形
                Sumarray.add(parray)
                parray.removeAll()
        Sumarray.add(parray)
        return Sumarray
    #旋转一个对象
    def Moveobj(geometry):
        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=MoveManyPoint(Splitgeometry)
    
                try:
                    Sumarray.add(array)
                except Exception as err:
                    arcpy.AddError("错误=============j:"+str(j)+","+err.message)
        return Sumarray
    #获得FID对应的图形
    def getFID(FID,pFeatures):
        FIDField=getOIDField(pFeatures)
        wherestr="{0}={1}".format(FIDField,FID)
        #arcpy.AddMessage(u"===="+wherestr)
        with arcpy.da.SearchCursor(pFeatures, "SHAPE@",wherestr) as cursor:
            try:
                for row in cursor:
                    #arcpy.AddMessage(u"————————"+wherestr)
                    return row[0]
            finally:
                del cursor
    #获得对应FID的图形
    def updateFID(FID,pFeatures,geo):
        FIDField=getOIDField(pFeatures)
        wherestr="{0}={1}".format(FIDField,FID)
        with arcpy.da.UpdateCursor(pFeatures, "SHAPE@",wherestr) as cursor:
            try:
                for row in cursor:
                    row[0]=geo
                    cursor.updateRow(row)
            finally:
                del cursor
    #删除对应FID
    def delFID(FID,pFeatures):
        FIDField=getOIDField(pFeatures)
        wherestr="{0}={1}".format(FIDField,FID)
        with arcpy.da.UpdateCursor(pFeatures, "SHAPE@",wherestr) as cursor:
            try:
                for row in cursor:
                    cursor.deleteRow()
            finally:
                del cursor
    #更新某个字段的值
    def updateFieldName(tablename,FieldName,Value):
        rows = arcpy.UpdateCursor(tablename)
        for row in rows:
            row.setValue(FieldName,Value)
            rows.updateRow(row)
        if row:
            del row
        del rows
    #获得一个图层所有的节点数
    def getAllPointCount(fc):
        g = arcpy.Geometry()
        geometryList = arcpy.CopyFeatures_management(fc, g)
        n = 0
        for geometry in geometryList:
            n += geometry.pointCount
        return n
  • 相关阅读:
    JavaScript 核心学习——继承
    吴裕雄--天生自然 PHP开发学习:PhpStorm的配置与安装
    吴裕雄--天生自然 HADOOP大数据分布式处理:安装WinSCP
    吴裕雄--天生自然 HADOOP大数据分布式处理:安装XShell
    云栖专辑 | 阿里开发者们的第14个感悟:技术拓宽价值边界
    玩转大数据系列之四:搜索服务
    RocketMQ源码分析之RocketMQ事务消息实现原下篇(事务提交或回滚)
    RocketMQ源码分析之RocketMQ事务消息实现原理中篇----事务消息状态回查
    RocketMQ源码分析之RocketMQ事务消息实现原理上篇(二阶段提交)
    RocketMQ源码分析之从官方示例窥探:RocketMQ事务消息实现基本思想
  • 原文地址:https://www.cnblogs.com/gisoracle/p/13619697.html
Copyright © 2020-2023  润新知