Python如果是远程字段的函数

Python If Function for Ranged Field

实际上,这是GIS中的一个python,所以我在arcgis中使用table,并尝试对字段进行计数,然后使用category对其进行划分。

我有一个叫Elevation的领域数据包含整数示例:1—23—62—38.5—1211—12

我需要使用以下规则对其进行分类:高程<1,则指数=0.3;如果高程=2-3,则指数=0.6;如果高程>3,则指数=1。

我有这个代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
def Reclass( Elevation ):
    r_min, r_max = (float(s.strip()) for s in Elevation.split('-'))
    print"r_min: {0}, r_max: {1}".format(r_min,r_max)
    if r_min < 1 and r_max < 1:
        return 0.333
    elif r_min >= 1 and r_max >= 1 and r_min <= 3 and r_max <= 3:
        return 0.666
    elif r_min > 3 and r_max > 3:
        return 1
    elif r_min <= 3 and r_max > 3:
        return 1
    else:
        return 999

我的问题是如何剥离它,并使用我上面的规则对其进行分类?感谢之前


基于注释,您的字段是一个字符串,其中包含您上面描述的表单的范围。

首先,这是糟糕的数据库设计。最小值和最大值应该是整数类型的单独列。在ESRI上挥拳致意更多,因为它阻碍了良好的数据库设计。

此外,您的规则不足以处理范围。范围检查要么需要与范围的一端或两端进行比较。所以你必须明确你想要的"索引"规则是什么。

如果您有表示范围的字符串,那么您唯一的选择就是将范围解析为最小值和最大值,并使用这些字符串。这在Python中并不难:

1
2
3
4
5
6
>>> r ="3 - 6"
>>> r_min, r_max = (int(s.strip()) for s in r.split('-'))
>>> r_min
3
>>> r_max
6

这是做什么的?

实际上,这很简单。它通过-拆分字符串。然后,它在结果列表上循环,并且每个元素都删除了其前导和尾随空格,然后转换为int。最后,python解包右边的生成器以填充左边的变量。

请注意,格式错误的数据将导致错误。

一旦您阐明了"索引"规则,您就可以了解如何使用这个最小值和最大值来获得"索引"。


我从您和下面的@jpmc26借用了代码。这段代码(减去用于测试的print语句)应该可以在arcmap的字段计算器中使用,但它只是python代码。问题是,当一个范围的两端分为不同的类别时,您没有告诉我们您要做什么,所以目前我使用了一个else语句来输出999。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def Reclass( Elevation ):
    r_min, r_max = (float(s.strip()) for s in Elevation.split('-'))
    print"r_min: {0}, r_max: {1}".format(r_min,r_max)
    if r_min < 1 and r_max < 1:
        return 0.333
    elif r_min >= 1 and r_max >= 1 and r_min <= 3 and r_max <= 3:
        return 0.666
    elif r_min > 3 and r_max > 3:
        return 1
    else:
        return 999

print Reclass("0 - 1.1")
print Reclass("5.2 - 10")
print Reclass("2 - 3")
print Reclass("0 - 0")