Вычисление значений полей

Вычисление полей позволяет владельцу размещенного векторного слоя или администратору организации менять значения каждой строки определенного поля в таблице атрибутов слоя.

Например, если у вас есть размещенный векторный слой с информацией о продаже объектов недвижимости - включая цену продажи и налоговую ставку - вы можете добавить поле для хранения предполагаемой суммы налога. Чтобы заполнить поле estimated_property_taxes, задайте вычисление выражения поля, которое считывает значения поля sale_price и умножает их на значения tax_rate.

Есть два способа написания выражений в калькуляторе полей слоев размещенного векторного слоя:

  • ArcGIS Arcade - Arcade подходит для вычислений, требующих большего функционала, чем предоставляет SQL, поскольку Arcade обеспечивает доступ к атрибутивным значениям и геометрии объектов, что позволяет вам создавать выражения, содержащие пространственные операции. Кроме того, если при вычислении конкретной строки возникает ошибка, можно остановить процесс, понять проблему и после ее решения начать вычисление заново.

    Примечание:

    Версии ArcGIS API for JavaScript 3.44 и более поздних версий не будут обновляться с учетом новейших функций языка ArcGIS Arcade. Выражения Arcade, созданные в приложениях JavaScript API версии 3.44 или более поздней, будут поддерживать только функции языка Arcade, представленные в версии Arcade 1.21 или более ранней. Более подробно о поддержке языка Arcade в продуктах ArcGIS см. Матрицу версий Arcade.

  • SQL – используйте SQL для достижения высокой производительности при вычислениях непространственных атрибутов, которые можно выразить с помощью стандартизованного языка SQL (SQL-92). Можно запустить SQL-запросы для размещенных векторных слоев со включенной синхронизацией и слоев, настроенных на отслеживание создателей и редакторов объектов. Для таких слоев выражения Arcade использоваться не могут.

В следующем разделе объясняется, как рассчитать значения поля на странице подробной информации о размещенном векторном слое. Последующие разделы содержат примеры наиболее частых вычислений.

Вычисление значения поля

Выполните эти шаги, чтобы вычислить значения типа string, date или числовые значения.

Примечание:
Вычисления полей отменить нельзя. Поэтому, лучше всего добавить поле, вычислить значения в нем, и убедиться, что это те вычисления, которые вам требуются. Если это так, можно вычислить исходное поле так, чтобы оно стало равным добавленному полю. Когда вы убедитесь, что значения в исходном поле верны, добавленное поле можно удалить.

  1. На странице элемента слоя, щелкните вкладку Данные, чтобы открыть таблицу.
    Подсказка:

    Эти шаги можно выполнить также из таблицы в Map Viewer Classic.

  2. Щелкните столбец, содержащий поле, значение которого вы хотите вычислить.
  3. Чтобы открыть диалоговое окно Вычислить поле, выполните какое-то из следующих действий:
    • Нажмите кнопку Вычислить.
    • Щелкните Показать подробный вид > Вычислить.
  4. Выберите язык для выражения: Arcade или SQL.

    Если для размещенного векторного слоя включена синхронизация либо он настроен на отслеживание создателей и редакторов объектов, эту страницу вы не увидите. Вместо нее откроется диалоговое окно для создания выражения SQL.

  5. Составление выражения вычисления.
    • Для выражения SQL пользуйтесь основными операторами, списком полей и функциями. Нажмите на кнопку Проверить, чтобы убедиться в отсутствии ошибок в выражении. Если выражение некорректно, щелкните кнопку Удалить и создайте новое. После создания корректного выражения щелкните Вычислить.
    • Для Arcade используйте глобальные переменные, функции и константы. Щелкните OK, чтобы запустить выражение. При возникновении ошибки можно щелкнуть Просмотреть ошибку, чтобы открыть окно выражения для исправления ошибки. Либо нажмите Отмена. Если вы откорректируете выражение и снова его запустите, вычисление начнется заново.

Время вычисления зависит от сложности выражения и числа объектов в слое.

Примеры выражений

В следующих разделах приведен примерный синтаксис для выполнения наиболее частных вычислений в ArcGIS Online.

Выполните математическую операцию над числовыми значениями в двух существующих полях, чтобы заполнить третье поле.

Одним из наиболее распространенных вычислений, которые вы выполняете, является вычисление нового числового значения на основе существующих значений вашего векторного слоя. Например, вы можете вычесть значение продаж за один год для всех ваших магазинов из сумм продаж за другой год, чтобы найти изменение прибыли от одного года к следующему, или вы можете разделить общее количество жителей в возрасте до 18 лет на общую численность населения, чтобы определить долю, которое составляют люди в возрасте до 18 лет.

Примеры Arcade

Вычислите разность значений двух числовых полей: Sales2016 и Sales2017 и заполните этими значениями числовое поле.

$feature.Sales2016 - $feature.Sales2017

Примеры SQL

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

PopUnder18/TotalPop

Объединение строковых значений существующих полей в новое строковое поле

Другое вычисление, которое заполняет новое поле, включает объединение значений из существующих строковых полей. Например, у вас может быть два строковых поля для хранения расположения номеров в отеле - Этаж (Floor) и Комната (Room) - и вы хотите объединить их в строковое поле, содержащее обе этих строки.

В следующих примерах значения полей Floor и Room будут объединены в одно поле.

Пример Arcade

Concatenate($feature.room,$feature.floor)

Пример SQL

CONCAT(Floor,Room)

Удаление конечных или начальных пробелов из строковых полей

Когда люди вводят или вставляют значения в поле при редактировании, они могут допускать ошибки и, например, оставлять в тексте ненужные конечные или начальные пробелы. Эти ошибки можно исправить, удалив пробелы.

В этих примерах редактор вставлял завершающий пробел при вставке значения New Hampshire в поле, в котором хранятся имена штатов, поэтому вы удалите завершающий строку пробел.

Пример Arcade

Trim('New Hampshire ')

Пример SQL

Trim(TRAILING ' ' FROM 'New Hampshire ')

Заполните поле различными значениями, исходя из значений в другом поле

Иногда значение, которое должно добавиться в поле, зависит от объекта и от другого значения для того же объекта. Например, вы можете добавить строковое поле в векторный слой для хранения текста, который описывает числовое или сокращенное строковое значение в другом поле. Поскольку интерфейс вычислений SQL не поддерживает это, используйте Arcade для этих типов вычислений.

Пример Arcade

В следующем примере в текстовое поле записываются разные строковые значения - None, Low, High или Other - в зависимости от значения, которое содержится в другом поле слоя (HowMany).

When(
  $feature.HowMany == 0, "None",
  $feature.HowMany == 1, "Low",
  $feature.HowMany == 2,  "High",
"Other")

Замена одного значения на другое

Если вам нужно заменить существующее значение другим - например, когда изменился способ представления определенного значения или если вам нужно исправить неверно введенные значения - вы можете найти все существующие значения поля и заменить их новым значением. Поскольку интерфейс вычислений SQL не поддерживает это, используйте Arcade для этих типов вычислений.

Внимание:

Вычисления будут автоматически сохранены в векторном слое. Если вы по ошибке перезаписали имеющееся значение, вам потребуется снова выполнить вычисление, чтобы вернуть назад правильное значение.

Пример Arcade

В данном случае используется функция Replace для изменения британского написания (colour) на американское.

Replace($feature.color, 'colour', 'color')

Определение плотности на единицу площади для числового атрибута

Чтобы вычислить плотность на единицу площади какого-либо атрибутивного показателя, воспользуйтесь выражением Arcade, так как для пространственного поля в интерфейсе вычисления нельзя использовать язык SQL.

Пример Arcade

В этом примере для каждого объекта определяется плотность населения, путем деления значения населения (TotalPop) на площадь полигонального объекта, выраженную в квадратных милях:

$feature.TotalPop / Area ($feature,
'square-miles')

Вычисление координаты точечного объекта

Вы можете использовать выражение Arcade, чтобы получить значения долготы или широты для пространственных полей размещенного векторного слоя, который содержит только точки.

Этот тип вычисления не поддерживается для пространственного поля в интерфейсе вычисления.

Пример Arcade

В этом примере с помощью функции Geometry в поле вычисляется координата x- каждой точки слоя.

Geometry($feature).x

Добавление времени или выделение времени из даты

Вы можете добавить время или вычесть время из поля дат, чтобы создать обновленное поле дат. Например, можно вычислить будущую дату инспекции или осмотра, добавив к дате значение времени.

Пример Arcade

В данном примере используется функция DateAdd, которая добавляет семь дней к дате для получения соответствующего дня следующей недели.

var startDate = Date($feature.dateField);
var oneWeekLater = DateAdd(startDate, 7, 'days');
return oneWeekLater;

Примеры SQL

Следующие вычисления можно использовать, чтобы добавить или вычитать время из поля дат или с помощью поддерживаемых SQL дат. Первое использует поля дат, а второе – значения литералов дат. Также можно использовать числовые поля и числовые литералы. Поддерживается любая комбинация полей и литералов, как это показано в третьем и четвертом вычислениях.

<DateField> +/- <NumberField> = updated date
DATE'<SQL-supported Date Literal>'  +/- <Number of Days> = updated date
<DateField> +/- <Number of Days> = updated date
DATE'<SQL-supported Date Literal >'  +/- <NumberField> = updated date

Вычисленное поле дат является исходным полем дат плюс/минус количество дней, которое необходимо добавить или вычесть. Количество дней может быть целым числом, а также может включать дробную часть, например, 1.5 – это полтора дня или 36 часов.

В следующем примере механизм установлен 6/14/2016 в 10:00. Можно использовать одно из следующих вычислений, чтобы получить дату инспекции через месяц (30 дней) после даты установки. Первое вычисление использует поле дат со значением 6/14/2016 и числовое поле со значением 30, а второе использует литерал дат и числовой литерал.

<MyDateField> + <MyNumberField> = 7/14/2016 10:00 AM
DATE'6/14/2016' + 30 = 7/14/2016 10:00 AM

Вычисление разницы между двумя датами

Может понадобиться вычислить временной диапазон между двумя датами. Например, у вас есть даты установки механизмов и даты проверок, на их основе можно вычислить разницу между двумя датами, чтобы убедиться, что диапазоны времени между проверками укладываются в допустимые нормативы. Результатом вычисления будет числовое поле, а не поле типа дата.

Пример Arcade

В следующем примере функция DateDiff используется для вычисления возраста человека путем нахождения разницы между текущей датой (endDate) и датой его рождения (startDate):

var startDate = Date($feature.startDateField);
var endDate = Date($feature.endDateField);
var age = DateDiff(endDate, startDate, 'years');
return age;

Примеры SQL

Для вычисления диапазона между двумя датами можно использовать любую комбинацию полей дат и литералов дат. Первое вычисление ниже использует поле дат, а второе – литерал дат. Третье и четвертое вычисления используют и поле дат, и литерал дат.

<DateField1> - <DateField2> = number of days in between
DATE'<SQL-supported Date Literal>' - DATE'< SQL-supported Date Literal>' = number of days in between
<DateField1> - DATE'<SQL-supported Date Literal>' = number of days in between
DATE'<SQL-supported Date Literal>' - <DateField2>  = number of days in between

В результате получается числовое поле, которое вычисляется путем выделения одного поля/литерала дат из другого поля/литерала дат. Результат (количество дней) может быть целым числом, а также может включать дробную часть. например, 1.5 – это полтора дня или 36 часов.

В описанном ранее примере с проверками установленного механизма можно использовать любые из следующих вычислений, чтобы получить диапазон времени между датой установки 6/1/2015 и датой проверки 10/1/2015. Первое вычисление использует поля дат, второй – литералы дат, а третье и четвертое использует и те, и другие.

<InspectionDateField> - <InstallationDateField> = 122 (days)
DATE'10/1/2015' - DATE'6/1/2015' = 122 (days)
<InspectionDateField> - DATE'6/1/2015' = 122 (days)
DATE'10/1/2015' - <InstallationDateField> = 122 (days)

Ограничения при вычислении значений полей

  • Если установлен фильтр для вашего слоя на карте, то будут рассчитаны только те записи, которые удовлетворяют условию фильтра.
  • При использовании выражений SQL инструмент Вычислить поле работает только с именами полей, а не с их псевдонимами. Список Поля отображает имена всех доступных для вычислений полей. Вы можете отфильтровать данный список по полям типов Текстовое, Числовое и Дата.
    • Если вы наведете курсор на имя поля в списке Поля, то будут отображены псевдоним поля и тип поля.
    • Если вы щелкните имя поля в списке Поля, данное поле будет добавлено в выражение.
  • Вы не можете вычислять значения полей в копиях размещенных векторных слоев или в размещенных векторных слоях, с которыми связаны слои листов.
  • Вычисленные значения размещенного векторного слоя или вида не переходят на зависимые размещенные слои сцены.
  • Локально-специфичное форматирование не поддерживается в числах для выражений SQL. Например, если выбрана локаль Испании, в таблице атрибутов необходимо использовать точку для отделения десятичных знаков, вместо запятой.
  • Использовать числовую функцию MOD с полями типа double нельзя. Преобразуйте поле в целочисленное, как показано в этом примере.
  • Нельзя использовать выражения Arcade для размещенных векторных слоев со включенной синхронизацией или настроенных на отслеживание пользователей, создавших или изменивших объекты.
  • Вы не можете использовать Arcade для вычисления значений для следующих типов данных полей на странице сведений об элементе векторного слоя:
    • Большое целое (Big integer)
    • Только дата
    • Только время
    • Сдвиг метки времени

    Примечание:
    Когда любой слой в размещенном векторном слое содержит эти типы данных, вычисления Arcade отключаются для всего размещенного векторного слоя, даже для тех подслоев, которые не содержат неподдерживаемых типов данных.

Справка по стандартизированному SQL (SQL-92)

При написании выражения SQL для вычисления значений поля необходимо использовать стандартизированный SQL. В этом разделе содержится список функций и операторов SQL, которые можно использовать в выражениях SQL в ArcGIS Online.

После создания вашего SQL выражения нажмите кнопку Вычислить. Если есть ошибки, то сообщение об ошибке появится в нижней части диалогового окна. Исправьте выражение и запустите вычисление снова.

Операторы

В диалоговом окне Вычислить поле вы можете построить простые SQL выражения с использованием таких операторов, как плюс, минус, умножить и разделить. Примеры и советы по использованию этих операторов:

  • Для умножения всех значений в числовом поле с именем SAMPLE на 100.0, введите выражение SAMPLE * 100.0.
  • Для более сложных выражений вы можете использовать круглые скобки для задания порядка вычислений, например, SAMPLE * (BASELINE – 40).
  • Математические операторы не работают со строковыми полями. Вам потребуется использовать строковые функции, описанные в разделе Строковые функции.
  • Если вы вычисляете поле типа double по значениям целочисленного поля, то функция CAST может быть автоматически добавлена в ваше выражение. Например, если вы вычисляете поле типа double с именем POP по значениям целочисленного поля с именем SAMPLE, выражение появится в виде CAST(SAMPLE AS FLOAT). Не удаляйте функцию CAST. См. ниже Числовые функции для информации по функции CAST.
  • Чтобы включить апостроф в строку, используйте два одиночных символа кавычек для апострофа. Например, 'Nightingale''s'. Не используйте символ двойных кавычек.

Функции

В дополнение к простым выражениям с использованием операторов, в выражениях SQL вы можете также использовать функции. Функции работают с именами полей, литералами и другими функциями. Предположим, вам нужно вычислить поле double, которое TOTALPOP делится на POP18. Если значение POP18 какого либо из объектов равно нулю, то такое вычисление приведет к ошибке деления на нуль. Можно защититься от этого, используя описанную ниже функцию NULLIF. Выражение будет TOTALPOP / NULLIF(POP18, 0).

Функции принимают аргументы. В таблицах ниже, любой аргумент может быть следующим:

  • Имя поля, при условии, что тип поля соответствует типу аргумента (строка, число или дата).
  • Строка символов, такая как 'Sailboat' (строка в одинарных кавычках), число 5 или дата в формате ДД/ММ/ГГ чч:мм:сс в одинарных кавычках.
  • Функция, которая возвращает значение надлежащего типа (строка, число или дата). Например, FLOOR(POWER(SAMP_ERR, 0.5)) возвращает наибольшее целочисленное, которое меньше или равно квадратному корню из SAMP_ERR.

Для иллюстрации, примеры в описательном столбце следующих таблиц в основном используют символьные аргументы. Вы можете заменить имя поля или другую функцию для этих аргументов.

Функции дат

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

При работе с полями дат рекомендуется учитывать некоторые важные аспекты.

Можно использовать любую комбинацию числовых полей, полей дат и литералов для вычисления поля типа дата. При работе с литералами дат, необходимо использовать форматы дат, поддерживающие SQL.

Доступны следующие функции дат:

ФункцияОписание

CURRENT_DATE()

Возвращает текущую дату в формате времени UTC.

Способ отображения зависит от используемого клиента. В ArcGIS Online даты отображаются в часовом поясе вашей организации или профиля.

CURRENT_TIME()

Возвращает текущие дату и время в формате UTC (часы, минуты, секунды).

Способ отображения зависит от используемого клиента. В ArcGIS Online время отображается в часовом поясе вашей организации или профиля.

CURRENT_TIMESTAMP()

Возвращает текущие дату и время в формате UTC (часы, минуты, секунды, миллисекунды).

Способ отображения зависит от используемого клиента. В ArcGIS Online время отображается в часовом поясе вашей организации или профиля.

EXTRACT(<unit> FROM <date>)

Возвращает одну часть (<unit>) указанного <date>. Возможные значения <unit> включают год, месяц, день, час и минуту, но не ограничиваются ими.

Примеры

  • EXTRACT(MONTH FROM 12/21/2016) — возвращает 12.
  • EXTRACT(DAY FROM 12/21/2016 12:00) — возвращает 21.
  • EXTRACT(HOUR FROM 12/21/2016 15:00) — возвращает 15.

Числовые функции

ФункцияОписание

ABS(<number>)

Возвращает абсолютное (положительное) значение заданного числа.

CEILING(<number>)

Возвращает наименьшее целочисленное значение, большее или равное указанному числу.

Пример

  • CEILING(12.93) – результат равен 13.

COS(<number>)

Возвращает тригонометрический косинус <number>, который должно представлять значение угла в радианах.

CAST(<number> AS FLOAT | INT)

Конвертирует число в другой тип. FLOAT конвертирует указанное число в значение с двойной точностью, а INT конвертирует в целое число.

FLOOR(<number>)

Возвращает наибольшее целое значение, меньшее или равное указанному числу.

Пример

  • FLOOR(12.93) – результат равен 12.

LOG(<number>)

Возвращает натуральный логарифм указанного числа.

LOG10(<number>)

Десятичный логарифм указанного числа.

MOD(<number>, <n>)

Возвращает остаток после деления делимого (<number>) на делитель <n>. <n> и <number> должны быть целочисленными.

Примеры:

  • MOD(10, 4) – результат равен 2.
  • MOD(CAST(DBLFIELD AS INT), 4) – – это поDBLFIELDле типа с двойной точностью, поэтому для конвертации значений из двойных в целые необходима функция CAST.

NULLIF(<number>, <value>)

Возвращает null, если указанное число равно заданному значению. NULLIF обычно используется, чтобы избежать ошибок деления на ноль в случае, когда для <value> задано 0.

Каждый раз, когда в вычислении встречается значение поля null в любом из его аргументов, результатом вычисления будет null.

Предположим, вам нужно вычислить поле double, которое TOTALPOP делится на POP18. Если любой объект имеет значение POP18, равное нулю, такое вычисление приведет к ошибке деления на ноль. Вы можете создать фильтр, чтобы скрыть записи, где значение равноPOP18 нулю, а затем выполнить необходимые вычисления. Более легкий способ - использовать NULLIF.

  • TOTALPOP / NULLIF(POP18, 0) – возвращает null, если POP18 равно нулю; в противном случае возвращается значение TOTALPOP / POP18.

POWER(<number> , <y>)

Возвращает значение указанного числа, возведенное в указанную степень (<y>).

ROUND(<number> , <length>)

Округляет число до заданной длины.

Если для <length> задано положительное число, то число округляется до десятичной позиции, определяемой параметром <length>. Если <length> является отрицательным числом, то указанное <number> округляется с левой стороны от десятичной точки.

Примеры

  • ROUND(10.9934,2) — возвращает 10,99.
  • ROUND(10.9964,2) — возвращает 11,00.
  • ROUND(111.0,-2) — возвращает 100,00.

SIN(<number>)

Возвращает тригонометрический синус <number>, который должен представлять значение угла в радианах.

TAN(<number>)

Возвращает тангенс <number>, который должен представлять значение угла в радианах.

TRUNCATE(<number>,<decimal_place>)

Сокращает <number> до указанной <decimal_place>.

Положительное значение <decimal_place> сокращает до заданной десятичной позиции. Если <decimal_place> является отрицательным числом, то <number> округляется с левой стороны от десятичной точки.

Примеры

  • TRUNCATE(111.996,2) – возвращает 111,99.
  • TRUNCATE(111.996,-2) — возвращает 100,00.

Строковые функции

ФункцияОписание

CHAR_LENGTH(<string>)

Возвращает число символов указанного строкового выражения. Результат является целым числом.

Пример

  • CHAR_LENGTH('Redlands') – результат равен 8.

CONCAT(<string1>, <string2>)

Соединяет два строковых значения.

Могут быть предоставлены только две строки. Чтобы объединить более двух строк, вложите последовательные функции CONCAT, как показано ниже.

Примеры

  • CONCAT('A', 'B') — результат равен 'AB'.
  • CONCAT('A', CONCAT(':', 'B')) — результат равен 'A:B'.

Значения Null конвертируются в пустую строку.

POSITION(<substring>, <string>)

Возвращает позицию первого появления подстроки в указанной строке. Если подстрока не найдена, то результат - 0.

Примеры

  • POSITION('boat', 'Sailboat') – результат равен 5.
  • POSITION('motor', 'Sailboat') – результат равен 0.

SUBSTRING(<string>, <start>, <length>)

Возвращает часть значения строки; <start> является целочисленным индексом, который определяет, где начинаются возвращаемые символы, а <length> представляет число символов, которые должны быть возвращены.

Примеры

  • SUBSTRING('Sailboat', 5, 4) — результат равен 'boat'.
  • SUBSTRING('Sailboat', 1, 4) — результат равен 'Sail'.
  • SUBSTRING('Sailboat', 5, 100) — результат равен 'boat'.

TRIM(BOTH | LEADING | TRAILING ' ' FROM <string>)

Возвращает строку, в которой все начальные и конечные пробелы удалены.

Пример

  • TRIM(BOTH ' ' FROM ' San Bernardino ') — результат равен 'San Bernardino'.

Обратите внимание, что второй аргумент отделяют два символа одинарных кавычек с пробелом между ними.

UPPER(<string>)

Возвращает строку, в которой все символы преобразованы в символы верхнего регистра.

Пример

  • UPPER('Sailboat') — результат равен 'SAILBOAT'.

LOWER(<string>)

Возвращает строку, в которой все символы преобразованы в символы нижнего регистра.

Пример

  • LOWER('Sailboat') — результат равен 'sailboat'.