Вычисление полей позволяет владельцу размещенного векторного слоя или администратору организации менять значения каждой строки определенного поля в таблице атрибутов слоя.
Например, если у вас есть размещенный векторный слой с информацией о продаже объектов недвижимости - включая цену продажи и налоговую ставку - вы можете добавить поле для хранения предполагаемой суммы налога. Чтобы заполнить поле estimated_property_taxes, задайте вычисление выражения поля, которое считывает значения поля sale_price и умножает их на значения tax_rate.
Есть два способа написания выражений в калькуляторе полей слоев размещенного векторного слоя:
- ArcGIS Arcade - Arcade подходит для вычислений, требующих большего функционала, чем предоставляет SQL, поскольку Arcade обеспечивает доступ к атрибутивным значениям и геометрии объектов, что позволяет вам создавать выражения, содержащие пространственные операции. Кроме того, если при вычислении конкретной строки возникает ошибка, можно остановить процесс, понять проблему и после ее решения начать вычисление заново.
Примечание:
Вы должны включить редактирование слоя, чтобы использовать Arcade для вычислений, но для этого слоя нельзя включить синхронизацию. См. Управление размещенными векторными слоями для получения информации об изменении настроек редактирования и синхронизации.
- SQL – используйте SQL для достижения высокой производительности при вычислениях непространственных атрибутов, которые можно выразить с помощью стандартизованного языка SQL (SQL-92). Можно запустить SQL-запросы для размещенных векторных слоев со включенной синхронизацией и слоев, настроенных на отслеживание создателей и редакторов объектов. Для таких слоев выражения Arcade использоваться не могут.
В следующем разделе объясняется, как рассчитываются значения полей со страницы элемента размещенного векторного слоя. Последующие разделы содержат примеры наиболее частых вычислений.
Вычисление значения поля
Выполните эти шаги, чтобы вычислить значения типа string, date или числовые значения.
Примечание:
Вычисления полей отменить нельзя. Поэтому, лучше всего добавить поле, вычислить значения в нем, и убедиться, что это те вычисления, которые вам требуются. Если это так, можно вычислить исходное поле так, чтобы оно стало равным добавленному полю. Когда вы убедитесь, что значения в исходном поле верны, добавленное поле можно удалить.- На странице элемента слоя, щелкните вкладку Данные, чтобы открыть таблицу.
Подсказка:
Эти шаги можно выполнить также из таблицы в Map Viewer Classic.
- Щелкните столбец, содержащий поле, значение которого вы хотите вычислить.
- Чтобы открыть диалоговое окно Вычислить поле, выполните какое-то из следующих действий:
- Нажмите кнопку Вычислить.
- Щелкните Показать подробный вид > Вычислить.
- Выберите язык для выражения: Arcade или SQL.
Если для размещенного векторного слоя включена синхронизация либо он настроен на отслеживание создателей и редакторов объектов, эту страницу вы не увидите. Вместо нее откроется диалоговое окно для создания выражения SQL.
- Составление выражения вычисления.
- Для выражения SQL пользуйтесь основными операторами, списком полей и функциями. Нажмите на кнопку Проверить, чтобы убедиться в отсутствии ошибок в выражении. Если выражение некорректно, щелкните кнопку Удалить и создайте новое. После создания корректного выражения щелкните Вычислить.
- Для Arcade используйте глобальные переменные, функции и константы. Щелкните OK, чтобы запустить выражение. При возникновении ошибки можно щелкнуть Просмотреть ошибку, чтобы открыть окно выражения для исправления ошибки. Либо нажмите Отмена. Если вы откорректируете выражение и снова его запустите, вычисление начнется заново.
Время вычисления зависит от сложности выражения и числа объектов в слое.
Примеры выражений
В следующих разделах приведен пример синтаксиса и методов выполнения вычислений в ArcGIS Enterprise.
Выполните математическую операцию над числовыми значениями в двух существующих полях, чтобы заполнить третье поле.
Одним из наиболее распространенных вычислений, которые вы выполняете, является вычисление нового числового значения на основе существующих значений вашего векторного слоя. Например, вы можете вычесть значение продаж за один год для всех ваших магазинов из сумм продаж за другой год, чтобы найти изменение прибыли от одного года к следующему, или вы можете разделить общее количество жителей в возрасте до 18 лет на общую численность населения, чтобы определить долю, которое составляют люди в возрасте до 18 лет.
Примеры Arcade
Вычислите разность значений двух числовых полей: Sales2016 и Sales2017 и заполните этими значениями числовое поле.
$feature.Sales2016 - $feature.Sales2017
Примеры SQL
Вычислите числовое поле (SalesDifference), чтобы найти разность значений полей Sales2016 и Sales2017.
Sales2016 - Sales2017
Заполните числовое поле десятичным числом, которое является результатом вычисления доли людей младше 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")
Используйте фильтр в Map Viewer Classic
Если вы не хотите использовать выражение Arcade, вы можете применить фильтр к слою в , вычислить значения для отфильтрованных объектов, удалить этот фильтр, применить другой фильтр на основе другого значения и рассчитать значения для этих полей. Этот процесс описывается в следующих шагах.
Например, если у вас есть числовое поле, в котором хранятся типы магазинов с использованием кодов (3, 2 и 1), и требуется строковое поле, в котором указано, что означает каждый из этих кодов (сетевой, франчайзинговый или независимый магазин), вы можете добавить строковое поле в слой, добавить слой на карту, применить фильтр для каждого значения кода и вычислить значение для строкового поля.
- Добавьте строковое поле в размещенный векторный слой. Задайте длину, которая позволит хранить самую длинную строку, которую вы будете хранить.
В случае с магазинами имя нового поля - TypeFull.
- На вкладке Обзор страницы элемента слоя щелкните Открыть в Map Viewer Classic.
- Задайте фильтр для слоя, чтобы только объекты одного типа были показаны на карте.
В случае с магазинами примените фильтр, возвращающий только объекты, у которых значение StoreCode равно 3.
- Откройте таблицу атрибутов для этого слоя.
- Щелкните имя поля, добавленного вами на шаге 1, и щелкните Вычислить.
Для данного примера щелкните TypeFull и нажмите Вычислить.
- Введите строку, которую надо вставить в это поле для этих объектов. Заключите строку в одинарные кавычки.
Введите 'chain' для заполнения поля TypeFull для всех объектов со значением StoreCode 3.
- Нажмите кнопку Вычислить.
- Удалите фильтр, заданный на шаге 3. Откройте еще раз окно Фильтр для слоя и щелкните Удалить фильтр.
- Повторите шаги с 3-го по 8-й для остальных значений, которые вам надо вычислить.
Для примера с магазинами задайте фильтр для StoreCode, равного 2, и вычислите поле TypeFull, чтобы в нем сохранилось значение 'franchise'. Удалите этот фильтр и задайте для нового StoreCode равным 1, а затем вычислите поле TypeFull, чтобы в нем сохранилось значение 'independent'.
- Закончив вычисления значений в новом поле, закройте карту, не сохраняя ее.
Замена одного значения на другое
Если вам нужно заменить существующее значение другим - например, когда изменился способ представления определенного значения или если вам нужно исправить неверно введенные значения - вы можете найти все существующие значения поля и заменить их новым значением. Поскольку интерфейс вычислений SQL не поддерживает это, используйте Arcade для этих типов вычислений.
Внимание:
Вычисления будут автоматически сохранены в векторном слое. Если вы по ошибке перезаписали имеющееся значение, вам потребуется снова выполнить вычисление, чтобы вернуть назад правильное значение.
Пример Arcade
В данном случае используется функция Replace для изменения британского написания (colour) на американское.Replace($feature.color, 'colour', 'color')
Используйте фильтр в Map Viewer Classic
Подобно тому, как вы заполняете одно поле на основе значений другого, вы можете применить фильтр к слою карты, который возвращает только объекты, содержащие значение поля, которое вы хотите заменить. Затем установите для отфильтрованных полей новое значение, чтобы обновить значение полей.
К примеру, если вам нужно исправить опечатки или заменить слово на его сокращение, отфильтруйте строку, которую нужно изменить, и установите в поле новое значение.
- Добавьте размещенный векторный слой, который необходимо обновить, в Map Viewer Classic.
Вы должны быть владельцем слоя или администратором портала.
- Задайте фильтр для слоя, чтобы только объекты, содержащие заменяемое значение, были показаны на карте.
Например, если вам известено число объектов со значением Crt для поля StreetType примените фильтр, возвращающий только объекты, у которых значение поля StreetType равно Crt.
- Откройте таблицу атрибутов для этого слоя.
- Щелкните имя поля и нажмите Вычислить.
Для данного примера щелкните поле StreetType и щелкните Вычислить.
- Введите строку, которую надо вставить в это поле для этих объектов. Заключите строку в одинарные кавычки.
Введите 'Ct' для заполнения отфильтрованных полей StreetType корректным сокращением для слова Court.
- Щелкните Вычислить, чтобы сохранить изменения для отфильтрованных полей.
- Закройте карту без сохранения.
Определение плотности на единицу площади для числового атрибута
Чтобы вычислить плотность на единицу площади какого-либо атрибутивного показателя, воспользуйтесь выражением 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
Для добавления или вычитания времени из поля дат используйте запрос INTERVAL, как показано в следующих вычислениях. В первом примере для получения новой даты к дате добавлено три дня. Во втором примере из поля метки времени вычитается три дня.<DateField> + INTERVAL '3'DAY = updated date
<DateField> - INTERVAL '3 00:00:60' DAY TO SECOND = updated date
INTERVAL можно использовать со следующими значениями дат и времени:
- DAY
- HOUR
- MINUTE
- SECOND
- DAY TO HOUR
- DAY TO MINUTE
- DAY TO SECOND
- HOUR TO MINUTE
- HOUR TO SECOND
- MINUTE TO SECOND
Вычисление разницы между двумя датами
Может понадобиться вычислить временной диапазон между двумя датами. Например, у вас есть даты установки механизмов и даты проверок, на их основе можно вычислить разницу между двумя датами, чтобы убедиться, что диапазоны времени между проверками укладываются в допустимые нормативы. Результатом вычисления будет числовое поле, а не поле типа дата.
Пример 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 для вычисления значений для следующих типов данных полей на странице элемента векторного слоя:
- Большое целое
- Только дата
- Только время
Примечание:
Когда любой слой в размещенном векторном слое содержит эти типы данных, вычисления Arcade отключаются для всего размещенного векторного слоя, даже для тех подслоев, которые не содержат неподдерживаемых типов данных.
Справка по стандартизированному SQL (SQL-92)
При написании выражения SQL для вычисления значений поля необходимо использовать стандартизированный SQL. В этом разделе содержится список функций и операторов SQL, которые можно использовать в выражениях SQL в ArcGIS Enterprise.
После создания вашего 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. Способ отображения зависит от используемого клиента. На веб-сайте портала даты отображаются в часовом поясе вашего браузера. Следующий пример возвращает все значения поля inspection_date , которые имеют дату до сегодняшней: inspection_date > CURRENT_DATE |
CURRENT_TIMESTAMP | Возвращает текущие дату и время в формате UTC (часы, минуты, секунды). Способ отображения зависит от используемого клиента. На веб-сайте портала время отображается в часовом поясе вашего браузера. В этом примере для поля appointments возвращаются все значения отметки времени до сегодняшней даты и текущего времени (в формате UTC): appointments < CURRENT_TIMESTAMP |
EXTRACT(<unit> FROM '<date>') | Возвращает одну часть (<unit>) указанного <date>. Возможные значения <unit> включают год, месяц, день, час и минуту, но не ограничиваются ими. Примеры:
|
Числовые функции
Функция | Описание |
---|---|
ABS(<number>) | Возвращает абсолютное (положительное) значение заданного числа. |
CEILING(<number>) | Возвращает наименьшее целочисленное значение, большее или равное указанному числу. Пример
|
COS(<number>) | Возвращает тригонометрический косинус <number>, который должно представлять значение угла в радианах. |
CAST(<number> AS FLOAT | INT) | Конвертирует число в другой тип. FLOAT конвертирует указанное число в значение с двойной точностью, а INT конвертирует в целое число. |
FLOOR(<number>) | Возвращает наибольшее целое значение, меньшее или равное указанному числу. Пример
|
LN(<number>,<decimal_place>) | Возвращает натуральный логарифм указанного числа. |
LOG(<number>,<decimal_place>) | Десятичный логарифм указанного числа. |
MOD(<number>, <n>) | Возвращает остаток после деления делимого (<number>) на делитель <n>. <n> и <number> должны быть целочисленными. Примеры:
|
NULLIF(<number>, <value>) | Возвращает null, если указанное число равно заданному значению. NULLIF обычно используется, чтобы избежать ошибок деления на ноль в случае, когда для <value> задано 0. Каждый раз, когда в вычислении встречается значение поля null в любом из его аргументов, результатом вычисления будет null. Предположим, вам нужно вычислить поле double, которое TOTALPOP делится на POP18. Если любой объект имеет значение POP18, равное нулю, такое вычисление приведет к ошибке деления на ноль. Вы можете создать фильтр, чтобы скрыть записи, где значение равноPOP18 нулю, а затем выполнить необходимые вычисления. Более легкий способ - использовать NULLIF.
|
POWER(<number> , <y>) | Возвращает значение указанного числа, возведенное в указанную степень (<y>). |
ROUND(<number> , <length>) | Округляет число до заданной длины. Если для <length> задано положительное число, то число округляется до десятичной позиции, определяемой параметром <length>. Если <length> является отрицательным числом, то указанное <number> округляется с левой стороны от десятичной точки. Примеры
|
SIN(<number>) | Возвращает тригонометрический синус <number>, который должен представлять значение угла в радианах. |
TAN(<number>) | Возвращает тангенс <number>, который должен представлять значение угла в радианах. |
TRUNC(<number>,<decimal_place>) | Сокращает <number> до указанной <decimal_place>. Положительное значение <decimal_place> сокращает до заданной десятичной позиции. Если <decimal_place> является отрицательным числом, то <number> округляется с левой стороны от десятичной точки. Примеры
|
Строковые функции
Функция | Описание |
---|---|
CHAR_LENGTH(<string>) | Возвращает число символов указанного строкового выражения. Результат является целым числом. Пример
|
CONCAT(<string1>, <string2>) | Соединяет два строковых значения. Могут быть предоставлены только две строки. Чтобы объединить более двух строк, вложите последовательные функции CONCAT, как показано ниже. Примеры
Значения Null конвертируются в пустую строку. |
POSITION(<substring> in <string>) | Возвращает позицию первого появления подстроки в указанной строке. Если подстрока не найдена, то результат - 0. Примеры
|
SUBSTRING(<string>, <start>, <length>) | Возвращает часть значения строки; <start> является целочисленным индексом, который определяет, где начинаются возвращаемые символы, а <length> представляет число символов, которые должны быть возвращены. Примеры
|
TRIM(BOTH | LEADING | TRAILING ' ' FROM <string>) | Возвращает строку, в которой все начальные и конечные пробелы удалены. Пример
Обратите внимание, что второй аргумент отделяют два символа одинарных кавычек с пробелом между ними. |
UPPER(<string>) | Возвращает строку, в которой все символы преобразованы в символы верхнего регистра. Пример
|
LOWER(<string>) | Возвращает строку, в которой все символы преобразованы в символы нижнего регистра. Пример
|