Выбирая контуры, какие высоты целые?

18

У меня есть Contour Featureclass, с интервалом 0,2 метра. Я хочу выбрать только те контуры, которые с интервалом 1 м?

Я попытался использовать следующий синтаксис в диалоговом окне «Выбор по атрибуту» (в ArcMap), но он выбирает все контуры:

Mod("ELEVATION", 1)=0

Какой запрос я должен выполнить?

Девдатта Тенгше
источник
Я сэкономил много времени, большое спасибо! Никогда не видел такие коды запросов, как "Flor", "Elevation" и "Mod".

Ответы:

22

Простой способ выбрать только целочисленные значения - использовать следующий синтаксис:

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

Это умножение на 10 делает все значения целыми, а затем мы выбираем только те, которые кратны 10.

Если вы хотите выбрать Multiples какого-либо другого числа, просто умножьте 10 на интервал.

  • Для получения контуров с интервалом 5 м используйте:

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

  • Для получения контуров с интервалом 100 м используйте:

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

Обновление
В соответствии с рекомендацией Whuber, приведенной в комментарии ниже, я добавил функцию округления в выражение запроса.

Девдатта Тенгше
источник
6
Я не думаю, что я бы доверял этим решениям. Проблема заключается в том, что с неинтегральными интервалами 0,2 база данных, скорее всего, будет хранить их как числа с плавающей запятой. Следовательно, MODбудет возникать ошибка округления с плавающей запятой - и это важно здесь: если у вас низкий даже хотя бы самый младший разряд, он MODможет вернуть неправильное значение (в зависимости от того, как оно реализовано). Я хотел бы предложить округлить значения перед применением MODв качестве способа предотвращения этих тонких (и коварных) ошибок.
whuber
Вам нужно округлить после умножения на 10, но прежде чем найти мод.
smithkm
1
Если я хочу выбирать контуры с интервалами 5 м, формула, реализованная как написано выше, выбирает нецелые числа, округляющие до числа, которое делится на 5, например , были выбраны 14,5 м и 19,5 м, но это нежелательно. Они не были выбраны, если я отбросил «круглую» часть функции.
Delongtime
1
@delongtime Если у вас есть контуры, которые должны иметь нецелые уровни, просто измените второй аргумент, ROUNDчтобы добиться большей точности при округлении.
whuber
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

В конце концов, это просто еще один вариант для рассмотрения.

TGS71
источник
2

Это должно было быть комментарием к вышеуказанному ответу - извините .

Синтаксис может варьироваться в зависимости от типа БД, в которой хранятся ваши контуры, но данное решение, кажется, выбирает контуры после округления их значений. Так, например, в моем тесте был достигнут выбранный набор, который включал 0,3 м и 0,4 м. На самом деле это не исключало ни одно из значений.

Это уравнение

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

Дали мне результаты, которые, казалось, соответствовали тому, что спрашивал спрашивающий.

user23715
источник
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» не является контуром индекса

carfog81
источник
0

Умножьте контур на 10, а затем модуль на 10, чтобы определить, есть ли остаток. Если нет остатка, чем целое число, иначе это число с плавающей точкой.

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

__esri_field_calculator_splitter__
contour_class(!Contour!)
Сэм
источник