ArcGIS Field Calculator的Python解析器中的基本If / Then?


18

我正在使用ArcGIS 10.2 for Desktop,并且一直在浏览此站点,但似乎还无法弄清答案。对VBA和Python来说是非常新的东西,但是对于ArcGIS来说却是很多年。我知道我可以使用“按属性选择”来缓慢地进行此操作,但这很耗时。

我正在尝试在疾病案例(点层)和美国人口普查区域(多边形层)之间进行空间连接。这需要计数数据。对于每个点/案例,我都有一个名为YEAR的字段,日期范围为2001年至2012年,具体取决于案例发生的年份。我每年需要一个计数列。例如,第一个我打电话给COUNT01。如果YEAR的案件日期为2001,则COUNT01的数字为1。如果是其他年份(2002-2012),则必须为0。我将有COUNT02,COUNT03 ... COUNT12列。不能有“空”值。

到目前为止,这是我尝试过的

在此处输入图片说明

这就是Arc中数据的样子。

在此处输入图片说明


3
我建议您使用Python进行此操作,然后编辑问题以用标记替换vba和标记。尽管尚未消失,但VBScript正在弃用中。我希望一旦您提供了更详细的描述(包括一些显示实际输入和预期输出的示例行的图片/表格),就可以轻松地使用Python解析器。YEAR是日期字段还是包含对应于年份的值的整数字段?vbscriptpython
PolyGeo

感谢您的建议和帮助。我添加了属性表的图像。YEAR输入变量当前存储为Double(从SAS日期解析出来),输出变量列Counts01存储为Short Integer。
BenW 2014年

1
您是否考虑过将汇总统计信息与YEAR用作案例字段?那应该为您提供每年的COUNT,而无需使用Python或字段计算器。
PolyGeo

谢谢你的建议。我确实考虑过汇总统计信息,但最终目标是按照1,249个单独的人口普查区域进行年度病例计数,从中可以计算出每10万年的年度和10年平均发病率。有些人口普查区没有案件,有些没有大量,但我需要将它们全部包括在内。甚至按年总结道,也没有忽略其中的278条。
BenW 2014年

Answers:


38

我认为这就是您想要的....使用python可以执行以下操作(假设YEAR和COUNT0X字段是整数)

  • 更改为Python,如下所示
  • 将代码添加到“逻辑前”输入框中
  • 根据需要为您计算的每个字段更改yearVal(Count01将使用2001,Count02将使用2002,依此类推)

注意Python使用缩进来解析代码,因此请确保间距正确。

def myCalc(year,yearVal):
  if (year == yearVal):
    return 1
  else:
    return 0

这个


3
@BenW-如果这解决了您的问题,请将其标记为答案(答案投票计数下的复选框)。
乍得·库珀2014年

如果我要检查if语句中包含重音字母的字符串值怎么办?
灰线2014年

如果字段使用其他类型,例如文本,双精度等,该怎么办?
khaliff

@khaliff您可以在python代码中插入一些类型转换函数,例如if (int(year) == yearVal): ,或其他(请参见:notifyit.com/articles/article.aspx?p=459269&seqNum=7)。
gisnside

谢谢。您是否还有一个链接,我可以在其中找到有关何时使用myCalc,myFunc,Reclass等的信息?
khaliff

8

这个答案与上面列出的基本相同,但是这是一种不必使用代码块的方法……对于Count01字段,您可以将解析器设置为Python,然后将计算设置为

1 if !YEAR! == 2001 else 0

读取方式是:如果YEAR字段为2001,则将该字段设置为1;如果不是2001,则将该字段设置为0 ...

如果您有多个if条件,则可以在else语句中嵌套第二个(及后续)“ if”条件,例如:

1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else 0)

读取的方式是:如果YEAR字段是2001,则将该字段设置为1;如果不是2001,则将该字段设置为2;如果是2002,则将该字段设置为2;如果不是,则将其设置为0 ...


如果我有多个条件(我的意思是好像我们在使用“ elif”一样),应如何修改此计算?
khaliff

如果您有多个条件,则可以在else语句内嵌套第二个(及后续)“ if”条件...因此您可能最终会遇到这样的情况……1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else (3 if !YEAR! == 2003 else 0))
Jason Miller

6

如果要使用VBScript,则字段计算设置错误。首先,我不会使用作​​为字段名称的变量,这很令人困惑,请使用其他名称,这样它就可以清楚地设置您的设置。您的“ endif”是错误的,应该是“ end if”,并且您的代码应该在逻辑前脚本部分中。正确的设置方法如下所示。但是,正如其他人所说的那样,请不要使用VBScript,因为ESRI会全力以赴地放弃它而转而支持Python。

正确的字段计算器用法


非常感谢您的帮助。我最终选择了Python,因为这似乎是总体共识。
BenW 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.