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


18

У мене є клас контурів "Контури" з інтервалом в 0,2 метра. Я хочу вибрати лише ті контури, які знаходяться на відстані 1 м?

Я спробував використати такий синтаксис у діалоговому вікні "Вибрати за атрибутом" (в ArcMap), але він вибирає всі контури:

Mod("ELEVATION", 1)=0

Який запит слід запустити?


Заощадив багато часу для мене, дуже дякую! Ніколи не бачив таких запитних кодів, як "Flor", "Elevation" та "Mod".

Відповіді:


22

Простий фокус для вибору лише цілих значень - це використання наступного синтаксису:

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

Це множення на 10 робить усі значення цілими, а потім вибираємо лише ті, кратні 10.

Якщо ви хочете вибрати кратні з деякого іншого числа, просто помножте 10 на інтервал.

  • Щоб отримати контури з інтервалом 5 м, використовуйте:

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

  • Щоб отримати контури з інтервалом 100 м, використовуйте:

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

Оновлення
Відповідно до порад Вюбера, наведених у коментарі нижче, я додав функцію округлення у виразі запиту.


6
Я не думаю, що я би довіряв цим рішенням. Проблема полягає в тому, що при неінтегральних інтервалах 0,2 база даних, ймовірно, зберігає їх як поплавці. Отже MOD, виникла помилка округлення з плаваючою комою - і це тут критично: якщо ви низький навіть найменш значущою цифрою, ви MODможете повернути неправильне значення (залежно від того, як воно реалізовано). Я хотів би запропонувати округлення значень перед застосуванням MODяк спосіб запобігання цих тонких (і підступних) помилок.
whuber

Округлення потрібно помножити на 10, але перед тим, як знайти мод.
smithkm

1
Якщо я хочу виділити контури з інтервалом 5 м, формула, реалізована як написано вище, вибирає не цілі числа, які округляються до числа, яке рівно ділиться на 5. Наприклад , було вибрано 14,5 м та 19,5 м, але це не бажано. Вони не були вибрані, якщо я скинув частину функції "Круглий".
тривалість

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

Зрештою, це лише інший варіант, який слід розглянути.


2

Це малося означати як коментар до вищезгаданої відповіді - вибачте .

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

Це рівняння

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)

"" рівень "" Встановити поле висоти контуру "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!)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.