2014-12-02 124 views
0

所以我得到的是我正在使用Python的arcpy for ArcGIS。在循环期间更改变量,Python

我的循环之外有几个变量指向我的ArcMap MXD文档中的文本字段。

然后我执行遍历缓冲层的每一行的循环,然后按位置选择位于所述缓冲区内的任何点层。

然后,我想从这些点图层中取值,并填充之前声明的文本字段。

我的麻烦是我想迭代变量,以便每次循环运行时它们指向不同的文本字段。

我的代码:

指着我的MXD文件

HarbName1 = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName1")[0] 
HarbName2 = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName2")[0] 
HarbName3 = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName3")[0] 

第一循环

for row in rows_dfA_Asset: 
    whereClause = '"HARB_CODE" = ' + str(row.getValue("Harb_Code")) 
    arcpy.MakeFeatureLayer_management(dfA_Buffer, output, whereClause, "", "") 
    arcpy.SelectLayerByLocation_management(dfA_Layer, "WITHIN", output, "", "NEW_SELECTION") 
    test = arcpy.SearchCursor(dfA_Layer, fields="Harb_Code; NAME; CAPACACITY; HIGH_BERTH; HarbHiPerc; AvgBerth; HarbAvgPer; CLSD_DET; CLSD_NUM_M; Tot_Num_As; Num_SCH_As; PROV; GOV_SCORE; MAN_SCORE") 

第二个循环这是问题

for field in test: 
    count = count + 1 
    print count 

    HarbName(count) = str(field.getValue("NAME")) 
的文本元素

因此,归结起来,我需要迭代变量名称,它将与指向文本元素的全局变量相匹配。

如果有人可以想办法做到这一点,将不胜感激。我知道我的代码并不是最伟大的,我不是贸易程序员。

+0

对你想要做什么感到困惑,但从我猜你想要一个Python字典。 – user2097159 2014-12-02 19:17:30

+0

@Andrew第二个循环嵌套在第一个循环中吗?如果没有,在第一个循环中迭代一些数据结构,计算一个结果('test'),然后将它扔掉,除了最后一次迭代......这是你真正想要得到的结果吗? – gboffi 2014-12-02 20:39:25

+0

@gbofii是的,我的第二个循环嵌套在我的第一个循环中 – Andrew 2014-12-02 20:52:06

回答

1

我认为评论是正确的。

你想要做的是重组如下:

HarbName1 = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName1")[0] 
HarbName2 = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName2")[0] 
HarbName3 = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName3")[0] 

如:

HarbName = { 1: arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName1")[0], 
      2: arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName2")[0] 
      3: arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName3")[0] 
      } 

然后最后一位是沿着线:假设

for field in test: 
    count = count + 1 
    print count 

    HarbName[count] = str(field.getValue("NAME")) 

该计数是基于零的并且与上面定义的索引匹配

+0

你有一个'+ 1'太多了:在count = count + 1(或者更好:count + = 1)之后,count是1 '。用'HarbName [count + 1]',你开始'Harbname'的索引2 ... – glglgl 2014-12-02 19:24:57

+0

我明白了,好点。我会编辑。 – 2014-12-02 19:25:53

1

你需要的是一个列表。然后您可以通过计数访问每个文本元素。您需要更改:

HarbName1 = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName1")[0] 
HarbName2 = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName2")[0] 
HarbName3 = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName3")[0] 

要:

HarbNames = [] 
HarbNames.append(arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName1")[0]) 
HarbNames.append(arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName2")[0]) 
HarbNames.append(arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName3")[0]) 

或者,更紧凑:

HarbNames = [arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName1")[0], 
      arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName2")[0], 
      arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "HarbourName3")[0]] 

然后,后来,在你的第二个循环,也HarbNames[count](假设count是零基于):

for field in test: 
    print count 

    HarbNames[count] = str(field.getValue("NAME")) 
    count = count + 1