多边形节点编码python脚本
# -*- coding: cp936 -*-
#本脚以最左边、Y值最大的点为起始点按顺时针为多边形节点编码,生成一个包含记录编码值和多边形FID字段的点要素类
#注意:
#1.本脚本作为arcgis脚本工具使用、脚本测试版本为10.0中文,未装sp5补丁
#2.暂不支持带环多边形,处理带环多边形程序直接崩溃
#3.本工具脚本用到系统工具"多部分(Multipart)至单部分(Singlepart)",因该工具无法完美处理所有的CAD多边形要素类,
# 所以本脚本工具只支持简单CAD多边形要素类。
#Creater: ych
#Create Time:2013年5月1日
import arcpy
import os
#获取单部分多边形最右边且Y值最大的点(边线相交的多边形不适合)
def getRightupperPoint(fc):
points = [point for point in fc.getPart(0)]
XValues = [point.X for point in points]
Xmax_indexs = [XValues.index(x) for x in XValues if x == max(XValues)]
Ymax_index = [i for i in Xmax_indexs if points[i].Y == max([points[j].Y for j in Xmax_indexs ])][0]
RightupperPoint = points[Ymax_index]
return RightupperPoint,Ymax_index
#判断单部分多边形的方向(True 为顺时针,False为逆时针 圆、椭圆返回-1)
def isclockwise(fc):
#找出最右且Y值最大的节点
points = [point for point in fc.getPart(0)]
if len(points)!= 2:
rightupperPoint,rightupperPoint_index = getRightupperPoint(fc)
#如果最右且Y值最大的节点的后一个点(以在points列表中的顺序为参考顺序 )的Y值,比最右且Y值 \
#最大的节点的前一个点的Y值大,则多边形为顺时针,否则为逆时针
if rightupperPoint_index == len(points)-1:
BehindPt = points[1]
else:
BehindPt = points[rightupperPoint_index+1]
prePt = points[rightupperPoint_index-1]
if prePt.X == rightupperPoint.X:
return True
else:
y = (prePt.Y - rightupperPoint.Y)*(BehindPt.X - rightupperPoint.X)/(prePt.X - rightupperPoint.X ) + rightupperPoint.Y
if y <BehindPt.Y:
return True
else:
return False
else:
return -1
#将单部分多边形要素的起始点只设置为最右且Y值最大的点
def changeStartPoint(fc):
points = [point for point in fc.getPart(0)]
if len(points)!= 2:
#计算多边形最右边且Y值最大的点在Points中索引
index_RightupperPoint = getRightupperPoint(fc)[1]
#计算更改了起始点的多边形要素的newpoints
newpoints =[]
newpoints.extend(points[index_RightupperPoint:-1])
newpoints.extend(points[:index_RightupperPoint+1])
#创建新要素
newPolygon = arcpy.Polygon(arcpy.Array(newpoints))
return newPolygon
#len(points) ==2为圆、椭圆
else:
return fc
#主程序
def main():
#设置参数
fcl_input = arcpy.GetParameterAsText(0) #输入多边形要素类
out_PointClass = arcpy.GetParameterAsText(1) #输出点要素类
#创建空的、包含用于存储节点编号的子段的点要素类
name = os.path.basename(out_PointClass)
path = out_PointClass[:-(len(name)+1)]
desc = arcpy.Describe(fcl_input)
pointClass = arcpy.CreateFeatureclass_management(path,name,"POINT","","","",desc.spatialReference)
#添加字段
arcpy.AddField_management(pointClass,"NodeCode","SHORT")
arcpy.AddField_management(pointClass,"PolygonFID","LONG")
#多部分至单部分
scrathName = arcpy.CreateScratchName ("TEMP","","",path)
fcl_input=arcpy.MultipartToSinglepart_management (fcl_input,scrathName)
#创建cursor
rows = arcpy.InsertCursor(pointClass)
rows_fc = arcpy.SearchCursor(fcl_input)
#输入多边形要素类的FID字段
fcID = arcpy.ListFields(fcl_input,"","OID")
for row_fc in rows_fc:
fc = row_fc.shape
#将多边形要素的起始点只设置为最右且Y值最大的点
fc = changeStartPoint(fc)
#获取多边形节点列表
points = [point for point in fc.getPart(0)]
#如果多边形为逆时针,则翻转节点列表,使多边形变成顺时针方向
if isclockwise(fc)==False:
points.reverse()
else:
pass
#将顺时针方向的多边形点列表写到多边形要素类中
for point in points[:-1]:
newrow = rows.newRow()
newrow.shape = point
newrow.NodeCode =points.index(point)+1
newrow.PolygonFID = eval("row_fc."+fcID[0].name)
rows.insertRow(newrow)
arcpy.AddMessage("Nodes of Polygon %s has been successfully decoded."% eval("row_fc."+fcID[0].name))
#删除游标
del rows,rows_fc,row_fc
#删除临时文件
arcpy.Delete_management (fcl_input)
if __name__ == "__main__":
main()
来自:http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=127216
多边形节点编码python脚本的更多相关文章
- 关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型
#!/usr/bin/python指定用什么解释器运行脚本以及解释器所在的位置 # -*- coding: utf-8 -*-用来指定文件编码为utf-8的PEP 0263 -- Defining P ...
- 【转】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型
原文网址:http://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/ #!/usr/bin/python 是用 ...
- 【转载】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型
1.#!/usr/bin/python 是用来说明脚本语言是 python 的 是要用 /usr/bin下面的程序(工具)python,这个解释器,来解释 python 脚本,来运行 python 脚 ...
- arcgis python脚本工具实例教程—栅格范围提取至多边形要素类
arcgis python脚本工具实例教程-栅格范围提取至多边形要素类 商务合作,科技咨询,版权转让:向日葵,135-4855_4328,xiexiaokui#qq.com 功能:提取栅格数据的范围, ...
- win下python脚本以unix风格换行保存将会报错为编码问题 SyntaxError: encoding problem:gbk
utf-8与gbk编码都报错 从别人的github拉下来一个python脚本. 直接运行,python报错如下: File ".\drag_files_do_event.py", ...
- Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用
#!/usr/bin/Python指定用什么解释器运行脚本以及解释器所在的位置 # -*- coding: utf-8 -*-用来指定文件编码为utf-8的 估计有不少人注意过一些python脚本开头 ...
- python脚本实现集群检测和管理
python脚本实现集群检测和管理 场景是这样的:一个生产机房,会有很多的测试机器和生产机器(也就是30台左右吧),由于管理较为混乱导致了哪台机器有人用.哪台机器没人用都不清楚,从而产生了一个想法-- ...
- Python脚本控制的WebDriver 常用操作 <十七> 获取测试对象的属性及内容
测试用例场景 获取测试对象的内容是前端自动化测试里一定会使用到的技术.比如我们要判断页面上是否显示了一个提示,那么我们就需要找到这个提示对象,然后获取其中的文字,再跟我们的预期进行比较.在webdri ...
- python 脚本查看微信把你删除的好友--win系统版
PS:目测由于微信改动,该脚本目前不起作用 下面截图来自原作者0x5e 相信大家在微信上一定被上面的这段话刷过屏,群发消息应该算是微信上流传最广的找到删除好友的方法了.但群发消息不仅仅会把通讯录里面所 ...
随机推荐
- wxWidgets Tutorial
wxWidgets Tutorial网站整理 两个重要的教程网站:1:点这里:2:点这里. 还有一个wxWidgets项目参考的网站:点这里. 已经翻译好的中文教程:点这里. 参考书籍:<wxW ...
- FZU 2176 easy problem (DFS序+树状数组)
对于一颗树,dfs遍历为每个节点标号,在进入一个树是标号和在遍历完这个树的子树后标号,那么子树所有的标号都在这两个数之间,是一个连续的区间.(好神奇~~~) 这样每次操作一个结点的子树时,在每个点的开 ...
- JAVA中关于Map的九大问题
通常来说,Map是一个由键值对组成的数据结构,且在集合中每个键是唯一的.下面就以K和V来代表键和值,来说明一下java中关于Map的九大问题. 0.将Map转换为List类型 在java中Map接口提 ...
- 大公司最喜欢问的Java集合类面试题
看了一些所谓大公司的JAVA面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧. java.util包中包含了一系列重要的集合类,而对于集合类,主要 ...
- Java之序列流SequenceInputStream
序列流:作用就是将多个读取流合并成一个读取流,实现数据的合并 序列流表示其他输入流的逻辑串联.它从输入流的有序集合开始,并从第一个输入流开始读取,直到文件的末尾,接着从第二个输入流读取,以此类推:这样 ...
- BAT及各大互联网公司2014前端笔试面试题:HTML/CSS篇
BAT及各大互联网公司2014前端笔试面试题:HTML/CSS篇 2014/08/03 · Web前端, 开发 · CSS, HTML, 技术面试 分享到: 188 MongoDB集群之分片技术应用 ...
- Java数组的内存管理
Java数组的内存管理 Java语言是典型的静态语言,因此Java的数组是静态的,即当数组被初始化之后,该数组的长度是不可变的.Java程序中的数组必须经初始化才能使用.所谓初始化,就是当数组对象的元 ...
- JPA主键策略
JPA 自带的主键策略有 4 种,在枚举 javax.persistence.GenerationType 中,分别是:TABLE.SEQUENCE.IDENTITY.AUTO. TABLE:通过表产 ...
- MSSQLSERVER数据库- SQL删除重复数据的五种方式
删除重复的数据,在平时的工作中还是会和碰到的,感觉挺有用,从网上摘录的,记在这里,以备需要时查阅 --方法一,IN方式,适合2000/2005/2008,6728 毫秒 DELETE [student ...
- Oracle- 包
在一个大型项目中,可能有很多模块,而每个模块又有自己的过程.函数等.而这些过程.函数默认是放在一起的(如在PL/SQL中,过程默认都是放在一起的,即Procedures中),这些非常不方便查询和维护. ...