# -*- 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脚本的更多相关文章

  1. 关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型

    #!/usr/bin/python指定用什么解释器运行脚本以及解释器所在的位置 # -*- coding: utf-8 -*-用来指定文件编码为utf-8的PEP 0263 -- Defining P ...

  2. 【转】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型

    原文网址:http://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/ #!/usr/bin/python 是用 ...

  3. 【转载】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型

    1.#!/usr/bin/python 是用来说明脚本语言是 python 的 是要用 /usr/bin下面的程序(工具)python,这个解释器,来解释 python 脚本,来运行 python 脚 ...

  4. arcgis python脚本工具实例教程—栅格范围提取至多边形要素类

    arcgis python脚本工具实例教程-栅格范围提取至多边形要素类 商务合作,科技咨询,版权转让:向日葵,135-4855_4328,xiexiaokui#qq.com 功能:提取栅格数据的范围, ...

  5. win下python脚本以unix风格换行保存将会报错为编码问题 SyntaxError: encoding problem:gbk

    utf-8与gbk编码都报错 从别人的github拉下来一个python脚本. 直接运行,python报错如下: File ".\drag_files_do_event.py", ...

  6. Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用

    #!/usr/bin/Python指定用什么解释器运行脚本以及解释器所在的位置 # -*- coding: utf-8 -*-用来指定文件编码为utf-8的 估计有不少人注意过一些python脚本开头 ...

  7. python脚本实现集群检测和管理

    python脚本实现集群检测和管理 场景是这样的:一个生产机房,会有很多的测试机器和生产机器(也就是30台左右吧),由于管理较为混乱导致了哪台机器有人用.哪台机器没人用都不清楚,从而产生了一个想法-- ...

  8. Python脚本控制的WebDriver 常用操作 <十七> 获取测试对象的属性及内容

    测试用例场景 获取测试对象的内容是前端自动化测试里一定会使用到的技术.比如我们要判断页面上是否显示了一个提示,那么我们就需要找到这个提示对象,然后获取其中的文字,再跟我们的预期进行比较.在webdri ...

  9. python 脚本查看微信把你删除的好友--win系统版

    PS:目测由于微信改动,该脚本目前不起作用 下面截图来自原作者0x5e 相信大家在微信上一定被上面的这段话刷过屏,群发消息应该算是微信上流传最广的找到删除好友的方法了.但群发消息不仅仅会把通讯录里面所 ...

随机推荐

  1. POJ 1067 取石子游戏

    题意:有两堆个数分别为a和b的石子,两个人轮流取石子,一次可以取一堆中任意个数的石子,或者在两堆中取相同个数的石子,最先没有石子可以取的人输,你先取,赢为1输为0. 解法:威佐夫博弈.看完题先找规律, ...

  2. Could not locate executable null 解决办法

    问题导读: 1.建一个MapReduce Project,运行时发现出问题:Could not locate executable null,该如何解决?2.Could not locate exec ...

  3. Breaking parallel loops in .NET C# using the Stop method z

    List<, , , , , , , , , }; Parallel.ForEach(integers, (int item, ParallelLoopState state) => { ...

  4. NBUT1457 Sona 莫队算法

    由于10^9很大,所以先离散化一下,把给你的这一段数哈希 时间复杂度O(nlogn) 然后就是分块莫队 已知[L,R],由于事先的离散化,可以在O(1)的的时间更新[l+1,r],[l,r+1],[l ...

  5. [King.yue]Ext.net 页面布局Flex

    此属性仅当父布局HboxLayout或使用VboxLayout.此配置选项被应用到子项目容器管理的布局.每个子项目以Flex属性被弯曲的水平根据每个项目的相对弹性值比较,都带有一个弯曲值指定项目金额. ...

  6. QT中使用 slot 传递 opencv 中得Mat对象以及 使用多线程集成开源代码。

    关于 slot传递 Mat 对象 以前一直是使用 Qtimer 定时器,设定超时后读取 dialog 对象的 Mat成员实现在 UI 里显示图像,发现这样对以后集成其他面向过程的代码增加了复杂度. 所 ...

  7. Zabbix探索:Agent配置中Hostname错误引起的Agent.Ping报错

    搭好了Zabbix_Server以后,添加了服务器本身和一台Windows的机器做测试,居然有这样的报警. Zabbix agent on zabbix_client is unreachable f ...

  8. 设计模式_Composite_合成模式

    形象例子: Mary今天过生日.“我过生日,你要送我一件礼物.”“嗯,好吧,去 商店,你自己挑.”“这件T恤挺漂亮,买,这条裙子好看,买,这个包也不错,买.”“喂,买了三件了呀,我只答应送一件礼物的哦 ...

  9. bzoj 3123 [Sdoi2013]森林(主席树,lca,启发式合并)

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

  10. NOIP2009 最优贸易

    3. 最优贸易 (trade.pas/c/cpp) [问题描述] C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间 多只有一条道路直接相连.这 m 条道 ...