Вычисление полей позволяет владельцу размещенного векторного слоя или администратору организации менять значения каждой строки определенного поля в таблице атрибутов слоя.
Например, если у вас есть размещенный векторный слой с информацией о продаже объектов недвижимости - включая цену продажи и налоговую ставку - вы можете добавить поле для хранения предполагаемой суммы налога. Чтобы заполнить поле 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 или числовые значения на странице элемента векторного слоя.
Примечание:
Вычисления полей отменить нельзя. По этой причине рекомендуется добавить поле, вычислить в нем значения и подтвердить, что вычисление соответствует вашим требованиям. Если это так, можно вычислить исходное поле так, чтобы оно стало равным добавленному полю. Когда вы убедитесь, что значения в исходном поле верны, добавленное поле можно удалить.
- На странице элемента слоя, щелкните вкладку Данные, чтобы открыть таблицу.
- Щелкните столбец, содержащий поле, значение которого вы хотите вычислить.
- Чтобы открыть диалоговое окно Вычислить поле, выполните какое-то из следующих действий:
- Нажмите кнопку Вычислить.
- Щелкните Показать подробный вид > Вычислить.
- Выберите язык для выражения: Arcade или SQL.
Если для размещенного векторного слоя включена синхронизация либо он настроен на отслеживание создателей и редакторов объектов, эту страницу вы не увидите. Вместо нее откроется диалоговое окно для создания выражения SQL.
- Составление выражения вычисления.
- Для выражения 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)
Ограничения при вычислении значений полей
- Когда вы вычисляете значения для слоя в Map Viewer Classic и у вас установлен фильтр слоя, то будут вычислены только те записи, которые удовлетворяют условию фильтра.
- При использовании выражений SQL инструмент Вычислить поле работает только с именами полей, а не с их псевдонимами. Список Поля отображает имена всех доступных для вычислений полей. Вы можете отфильтровать данный список по полям типов Текстовое, Числовое и Дата.
- Если вы наведете курсор на имя поля в списке Поля, то будут отображены псевдоним поля и тип поля.
- Если вы щелкните имя поля в списке Поля, данное поле будет добавлено в выражение.
- Вы не можете вычислять значения полей в копиях размещенных векторных слоев или в размещенных векторных слоях, с которыми связаны слои листов.
- Вычисленные значения размещенного векторного слоя или вида не переходят на зависимые размещенные слои сцены.
- Локально-специфичное форматирование не поддерживается в числах для выражений SQL. Например, если выбрана локаль Испании, в таблице атрибутов необходимо использовать точку для отделения десятичных знаков, вместо запятой.
- Использовать числовую функцию MOD с полями типа double нельзя. Преобразуйте поле в целочисленное, как показано в этом примере.
- Нельзя использовать выражения Arcade для размещенных векторных слоев со включенной синхронизацией или настроенных на отслеживание пользователей, создавших или изменивших объекты.
- Вы не можете использовать Arcade для вычисления значений для следующих типов данных полей на странице элемента векторного слоя:
- Большое целое
- Только дата
- Только время
- Сдвиг метки времени
Примечание:
Когда любой слой в размещенном векторном слое содержит эти типы данных, вычисления 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, дата в формате MM/DD/YYYY hh:mm:ss или YYYY-MM-DD, или время в формате HH:MM:SS в одинарных кавычках.
- Функция, которая возвращает значение надлежащего типа (строка, число или дата). Например, 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> включают, в том числе: year, month, day, hour и minute. В следующих примерах извлекаются различные единицы из значения даты и времени 21.12.2021 15:11:
|
Числовые функции
Функция | Описание |
---|---|
ABS(<number>) | Возвращает абсолютное (положительное) значение заданного числа. |
CAST(<number> AS FLOAT | INT) | Конвертирует число в другой тип. FLOAT конвертирует указанное число в значение с двойной точностью, а INT конвертирует в целое число. В первом примере ниже число преобразуется в целое. Поскольку числа являются целыми числами, результатом будет 1424. Во втором примере целое число преобразуется в число с плавающей точкой, что приводит к десятичному числу: 1424.0
|
CEILING(<number>) | Возвращает наименьшее целочисленное значение, большее или равное указанному числу. В следующем примере возвращается 13: CEILING(12.93) |
COS(<number>) | Возвращает тригонометрический косинус <number>, который должно представлять значение угла в радианах. |
FLOOR(<number>) | Возвращает наибольшее целое значение, меньшее или равное указанному числу. В следующем примере возвращается 12: FLOOR(12.93) |
LOG(<number>) | Возвращает натуральный логарифм указанного числа. |
LOG10(<number>) | Десятичный логарифм указанного числа. |
MOD(<number>, <n>) | Возвращает остаток после деления делимого (<number>) на делитель <n>. <n> и <number> должны быть целочисленными. Примеры:
|
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>). В следующем примере возвращается 32768: POWER(8,5) |
ROUND(<number> , <length>) | Округляет число до заданной длины. Если для <length> задано положительное число, оно будет округляться до десятичной позиции справа от разделителя десятичных знаков. Если <length> является отрицательным числом, то указанное <number> округляется с левой стороны от десятичной точки. Примеры приведены ниже:
|
SIN(<number>) | Возвращает тригонометрический синус <number>, который должен представлять значение угла в радианах. |
TAN(<number>) | Возвращает тангенс <number>, который должен представлять значение угла в радианах. |
TRUNCATE(<number>,<decimal_place>) | Сокращает <number> до указанной <decimal_place>. Положительное значение <decimal_place> сокращает до заданной десятичной позиции. Если <decimal_place> является отрицательным числом, то <number> округляется с левой стороны от десятичной точки. Во втором примере числа слева от десятичного места усекаются до двух цифр, что приводит к получению значения 111.99. Во втором примере усекаются числа слева от десятичного разделителя, что приводит к получению значения 100.00.
|
Строковые функции
Функция | Описание |
---|---|
CAST(<string> AS DATE | TIME) | Преобразует строку в дату или время, если строковое значение имеет поддерживаемый формат. Если строка имеет формат 'MM/DD/YYYY hh:mm:ss' или 'YYYY-MM-DD', вы можете преобразовать ее в дату. Если строка имеет формат 'HH:MM:SS', вы можете преобразовать ее в дату формата только время (TIME). Например, следующая строка может быть приведена к дате: CAST('1988-05-30' AS DATE) |
CHAR_LENGTH(<string>) | Возвращает число символов указанного строкового выражения. Результат является целым числом. Например, следующее выражение возвратит 8: CHAR_LENGTH('Redlands') |
CONCAT(<string1>, <string2>) | Соединяет два строковых значения. Могут быть предоставлены только две строки. Чтобы объединить более двух строк, вложите последовательные функции CONCAT, как показано ниже. Первый пример ниже объединяет буквы A и B. Во втором примере показана вложенная функция CONCAT для объединения трех строковых значений: A, : и B.
Значения Null конвертируются в пустую строку. |
CURRENT_USER | Если функция CURRENT_USER включена в запрос, она действует аналогично переменной, а имя пользователя, получившего доступ к размещенному векторному слою или представлению размещенного векторного слоя, определено и используется в запросе. Например, если пользователь planner3 выполнил вход в организацию для доступа к представлению размещенного векторного слоя, который содержит следующее определение запроса, то только объекты, в поле staffmember которых содержится значение planner3, будут возвращены подключенному пользователю: staffmember=current_user В следующем примере несколько значений хранятся в поле staffmember. Следующее выражение where найдет текущее имя пользователя в текстовом значении в поле staffmember, даже если в поле хранятся несколько имен пользователей: where=position(current_user in staffmember)>0 |
POSITION(<substring>, <string>) | Возвращает позицию первого появления подстроки в указанной строке. Если подстрока не найдена, то результат - 0. В первом примере ниже результат - 5, потому что первая буква (b) подстроки (boat) является пятой буквой в строке (Sailboat). Во втором примере результат - 0, потому что подстрока (motor) отсутствует в строке.
|
SUBSTRING(<string>, <start>, <length>) | Возвращает часть значения строки; <start> является целочисленным индексом, который определяет, где начинаются возвращаемые символы, а <length> представляет число символов, которые должны быть возвращены. См. примеры ниже:
|
TRIM(BOTH | LEADING | TRAILING ' ' FROM <string>) | Возвращает строку, в которой все начальные и конечные пробелы удалены. В следующем примере до и после строки есть пробел, San Bernardino. Ключевое слово BOTH используется для удаления пробелов (с использованием двух одинарных кавычек с пробелом между ними) в начала и в конце текстовой строки: TRIM(BOTH ' ' FROM ' San Bernardino ') Будет возвращена строка 'San Bernardino'. |
UPPER(<string>) | Возвращает строку, в которой все символы преобразованы в символы верхнего регистра. В этом примере все буквы строки Sailboat преобразуются в верхний регистр, что приводит к получению строки 'SAILBOAT': UPPER('Sailboat') |
LOWER(<string>) | Возвращает строку, в которой все символы преобразованы в символы нижнего регистра. В следующем примере будет возвращено 'sailboat': LOWER('Sailboat') |