选择轮廓是哪个高度是整数?


18

我有一个轮廓要素类,间隔为0.2米。我只希望选择间隔为1 m的那些轮廓?

我已经尝试在“按属性选择”对话框(在ArcMap中)中使用以下语法,但是它选择了所有轮廓:

Mod("ELEVATION", 1)=0

我应该运行什么查询?


为我节省了很多时间,非常感谢!从未见过此查询代码,例如“ Flor”,“ Elevation”和“ Mod”。

Answers:


22

仅选择整数值的简单技巧是使用以下语法:

Mod(Round("ELEVATION", 0)*10, 10)=0

乘以10会使所有值均为整数,然后我们只选择10的倍数。

如果您想选择其他数字的倍数,只需将10乘以间隔即可。

  • 要以5 m的间隔获取轮廓,请使用:

    Mod(Round("ELEVATION",0) * 10, 50)=0

  • 要以100 m的间隔获取轮廓,请使用:

    Mod(Round("ELEVATION", 0) * 10, 1000)=0

更新
根据下面注释中给出的Whuber的建议,我在查询表达式中添加了舍入函数。


6
我认为我不会相信这些解决方案。问题在于,非整数间隔为0.2时,数据库很可能将它们存储为浮点数。因此,这MOD将受到浮点舍入误差的影响,这在这里很关键:如果您的最低有效位数也很低,则MOD可能会返回错误的值(取决于实现方式)。我建议在应用之前四舍五入这些值,MOD以防止出现这些细微(隐患)错误。
whuber

您需要乘以10后四舍五入,但要找到mod。
Smithsmith

1
如果我想以5m的间隔选择轮廓,则如上编写的公式将选择舍入到可以被5整除的数字的非整数,例如,选择了14.5m和19.5m,但这是不希望的。如果我删除函数的“ Round”部分,则不会选择这些选项。
delongtime'1

1
@delongtime如果轮廓应该具有非整数级别,则只需修改第二个参数ROUND即可在舍入中获得更高的精度。
ub

9

这是另一个查询选项。它在很大程度上与上面列出的答案相同,但是(在我看来)针对不同情况进行自定义要容易一些。

显示可被10整除的轮廓

Floor(Elevation/10)=Elevation/10

显示可被50整除的轮廓

Floor(Elevation/50)=Elevation/50

显示半米轮廓

Floor(Elevation/0.5)=Elevation/0.5

显示具有任意偏移的10米轮廓(例如10.2、20.2、30.2)

Floor((Elevation-0.2)/10)=(Elevation-0.2)/10

归根结底,这只是要考虑的另一种选择。


2

这是对以上回答的评论,对不起

语法会因您的轮廓存储在数据库中的类型而异,但是给定的解决方案似乎是在四舍五入它们的值之后选择了轮廓。因此,例如,在我的测试中,这获得了一个选定的集合,该集合包括0.3 m和.4 m。实际上,它不排除任何值。

这个方程

Mod(Round("ELEVATION" * 10, 0), 2)=0

给我的结果似乎与发问者的要求相符。


1

要获取索引轮廓,可以在字段计算器上使用它:

在ARCMAP中

dim dIndexInterval
dim dCont
dim i
dim j
dim k
dim c

dIndexInterval = 200 ' set to interval of index contours
dCont = [level] ' Set to contour height field

i = ROUND(dCont, 0) * 10
j = dIndexInterval * 10
k = i MOD j

if k = 0 then
 c = 1 ' is an index contour
else
 c = 0 ' is not an index contour
end if

'在对话框底部的文本输入字段中键入“ c”(不带引号),然后单击“确定”。

在QGIS中

if(((round("level", 0) * 10) % (200 * 10)) = 0, 1, 0)

“” level“”设置为轮廓高度字段“ 200”设置为索引轮廓的间隔

然后:“ 1”是索引轮廓,“ 0”不是索引轮廓


0

将轮廓乘以10,然后将模数乘以10,以确定是否有余数。如果没有余数,则为整数。

def contour_class(contour):
    if ((contour * 10) % 10) == 0:
        return "Integer"
    else:
        return "Float"

__esri_field_calculator_splitter__
contour_class(!Contour!)
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.