字段計算器通過python腳本完成要素節點座標信息提取到屬性字段中

在一些業務場景中需要獲取空間要素的節點座標信息存儲在屬性字段中,如果你使用的是ArcGIS10.3這個版本那麼你可以直接使用 !SHAPE.JSON!:表示幾何的 esri JSON 字符串;!SHAPE.WKB!:OGC 幾何的二進制表達 (WKB);!SHAPE.WKT!:OGC 幾何的文本表示,例如這樣.


在arcpy Cursor方式中也可以使用類似 :for row in arcpy.da.SearchCursor(infc, ["SHAPE@WKT"]):SHAPE@JSON、SHAPE@WKB、SHAPE@WKT的方式獲取,在這裏需要注意的是新建的用於存儲節點信息的字符串字段長度問題,如果長度不夠可能被截取一部分。對於File geodatabase Text field width: 2,147,483,647;shapefile Text field width: 254 characte;personalGDB:Text field width: 255 characte ;ArcSDE:Up to DBMS limits。有人可能對File geodatabase的一些其他限制也感興趣在此一併貼出:

File geodatabase size and name limits are as follows:
File geodatabase size: No limit
Table or feature class size: 1 TB (default), 4 GB or 256 TB with keyword
Number of feature classes and tables: 2,147,483,647
Number of fields in a feature class or table: 65,534
Number of rows in a feature class or table: 2,147,483,647
Geodatabase name length: Number of characters the operating system allows in a folder name
Feature class or table name length: 160 characters
Field name length: 64 characters
Text field width: 2,147,483,647

那麼問題到這裏實際上已經得到了解答,但是你可能有這樣的需求,你的數據是經緯度座標,你需要度分秒(DDMMSS)"形式的節點座標信息,一種辦法是在上面已經獲取到的格式化字符串中提取座標信息,並對這些信息進行換算即可,但是如果你的需求不僅限與此,需要對每個節點的X.Y座標完成更多的操作,那麼就需要遍歷這些節點逐個操作,這就需要自己寫腳本來完成,下面的代碼完成了這部分工作。可以在需要修改的部分進行修改即可,需要注意的是該段代碼做了十進制度轉度分秒的工作,如果你的數據是平面座標註釋掉相應的代碼即可。經過測試可以支持一下要素類型。


def GetFeatureVerticesStr(feat):
 if feat.type=="point":
     pnt=feat.getPart()
     px='%f' %pnt.X
     py='%f' %pnt.Y
     #TranCoorform degree minute second
     px,py=TranCoorform(px,py)
     return "["+px+","+py+"]"
 if feat.type=="multipoint":
     multstr=''
     part=feat.getPart()
     pnt=part.next()
     while pnt:
         px='%f' %pnt.X
         py='%f' %pnt.Y
         #TranCoorform degree minute second
         px,py=TranCoorform(px,py)
         multstr=multstr+"["+px+","+py+"],"
         pnt=part.next()
     return multstr[:-1]
 elif feat.type in["polygon","polyline"]:
     partnum = 0
     partcount = feat.partCount
     pntcount = 0
     ringcount=0
     str=''
     while partnum < partcount:
         part = feat.getPart(partnum)
         partstr=getpartstr(part)
         partnum += 1
         if partnum!=1:
             partstr=","+partstr
         str=str+partstr
     return str
def getpartstr(part):
    strpart=''
    flag=False
    pnt = part.next()
    strpart=strpart+"["
    while pnt:
        px='%f' %pnt.x
        py='%f' %pnt.y
        #TranCoorform degree minute second
        px,py=TranCoorform(px,py)
        strpart=strpart+px+","+py +";"
        pnt = part.next()
        # interior ring
        if not pnt:
            pnt = part.next()
            if pnt:
                if flag:
                    strpart=strpart[:-1]
                    strpart=strpart+"};"
                    flag=False
                strpart=strpart+"{"
                flag=True
            else:
                if flag:
                    strpart=strpart+"}"
                    flag=False
                if strpart[-1]!="}":
                    strpart=strpart[:-1]
                else:
                    strlen=len(strpart)-2
                    strpart = strpart[:strlen] + strpart[strlen+1:]
	        strpart=strpart+"]"
    return strpart
def TranCoorform(x,y):
    dfmx=str(x).split('.')
    dx=dfmx[0]
    ftempx=float("0."+dfmx[1])*60
    fx=str(int(ftempx))
    mx=str(float("0."+str(ftempx).split('.')[1])*60)
    px=dx+"°"+fx+"′"+mx+"″"
    dfmy=str(y).split('.')
    dy=dfmy[0]
    ftempy=float("0."+dfmy[1])*60
    fy=str(int(ftempy))
    my=str(float("0."+str(ftempy).split('.')[1])*60)
    py=dy+"°"+fy+"′"+my+"″"
    return px,py


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章