【问题标题】:Python for-loop with if-statements带有 if 语句的 Python for 循环
【发布时间】:2013-07-26 20:11:39
【问题描述】:

此代码将用于附加了栅格像元计数的多边形数据。例如,如果栅格是土地覆被,则每个土地覆被类型和每个多边形内的相应像元计数都有一个列。此输出来自地理空间建​​模环境,因为制表栅格不断在我正在使用的大型 shapefile 上崩溃。最终我想要一个面积值,而不是单元格计数,这是下面的代码将实现的。

因此代码将遍历 shapefile 属性,提取原始计数字段,然后根据用户输入创建新字段(通过 AddField 循环使用用户输入名称 + 栅格值以获取新字段名称),然后循环遍历原始字段的值并为新字段计算用户指定的面积值。本质上,我正在尝试自动化添加字段、计算字段模型,我通常在模型生成器中进行批处理。

我无法弄清楚计算新字段的正确逻辑。正如现在所写,它使用 for 循环获取原始字段,但最终只使用最后一个原始字段值,并且仅填充最后一个新字段。我需要循环获取第一个原始字段并将其放入相应的新字段中,这样:

如果 origFields = ('NLCDV1', 'NLCDV2'...) 和 addedFields = ('KM2_LC1', 'KM2_LC2'...) 然后 addField 计算将以适当的值结束: 'KM2_LC1' = 转换(其中转换 = !NLCDV1!* 单元格) 'KM2_LC2' = convert (convert = !NLCDV2!* cell) 等所有可能存在的值。

#User inputs the desired final units, loop through to find the desired units and calculates the new fields.
unit = arcpy.GetParameterAsText(7) #Must be: SqMeter, SqKm, Acres, Hectares, SqMi, or SqFt.

#User must know original units of raster, must be in Meters or Foot_US!!!
for field in origFields:

  if rastunit == "Meter":
    #To make square meters final area unit.
    if unit == "SqMeter":
      arcpy.CalculateField_management(inputPoly, addField, convert, "PYTHON_9.3")

    #To convert square meters into Square Kilometers.
    elif unit == "SqKm":
      arcpy.CalculateField_management(inputPoly, addField, convertsqmsqkm, "PYTHON_9.3")

    #To convert square meters into Acres.
    elif unit == "Acres":
      arcpy.CalculateField_management(inputPoly, addField, convertsqmac, "PYTHON_9.3")

    #To convert square meters into Hectares.
    elif unit == "Hectares":
      arcpy.CalculateField_management(inputPoly, addField, convertsqmhec, "PYTHON_9.3")

    #To convert square meters into Square Miles.
    elif unit == "SqMi":
      arcpy.CalculateField_management(inputPoly, addField, convertsqmsqmi, "PYTHON_9.3")

    #To convert square meters into Square Feet.
    elif unit == "SqFt":
      arcpy.CalculateField_management(inputPoly, addField, convertsqmsqft, "PYTHON_9.3")
    else:
      print arcpy.AddWarning("Ineligible unit provided.")


  elif rastunit == "Foot_US":
    #To make square feet final area unit.
    if unit == "SqFt":
      arcpy.CalculateField_management(inputPoly, addField, convert, "PYTHON_9.3")

  else:
    print "This raster has the following units:" +rastunit+ ". If not in Foot_US or Meters, please reproject the raster."

我只需要弄清楚如何获取对应的原始字段来匹配新添加的字段。我正在考虑使用 zip(origField, addedField, calcs) 之类的东西。当我这样做时,它给了我以下输出:

(u'NLCDV1', 'KM2_LC1', '!NLCDV1! * 900.0')
(u'NLCDV2', 'KM2_LC2', '!NLCDV2! * 900.0')
(u'NLCDV3', 'KM2_LC3', '!NLCDV3! * 900.0')
(u'NLCDV4', 'KM2_LC4', '!NLCDV4! * 900.0')
(u'NLCDV5', 'KM2_LC5', '!NLCDV5! * 900.0')
(u'NLCDV7', 'KM2_LC7', '!NLCDV7! * 900.0')
(u'NLCDV8', 'KM2_LC8', '!NLCDV8! * 900.0')
(u'NLCDV9', 'KM2_LC9', '!NLCDV9! * 900.0')

这些行正是我需要的,但我不确定是否可以使用这样的输出来填充字段,即使可以使用它们,我也是 python 新手,对 zip 非常陌生,所以我不知道不知道怎么用。

我们将不胜感激任何有关逻辑的帮助,并欢迎任何有关清理/重新排序的建议。就像我说的,当这一切都说完后,我还是个新手。一旦我有了逻辑,我就可以走了!感谢您的关注,如果我的代码过于复杂,我们深表歉意(如果是这种情况,也不会感到惊讶)。

【问题讨论】:

  • 请简化您的代码和问题。此外,代码的缩进看起来很乱。
  • 我删除了大部分代码,只留下了我卡住的 for 循环。希望这是可以接受的。当我在 PythonWin 中调试它并且我的整个脚本运行时,缩进运行良好,以澄清。它读取光栅单位,选择正确的 if 语句,然后选择与用户输入的单位相匹配的 if 语句。

标签: python logic arcgis calculated-columns arcpy


【解决方案1】:

我(仍然)不确定我是否理解您的要求,但也许这会有所帮助:

origFields = (u'NLCDV1', u'NLCDV2', u'NLCDV3')
addedFields = ('KM2_LC1', 'KM2_LC2', 'KM2_LC3')
calcs = ('!NLCDV1! * 900.0', '!NLCDV2! * 900.0', '!NLCDV3! * 900.0')

for orig, added, calc in zip(origFields, addedFields, calcs):
    print '{!r}, {!r}, {!r}'.format(orig, added, calc)

输出:

u'NLCDV1', 'KM2_LC1', '!NLCDV1! * 900.0'
u'NLCDV2', 'KM2_LC2', '!NLCDV2! * 900.0'
u'NLCDV3', 'KM2_LC3', '!NLCDV3! * 900.0'

【讨论】:

  • 非常感谢!像魅力一样工作。下次我有问题时,我会尽量说得更清楚。除了仍在学习逻辑之外,还在研究如何在日常对话中使用 Python 行话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
相关资源
最近更新 更多