Skip To Content

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

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

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

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

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

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

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

    Можно также выполнить следующие действия в таблице в Map Viewer.

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

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

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

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

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

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

Примеры SQL

Вычислите числовое поле (SalesDifference), чтобы найти разность значений полей Sales2016 и Sales2017.

Sales2016 - Sales2017

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

PopUnder18/TotalPop

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

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

Пример SQL

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

CONCAT(Floor,Room)

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

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

Пример SQL

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

Trim(TRAILING ' ' FROM 'New Hampshire ')

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

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

Пример SQL

Подобные вычисления обычно основаны на выражениях WHERE, которые в настоящее время не поддерживаются в интерфейсе вычислений на порталах ArcGIS Enterprise. Однако вы можете применить фильтр к слою в Map Viewer, вычислить значения для отфильтрованных объектов, удалить этот фильтр, применить другой фильтр на основе другого значения и рассчитать значения для этих полей.

Например, если у вас есть числовое поле, в котором хранятся типы магазинов с использованием кодов (3, 2 и 1), и требуется строковое поле, в котором указано, что означает каждый из этих кодов (сетевой, франчайзинговый или независимый магазин), вы можете добавить строковое поле в слой, добавить слой в Map Viewer, применить фильтр для каждого значения кода и вычислить значение для строкового поля.

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

    В случае с магазинами имя нового поля - TypeFull.

  2. На вкладке Обзор страницы информации о слое щелкните Открыть во вьюере карт.
  3. Задайте фильтр для слоя, чтобы только объекты одного типа были показаны на карте.

    В случае с магазинами примените фильтр, возвращающий только объекты, у которых значение StoreCode равно 3.

  4. Откройте таблицу атрибутов для этого слоя.
  5. Щелкните имя поля, добавленного вами на шаге 1, и щелкните Вычислить.

    Для данного примера щелкните TypeFull и нажмите Вычислить.

  6. Введите строку, которую надо вставить в это поле для этих объектов. Заключите строку в одинарные кавычки ('').

    Введите строку 'chain' для заполнения поля TypeFull для всех объектов с кодом StoreCode, равным 3.

  7. Нажмите кнопку Вычислить.
  8. Удалите фильтр, заданный на шаге 3. (Откройте еще раз окно Фильтр для слоя и щелкните Удалить фильтр).
  9. Повторите шаги с 3-го по 8-й для остальных значений, которые вам надо вычислить.

    Для примера с магазинами задайте фильтр для StoreCode, равного 2, и вычислите поле TypeFull, чтобы в нем сохранилось значение 'franchise'. Удалите этот фильтр и задайте для нового StoreCode равным 1, а затем вычислите поле TypeFull, чтобы в нем сохранилось значение 'independent'.

  10. Закончив вычисления значений в новом поле, закройте Map Viewer, не сохраняя карту.

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

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

Внимание:

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

Пример SQL

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

К примеру, если вам нужно исправить опечатки или заменить слово на его сокращение, отфильтруйте строку, которую нужно изменить, и установите в поле новое значение.

  1. Добавьте размещенный векторный слой, который необходимо обновить, в Map Viewer.

    Вы должны быть владельцем слоя или администратором портала.

  2. Задайте фильтр для слоя, чтобы только объекты, содержащие заменяемое значение, были показаны на карте.

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

  3. Откройте таблицу атрибутов для этого слоя.
  4. Щелкните имя поля и нажмите Вычислить.

    Для данного примера щелкните StreetType и нажмите Вычислить.

  5. Введите строку, которую надо вставить в это поле для этих объектов. Заключите строку в одинарные кавычки ('').

    Введите 'Ct' для заполнения отфильтрованных полей StreetType корректным сокращением для слова Court.

  6. Щелкните Вычислить, чтобы сохранить изменения для отфильтрованных полей.
  7. Закройте Map Viewer, не сохраняя карту.

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

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

Примеры 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

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

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

Примеры 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 установлен фильтр, то будут рассчитаны только те записи, которые удовлетворяют условию фильтра.
  • При использовании выражений SQL инструмент Вычислить поле работает только с именами полей, а не с их псевдонимами. Список Поля отображает имена всех доступных для вычислений полей. Вы можете отфильтровать данный список по полям типов Текстовое, Числовое и Дата.
    • Если вы наведете курсор на имя поля в списке Поля, то будут отображены псевдоним поля и тип поля.
    • Если вы щелкните имя поля в списке Поля, данное поле будет добавлено в выражение.
  • Вы не можете вычислять значения полей в копиях размещенных векторных слоев, в размещенных векторных слоях, которые имеют связанные слои листов, в размещенных пространственно-временных векторных слоях или в видах, созданных из размещенных пространственно-временных векторных слоев.
  • При вычислении значений полей поддерживаются только стандартизированные запросы SQL.
  • Использовать числовую функцию MOD с полями типа double нельзя. Преобразуйте поле в целочисленное, как показано в этом примере.

Справка по стандартизированному 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 (часы, минуты, секунды).

Способ отображения зависит от используемого клиента. На веб-сайте портала время отображается в часовом поясе вашего браузера.

В этом примере возвращаются все значения временных отметок до сегодняшнего дня в текущего времени (в UTC) из поля appointments:

appointments < CURRENT_TIMESTAMP

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:44') – возвращает 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.

LN(<number>,<decimal_place>)

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

LOG(<number>,<decimal_place>)

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

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>, которое должно представлять значение угла в радианах.

TRUNC(<number>,<decimal_place>)

Сокращает <number> согласно <decimal_place>.

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

Примеры

  • TRUNC(111.996,2) – возвращает 111,99.
  • TRUNC(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> in <string>)

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

Примеры

  • POSITION('boat'in 'Sailboat') – результат равен 5.
  • POSITION('motor'in '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'.