设为首页 收藏本站
查看: 677|回复: 0

[经验分享] python脚本交换要素XY坐标

[复制链接]

尚未签到

发表于 2017-5-2 11:34:25 | 显示全部楼层 |阅读模式
  在实际工作中你可能会遇到这样的问题,将空间图形的XY坐标进行反转,如下图所示: DSC0000.jpg
  三种类型的要素都可以完成XY坐标点的互换操作。
  整个处理的思路为:
  1.获取输入要素,然后逐个进行遍历
  2.同时新建空间类型相同的要素类,然后创建要素
  3.将遍历要素中所有节点的XY反转后赋予新要素(注意点、线、面的操作略有不同)
  4.保存新建要素,并输出结果。
  参考代码如下(在arcgis9.3环境下测试通过,如果需要在10.0以及以上版本使用可能需要修改部分代码):
  import arcgisscripting, sys, traceback, string, os
gp = arcgisscripting.create(9.3)
gp.overwriteoutput = 1


inFC = gp.GetParameterAsText(0)
outFC = gp.GetParameterAsText(1)
gp.workspace = os.path.dirname(inFC)


desc = gp.Describe(inFC)
shapeField = desc.ShapeFieldName #SHAPE field name
shapeType = desc.ShapeType


# Create output FC for inserting swaped geometries (if not exist)
if not gp.Exists(outFC):
gp.CreateFeatureClass_management(os.path.dirname(outFC),os.path.basename(outFC),shapeType,inFC,"","",inFC)




#define function to insert new row with swaped geometry and field values from oryginal FC
def insertFields(inFields, geometry, outUpdateCursor, inSearchCursorRow):
newFeature = outUpdateCursor.newRow()  #create new row in InsCur
newFeature.shape = geometry    #assign vertex or ARRAY of vertices
#append attributes from oryginal feature class
for fieldName in inFields:
inValue = inSearchCursorRow.getValue(fieldName)
if inValue: #ensures that NULLs will not be copied
newFeature.setValue(fieldName, inValue)
outUpdateCursor.insertRow(newFeature)  #insert new row




try:

# Define progressor to update progress info in dialog box
gp.SetProgressor("default")
count = int(gp.GetCount_management(inFC).getOutput(0))
fcount = 0

#determine fields from input FC which will be copied to output FC
inFieldList = gp.ListFields(inFC)
inFieldNameList = []
for field in inFieldList:
#exclude field wich should not be copied
if (field.editable == True) and (field.name.upper() not in ("SHAPE")):
inFieldNameList.append(field.name)

#open SearchCursor on input FC
rows = gp.SearchCursor(inFC)
row = rows.next()
#open InsertCursor on output FC
outRows = gp.InsertCursor(outFC)


while row:
#create Point and Array object which will contain features vertices
vertex = gp.CreateObject("Point")
featureVertexArray = gp.CreateObject("Array")
partVertexArray = gp.CreateObject("Array")

feature = row.getValue(shapeField) #get the SHAPE field into variable

#update progressor
fcount += 1
progressMessage = "Processing source feature: " + str(fcount) + " of " + str(count)
gp.SetProgressorLabel(progressMessage)


##For point and multipoint geometry there is another way of reading coordinates than for polyline/polygon
if shapeType.upper() == "POINT":
pnt = feature.GetPart() #when POINT, GetPart returns point, not array of points

#for each geometry create new POINT obj and assign swapped Y, X (no need to add vertices to ARRAY)
vertex = gp.CreateObject("Point")
vertex.X, vertex.Y = pnt.Y, pnt.X


insertFields(inFieldNameList, vertex, outRows, row)

elif shapeType.upper() == "MULTIPOINT":
partNum = 0
partCount = feature.PartCount
while partNum < partCount:
pnt = feature.GetPart(partNum) #when POINT, GetPart returns point, not array of points

#for each geometry create new POINT obj and assign swapped Y, X (no need to add vertices to ARRAY)
vertex = gp.CreateObject("Point")
vertex.X, vertex.Y = pnt.Y, pnt.X
featureVertexArray.add(vertex)

partNum += 1 #take next point in next loop run


insertFields(inFieldNameList, featureVertexArray, outRows, row)

else: #polylines and polygons
#feature can have multiple parts - first goes iteration through parts
partNum = 0
partCount = feature.PartCount
while partNum < partCount:
part = feature.GetPart(partNum) #the output is Array of points
pnt = part.next() #take first point from Array of points


#iterate through all points in array
while pnt:
#for each geometry create new POINT obj and assign swapped Y, X. Then add vertices to ARRAY
vertex.X, vertex.Y = pnt.Y, pnt.X
partVertexArray.add(vertex)
pnt = part.next()


#If pnt is null, either the part is finished or there is an interior ring
if not pnt:
pnt = part.next()
featureVertexArray.add(partVertexArray)
partVertexArray.removeAll()

featureVertexArray.add(partVertexArray)
partNum += 1 #increment part number to run loop


insertFields(inFieldNameList, featureVertexArray, outRows, row)


featureVertexArray.removeAll() #clear ARRAY before processing new geometry


row = rows.next() #go to next row in input FC

gp.AddMessage('Swapping XY coordinates finished sucessfully.')


except:
# Get the geoprocessing error messages
msgs = gp.GetMessage(0)
msgs += gp.GetMessages(2)


# Return gp error messages for use with a script tool
gp.AddError(msgs)


# Print gp error messages for use in Python/PythonWin
print msgs


# Get the traceback object
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]


# Concatenate information together concerning the error into a
#  message string
pymsg = tbinfo + "\n" + str(sys.exc_type)+ ": " + str(sys.exc_value)


# Return python error messages for use with a script tool
gp.AddError(pymsg)


# Print Python error messages for use in Python/PythonWin
print pymsg


del gp, inFC, desc, rows, row, feature, pnt, outRows, outFC, vertex, featureVertexArray, partVertexArray, shapeType

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-372094-1-1.html 上篇帖子: python smtplib 发送html格式邮件 下篇帖子: python使用smtp库发送邮件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表