Доступ к атрибутам другого слоя в ArcGIS Arcade
Настройка
Сначала вы настроите веб-карту в Map Viewer и добавите новое выражение Arcade. Вы начнете с существующей веб-карты, которая уже содержит некоторые слои данных и выражения Arcade. Вы скопируете эту карту в свою учетную запись ArcGIS Online, чтобы вы могли начать ее редактирование и добавлять на нее новые элементы.
- Откройте в веб-браузере веб-карту Global Power Generation and Consumption (мировое производство и потребление электроэнергии).
Эта карта откроется в Map Viewer с открытой панелью Легенда.
На панели Легенда содержатся два слоя:
- Global Power Plants содержит полный перечень электростанций по всему миру.
- World Countries Electricity Consumption содержит данные о численности населения и потреблении электроэнергии по всем странам мира.
Примечание:
Если вы уже прошли учебное руководство Начало работы с ArcGIS Arcade, вы можете использовать получившуюся в нем карту.
- Щелкните кнопку Войти.
- Войдите под учётной записью организации ArcGIS.
Примечание:
Если у вас нет учетной записи организации, см. варианты доступа к программному обеспечению.
- На панели инструментов Содержание (темная) щелкните Сохранить и открыть и выберите Сохранить как.
- В окне Сохранить карту в конце Заголовка добавьте свои инициалы, чтобы он был уникален для вашей организации, и щелкните Сохранить.
Появится копия карты, готовая к редактированию. Затем вы добавите на карту новое выражение Arcade для использования во всплывающих окнах слоя Global Power Plants.
Примечание:
ArcGIS Arcade - это портативный, легкий и защищенный язык выражений, написанный для динамической работы с вашими данными в ArcGIS. Как и другие языки программирования, он может выполнять математические операции, обращаться с текстом и оценивать логические утверждения. Он позволяет пользователям оперировать существующими данными и реализовывать новые идеи посредством разработки, совместного использования и выполнения настраиваемых выражений в ArcGIS Pro, ArcGIS Runtime, ArcGIS Online, ArcGIS Enterprise и ArcGIS API for JavaScript. В Map Viewer Arcade полезен при настройке всплывающих окон и надписей, и при оформлении слоя. Больше руководств по Arcade вы найдете по ссылке на обучение Arcade.
- На панели инструментов Ресурсы щелкните Слои.
Примечание:
По умолчанию на боковых панелях инструментов может отображаться только значок инструмента, а не его название. Можно щелкнуть кнопку развернуть в нижней части каждой панели инструментов, чтобы просмотреть названия. На изображениях в руководстве показаны развернутые панели инструментов.
Откроется панель Слои.
- На панели Слои убедитесь, что выбран слой Global Power Plants.
- На панели инструментов Настройки (светлая) щелкните Всплывающие окна.
Появится панель Всплывающие окна вместе с предварительным просмотром всплывающего окна.
Это всплывающее окно для электростанции SMN Barka в Саудовской Аравии. В нем уже содержится важная информация об этой электростанции. Выражение Arcade, которое вы создадите в этом упражнении, добавит во всплывающее окно еще один абзац текста.
- Закройте всплывающее окно.
Примечание:
Либо вы можете открыть всплывающее окно любой электростанции, имеющейся на карте. На карте используйте колесико мыши для увеличения интересующей области, например, испанской Севильи. Затем щелкните одну из точек электростанций.
- На панели Всплывающие окна нажмите Атрибутивные выражения.
Примечание:
Уже имеются два выражения для всплывающего окна в слое Global Power Plants. Вы использовали эти выражения, чтобы определить цвет текста для типа энергии и вычислить количество 60-ваттных лампочек, которые электростанция может питать и отобразили во всплывающем окне электростанций. Arcade позволяет повторно использовать все существующие выражения или их части в новых выражениях. Это часть знаний, полученных вами в этом руководстве.
Откроется панель Атрибутивные выражения.
- На панели Атрибутивные выражения щелкните Добавить выражение, чтобы открыть редактор выражений Arcade.
Появится редактор выражения Arcade. Здесь вы создадите выражения Arcade и отредактируете их. Сначала вы изучите их компоненты.
- В окне Выражение вы напишите код.
- Вкладка Переменные профиля содержит список предопределенных переменных, включая поля атрибутов и геометрию объектов слоя.
- На вкладках Функции перечислены все функции Arcade. Вы можете кликнуть на значок информации справа от каждой функции для доступа к встроенной справке функции по параметрам, синтаксису и использованию.
- Вкладка Предложения дает вам доступ к атрибутам и геометрии пространственных объектов слоя через список предопределенных переменных. Она также предоставляет доступ к объектам других слоев веб-карты, который вы будете выполнять позже в этом руководстве.
- Вкладка Справка открывает веб-страницу справки Arcade.
В редакторе выражений Arcade также можно протестировать созданное вами выражение, используя кнопку Запустить.
- Щелкните Запустить.
Откроются вкладки Выходных данные, Консоль и Журнал. Как только вы создали выражение, можно нажать кнопку Запустить, чтобы протестировать выходное значение выражения. На данный момент вы не написали никакого кода Arcade, поэтому эти вкладки ничего не содержат.
- На вкладке Выходных данные отобразятся выходные данные выражения.
- Вы также можете добавить функции Console() в свой код и просмотреть их значения на вкладке Консоль.
Инициализация переменных
Затем вы начнете написание кода вашего выражения Arcade. Вы будете выполнять три действия:
- Сначала вы инициализируете (создадите) ряд переменных, хранящих значения, которые вам понадобятся в приложении Arcade позднее.
- Затем вы создадите FeatureSet из слоя World Countries Electricity Consumption для использования атрибутов этого слоя в вашем выражении.
- После чего вы воспользуетесь всеми этими данными для получения новой информации, вычислив, сколько граждан каждая электростанция может обеспечить электричеством.
В этом разделе вы сконцентрируетесь на инициализации и проверке переменных.
- В строке Выражение введите (или скопируйте и вставьте) var countryName =.
Вы создадите первую переменную, countryName, содержащую имя страны, в которой расположена электростанция. В Arcade вы будете использовать синтаксис Var <variableName> = <someValue>, чтобы задать переменные для последующего использования в выражении.Вы укажете значение переменной, выбрав соответствующий атрибут в слое Global Power Plants.
- При необходимости щелкните вкладку Переменные профиля. Разверните элемент $feature, щелкнув стрелку.
Появится список атрибутов для слоя электростанций Global Power Plants.
Примечание:
Как уже упоминалось, это выражение Arcade запускается, когда пользователь щелкает по конкретной электростанции на карте и для этого объекта отображается всплывающее информационное окно. Элемент $feature предоставляет вам доступ к данным для этого конкретного объекта слоя Global Power Plants. Это будут все его атрибуты и геометрия.
Это не то же самое, что и переменная $layer, которая обращается ко всем объектам слоя, а не к одному объекту. Например, вы можете использовать $layer для получения среднего значения атрибута для всех объектов векторного слоя.
- В списке атрибутов прокрутите вниз и щелкните $feature.country_long.
Первая строка вашего кода готова.
Для выражения также потребуются переменные, содержащие название электростанции и ее расчетное годовое производство электроэнергии. Вместо того чтобы создавать эти две переменные с нуля, вы скопируете существующий код из одного из ранее существовавших выражений Arcade.
- Нажмите Enter для перехода на следующую строку выражения.
- Выделите следующие две строки кода и нажмите Ctrl+C, чтобы их скопировать.
var plantName = $feature.name
var annualGenerationGwh = $feature["estimated_generation_gwh"]
Примечание:
Вы также можете скопировать строки, щелкнув правой кнопкой выделенный текст и выбрав Копировать.
- В окне Выражение нажмите Ctrl+V, чтобы вставить код. Щелкните по строке 3 и нажмите клавишу Backspace.
Примечание:
Вы также можете вставить строки, щелкнув правой кнопкой точку вставки и выбрав Вставить.
Теперь вы проверите эти выражения переменных, чтобы убедиться в их корректной работе. Вы сделаете это, добавив выражение возврата в конце вашего кода, начиная с первой переменной.
- Щелкните конец строки 3 и нажмите Enter, чтобы начать следующую строку кода, и введите return countryName. Щелкните Запустить.
В окне Выход появятся итоговые выходные данные скрипта. Это значения выражения return Afghanistan.
Это связано с тем, что для тестирования редактор выражений использует первый объект в таблице атрибутов. В данном случае первым объектом оказалась электростанция, расположенная в Афганистане. Теперь вы проверите значение второй переменной.
- В окне Выражение измените последнюю строку вашего скрипта на return plantName. Щелкните Запустить.
В окне Выход отображается значение Kajaki Hydroelectric Power Plant Afghanistan, которое является названием той же самой афганской электростанции, используемой нами по умолчанию.
Теперь вы проверите значение третьей переменной.
- В окне Заявление измените снова строку на return annualGenerationGwh и щелкните Запустить.
В окне Выход значение отсутствует, а результат равен Null.
Это связано с тем, что у электростанции по умолчанию, Kajaki Hydroelectric Power Plant Afghanistan, отсутствуют данные о годовом производстве электроэнергии. В таком случае вы можете вручную указать другое значение для целей тестирования.
- Над строкой return nnualGenerationGwh добавьте функцию annualGenerationGwh = 10 и щелкните кнопку Выполнить.
В окне Выход возвращается значение 10 (гигаватт-часы или ГВтч). Вы будете использовать это тестовое значение в следующих частях этого учебного руководства.
- В окне Выражение удалите строку return annualGenerationGwh, поскольку вам она больше не нужна.
Перед дальнейшей разработкой вашего выражения вы назовете и сохраните его. Важно присваивать имя всем создаваемым вами выражениям, чтобы их было легче находить и использовать на вашей карте.
- В верхней части окна редактора щелкните и выделите Новое выражение и удалите текст. Введите Число жителей, которое может обеспечить электростанция ежегодно.
- Внизу окна редактора нажмите Готово, чтобы закрыть редактор выражений.
Выражение появится на панели Атрибутивные выражения.
- На панели инструментов Ресурсы щелкните Сохранить и открыть и выберите Сохранить, чтобы сохранить карту и выражение Arcade.
Примечание:
Рекомендуется регулярно сохранять выражение Arcade и карту.
Получение данных другого слоя
Чтобы найти число граждан, которое электростанция может обеспечивать электроэнергией, во всплывающем окне Global Power Plants, вам необходимо разделить расчетное годовое производство электроэнергии электростанцией на значение потребления электроэнергии на душу населения в стране, в которой находится электростанция.
В предыдущем разделе вы уже получили первое значение, которое хранится в переменной annualGenerationGw. Второе число может быть получено, исходя из значений атрибутов «население» и «общее потребление электроэнергии» в слое потребления электроэнергии в странах мира - World Countries Electricity Consumption. Это значит, что вам понадобится доступ к атрибутам World Countries Electricity Consumption во всплывающем окне Global Power Plants. Вы это сделаете, создав FeatureSet.
FeatureSet позволяет вам получить доступ к объектам любого слоя карты или внешнего по отношению к карте сервиса объектов. Затем можно отфильтровать нужные объекты, задав критерий релевантности. В вашем случае вы получите доступ к объектам World Countries Electricity Consumption (то есть к списку всех стран мира с их атрибутами) и будете искать страну, в которой расположена текущая электростанция. Например, для электростанции Kajaki Hydroelectric Power Plant вы отфильтруете список до одного объекта - Afghanistan. Таким образом, объект Global Power Plants будет связан с соответствующим объектом World Countries Electricity Consumption из-за совпадающих значений атрибута названия страны. Подробнее о FeatureSet см. в Документации Arcade.
Примечание:
Из-за времени обработки запросов, возвращающих большой объем данных, FeatureSets может не работать нормально с большими наборами данных.
Теперь вы создадите FeatureSet с помощью FeatureSetByName.
Примечание:
FeatureSetByName - один из вариантов создания FeatureSet.
- На панели Атрибутивные выражения щелкните Число жителей, которое может обеспечить электростанция ежегодно, чтобы снова открыть выражение в редакторе выражений Arcade.
- В окне Выражение введите var countriesGenFset = в следующей пустой строке.
- Щелкните вкладку Переменные профиля. Разверните элемент $map, щелкнув стрелку.
Появится список всех слоев, которые содержатся на карте.
- В Слои щелкните стрелку для World Countries Electricity Consumption.
- Под World Countries Electricity Consumption щелкните FeatureSetByName($map, "World Countries Electricity Consumption").
Функция FeatureSetbyName добавится в окно Выражение. В окне Выражение оператор выглядит так:
var countriesGenFset = FeatureSetByName($map, "World Countries Electricity Consumption")
FeatureSetByName() использует значение $map для своего первого параметра, означающее, что нужно искать этот слой на текущей карте. Второй параметр - это само имя слоя. Его значение должно совпадать с именем слоя на панели Слои.
Теперь вы добавите ряд дополнительных аргументов функции FeatureSetByName(), чтобы определение FeatureSet было более точным.
Примечание:
Вы можете определить, какие именно атрибуты вам нужны, чтобы предотвратить загрузку всей таблицы атрибутов. В этом руководстве, например, вам нужны: название страны, общее годовое потребление электроэнергии и численность населения. Запрашивание только тех полей, которые вам нужны, увеличивает производительность, поскольку требует отправки меньшего объема данных.
Вы также можете запросить включение геометрии в FeatureSet, чтобы получить доступ к полигонам для каждой страны. Для этого предназначено значение типа Boolean (может быть равно true или false). В данном упражнении вам геометрия не нужна, поэтому вы зададите значение Boolean, равное false. Отсутствие запроса геометрии также способствует более высокой производительности, поэтому геометрию следует включать в выражение только тогда, когда она действительно необходима.
Если оставить эти параметры пустыми, в FeatureSet будут включены все атрибуты и геометрия.
После этого вы измените строку FeatureSetByName(), чтобы FeatureSet содержал только три поля, которые вам нужны, и не содержал геометрии.
Примечание:
Поскольку выражение длинное, для лучшей читаемости рекомендуется разделить его на несколько строк. Вам нужно добавить разрывы строк между аргументами (после каждой запятой).
- В строке FeatureSetByName() после "World Countries Electricity Consumption" удалите конечную скобку и поставьте запятую. Скопируйте и вставьте следующий текст:
['COUNTRY', 'Annual_Electricity_Consumption_', 'POP'], false)
Вы добавите выражение return для проверки FeatureSet.
- В окне Выражение введите return countriesGenFset в следующей пустой строке.
- Щелкните Запустить.
В окне Выход возвратится FeatureSet. Это набор, включающий все объекты слоя World Countries Electricity Consumption только с теми атрибутами, которые вы запросили.
Теперь вы воспользуетесь функцией Filter() для фильтрации строк FeatureSet с помощью значения, хранящегося в переменной countryName. У Filter() есть два параметра: фильтруемый слой или FeatureSet и выражение SQL, выполняющее фильтрацию.
- В окне Выражение, над return countriesGenFset, нажмите клавишу Enter , чтобы добавить новую строку, и введите var filteredCountryFSet =.
- Перейдите на вкладку Функции и введите в строке поиска Filter. В результатах поиска щелкните Filter(features, sqlExpression) для добавления этой функции в ваше выражение.
Filter() добавляется в редактор выражений с двумя местами для аргумента, features и sqlExpression.
Примечание:
На вкладке Функции можно получить дополнительную информацию о любой функции, щелкнув кнопку со стрелкой рядом с названием функции.
- Отредактируйте места для аргументов Filter(), чтобы получилось следующее выражение:
var filteredCountryFSet = Filter(countriesGenFset, 'COUNTRY = @countryName')
Значок @ в @countryName означает, что countryName - переменная, ранее определенная в приложении. Это выражение SQL проверяет все строки в FeatureSet и сохраняет только те, в которых у атрибута COUNTRY такое же значение, что и у переменной countryName (например, Afghanistan). Переменная filteredCountryFSet будет содержать только строки FeatureSet, прошедшие проверку.
- Измените выражение return на return filteredCountryFSet и щелкните Запустить.
В окне Выход в окне теперь содержится только строка Afghanistan.
Примечание:
Есть несколько способов фильтрации объектов FeatureSet. Если FeatureSet содержит геометрию пространственных объектов, функции Arcade Intersects () и Contains () могут достичь той же конечной цели - соединить объекты FeatureSet с объектами во всплывающем слое. Это может быть полезным в ситуациях, когда у двух слоев нет общего атрибута, но объекты слоев значимо пространственно пересекаются.
Хотя переменная filteredCountryFset содержит только одну строку, это все еще FeatureSet, и строка соответствует структуре таблицы. Затем вы извлечете данные из таблицы, чтобы с ними было проще работать. В Arcade для этого обычно используется функция First(). Она берет первый объект FeatureSet и возвращает его.
- В окне Выражение добавьте новую строку над выражением return filteredCountryFSet и введите var filteredCountry =.
- На вкладке Функции в строке поиска введите first. В разделе функции FeatureSet щелкните First(features) -> Feature, чтобы добавить ее в выражение.
Функция добавится с местом для ввода аргумента: First(features).
- Вставьте аргумент, чтобы выражение выглядело так:
var filteredCountry = First(filteredCountryFset)
- Измените выражение return на return filteredCountry и щелкните Запустить.
В окне Выход данные теперь появляются как один объект.
Вы воспользуетесь этими данными в следующих выражениях Arcade.
Вычисление выработки электроэнергии
Теперь вы воспользуетесь информацией, извлеченной из FeatureSet, для вычисления числа жителей, которых электростанция может обеспечить электроэнергией. Затем вы отформатируете полученное число.
Сначала вы получите значение годового потребления электроэнергии в стране, в которой находится электростанция. Эти данные содержатся в атрибутивном поле Annual_Electricity_Consumption_ объекта filteredCountry. Для доступа к атрибутам объекта в Arcade воспользуйтесь синтаксисом feature["attribute"] или feature.attribute.
В результатах ранее выполненной проверки вы увидели, что этот атрибут называется Annual_Electricity_Consumption_. Другим способом поиска этой информации является интерактивное изучение полей на панели Глобальные переменные.
- Щелкните вкладку Переменные профиля. При необходимости щелкните кнопку Назад. Разверните элемент $map, щелкнув стрелку.
- В группе Слои щелкните стрелку для World Countries Electricity Consumption.
Появится список атрибутов слоя, в котором есть и атрибут Annual_Electricity_Consumption_.
Теперь, когда вы точно определили название интересующего вас атрибута, вы напишете выражение, которое позволит добавить его в переменную.
- В окне Выражение добавьте новую строку над строкой return filteredCountry и введите следующее:
var electricityConsumption = filteredCountry.Annual_Electricity_Consumption_
- Измените выражение return на return electricityConsumption и щелкните Запустить
В окне Выход, поскольку нашим тестовым государством выбран Афганистан, вы увидите возвращенное значение годового потребления электричества в Афганистане: 5526000000 (киловатт-часов или кВт/ч).
Похожим образом вы изучите данные о населении, хранящиеся в объекте filteredCountry.
Поскольку вы установили годовую выработку annualGenerationGwh = 10, результат равен 0. Вы должны удалить это значение из кода для запуска на основе заданных значений из таблицы атрибутов.
- Удалите строку annualGenerationGwh = 10 и щелкните Запустить.
- В окне Выражение добавьте новую строку над выражением return и введите var population = filteredCountry.POP;.
- Измените выражение return на return population и щелкните Запустить.
В окне Выход вы можете увидеть численность населения Афганистана: 37466414.
Затем вы рассчитаете потребление на душу населения, которое представляет собой результат деления расчетного годового потребления на численность населения.
- В окне Выражение добавьте новую строку над выражением return и введите следующее:
var consumptionPerCapita = electricityConsumption / population
- Измените выражение return на return consumptionPerCapita и щелкните Запустить.
В окне Выход вы увидите, что потребление на душу населения равно 147.4920978559624 (кВт/ч).
Чтобы получить расчетное количество жителей, которых электростанция сможет ежегодно обеспечивать электроэнергией, вы разделите расчетный показатель годового производства электроэнергии электростанцией (преобразованный из ГВт/ч в кВт/ч умножением на 1000000) на значение потребления электроэнергии на душу населения для страны, которое вы только что вычислили (в кВт/ч).
Соответствующая формула будет выглядеть так: annualGenerationGwh * 1000000) / consumptionPerCapita.
Затем вы воспользуетесь функцией Round(), чтобы получить целое число вместо десятичного, потому что количество людей должно быть целым числом.
- В окне Выражение добавьте новую строку над выражением return и введите var numCitizensAnnually =.
- На вкладке Функции найдите функцию Round и щелкните ее для вставки в выражение.
Функция добавляется с местом для ввода аргумента: Round(value, ). Вместо value вы вставите формулу, представленную выше.
- Для функции Round, в скобках, замените значение на (annualGenerationGwh * 1000000) / consumptionPerCapita.
Второй аргумент Round(), numPlaces, определяет количество десятичных знаков, до которого необходимо округлить это число.
- После выражения введите запятую, пробел и 0.
- Измените выражение return на return numCitizensAnnually и щелкните Запустить.
Примечание:
Если результат для вас равен 0, добавьте обратно annualGenerationGwh = 10 над строкой var NumCitizensAnnually = Round.
В окне Выход вы увидите результат вычисления по этой формуле: 67800 (жителей).
Вы отформатируете округленное значение, чтобы добавить разделители между тысячными разрядами с помощью функции Text().
- В окне Выражение добавьте новую строку над выражением return, введите var displayNumCitizensAnnually = и добавьте пробел.
- На вкладке Функции найдите функцию Text и щелкните ее для вставки в выражение.
Функция добавляется с местом для ввода аргумента: value.
- Замените value на numCitizensAnnually и после этого введите , '###,###,###', чтобы учесть значения длиной до 9 цифр.
- Измените выражение return на return displayNumCitizensAnnually и щелкните Запустить.
В окне Результаты 67800 отобразится как 67,800, в соответствии с заданным вами форматированием.
Электростанция Kajaki Hydroelectric Power Plant Afghanistan сможет обеспечить электричеством примерно 67,800 жителей Афганистана ежегодно.
Теперь, когда вы вычислили приблизительное количество жителей, которых ежегодно электростанция может обеспечивать электроэнергией, вы выведете это значение в предложении, отображающемся во всплывающем окне. Для этого вы будете использовать шаблонный литерал и выполните дополнительное форматирование текста. Шаблонный литерал заключается в наклонные кавычки (`) и применяет синтаксис ${variableName} для вставки переменных и выражений в строку. Это означает, что выводимое предложение будет варьироваться в зависимости от значения переменных для каждой электростанции карты.
- В окне Выражение добавьте новую строку над выражением return, и скопируйте и вставьте следующую строку:
var dataTL = `On average, a citizen in ${ countryName } consumes ${ text(round(consumptionPerCapita, 0), '###,###,###,###') } kilowatt-hours of electricity per year. ${ plantName } supplies electricity for ${ displayNumCitizensAnnually } citizens in ${ countryName } annually.`
Примечание:
Не нужно добавлять разрывы строк, поскольку они будут отображены на экране.
- Измените выражение return на return dataTL и щелкните Запустить.
В окне Выход можно просмотреть выходное предложение, в котором переменные заменены их вычисленными значениями.
Обработка пропущенных значений
Ваше выражение Arcade почти готово. Но вам еще необходимо рассмотреть особые случаи, когда некоторые значения атрибутов отсутствуют. Это три важных случая:
- У электростанции может не быть значения годового производства электроэнергии.
- Объект электростанции в слое Global Power Plants может относиться к стране, отсутствующей в слое World Countries Electricity Consumption.
- Страна в слое World Countries Electricity Consumption не поставляет данные о потреблении электроэнергии.
Сначала вы займетесь случаем, когда у электростанции нет данных о ее годовом производстве электроэнергии. Вы столкнулись с таким случаем ранее в руководстве, посвященном тестовой электростанции, Kajaki Hydroelectric Power Plant Afghanistan. Вы повторно воспользуетесь ранее созданным выражением Estimated Annual Generation in Lightbulbs, чтобы восполнить эти недостающие значения.
- Щелкните вкладку Предложения. Для Estimated Annual Generation in Lightbulbs щелкните стрелку, чтобы развернуть и увидеть предварительный просмотр кода.
- Выделите часть выражения, начиная с var generationCheck и заканчивая закрывающей фигурной скобкой после return noGenerationTL. Нажмите CTRL+C для копирования.
- В окнах Выражение найдите строку, объявляющую переменную AnnualGenerationGwh, добавьте новую строку и нажмите Ctrl+V, чтобы вставить скопированный текст.
Примечание:
Несколько строк, начинающихся с //, являются комментариями, не влияющими на работу выражения. Вы можете их удалить.
Вставленный вами текст создает из значения функции IsEmpty() переменную типа Boolean (true или false). Функция IsEmpty() проверяет, является ли переменная пустой или равной null, и если это так, то возвращает True. Итак, вы проверяете, пуста ли переменная annualGenerationGwh, которая содержит вычисленное значение поля годового производства электроэнергии. Если это так, выражение if возвращает предложение, объясняющее причину этой проблемы. Вы можете более подробно изучить код, который только что еще раз использовали, в учебном руководстве Начало работы с ArcGIS Arcade.
Вы измените шаблонный литерал, чтобы он лучше соответствовал конкретному сценарию, на который рассчитано выражение Arcade.
- В только что вставленном тексте выделите фрагмент после var noGenerationTL = и замените его следующим текстом:
`${ plantName } does not have estimated annual generation data. Unable to calculate the number of citizens the power plant can supply electricity for annually.`
Чтобы проверить этот случай, вы удалите тестовое значение 10, которое вы добавили в атрибут $feature.estimated_annual_generation.
- В коде найдите строку annualGenerationGwh = 10 и введите // перед ней, чтобы закомментировать ее.
- Щелкните Запустить.
В результате отображается предложение с отсутствующими данными, что является важным, поскольку у функции тестирования нет расчетных данных годового производства электроэнергии.
- В коде удалите комментарии для строки annualGenerationGwh = 10.
Наконец, вы займетесь третьим случаем отсутствующих значений: когда у страны в слое World Countries Electricity Consumption нет данных о потреблении электроэнергии. Вы воспользуетесь информацией о том, что, если в стране нет данных об ориентировочном годовом потреблении электроэнергии, у переменной electricityConsumption будет значение null.
- В окне Выражение, после строки с объявлением переменной electricityConsumption, добавьте еще одну строку и введите в ней следующий текст:
if (electricityConsumption == null) {
var noConsumptionTL = `There is no annual electricity consumption data for ${ countryName }. Unable to calculate the number of citizens the power plant can supply electricity for annually.`
return noConsumptionTL
}
Примечание:
С помощью функции IsEmpty() выражение также будет работать, но проверка == null специально предназначена для тестирования, не равно ли значение переменной null.
Чтобы проверить этот случай, вы будете использовать пример станции Boulaos в Джибути в слое World Countries Electricity Consumption, по которой нет данных о годовом потреблении электроэнергии.
- Щелкните Готово в окне Выражение.
- На карте щелкните кнопку Поиск и найдите Djibouti (Джибути), а затем щелкните точечный символ Global Power Plant, чтобы открыть всплывающее окно.
Теперь, когда вы рассмотрели все случаи отсутствия данных, вы можете быть уверены в том, что в подобных случаях ваше выражение всегда будет возвращать пользователю подходящее сообщение. Ваше выражение Arcade теперь готово.
- На панели инструментов Ресурсы щелкните Сохранить и открыть и выберите Сохранить, чтобы сохранить карту и выражение Arcade.
На всякий случай полное выражение для этого руководства представлено ниже. Были добавлены комментарии, предназначенные для ориентировки читателя на смысл кода.
// Save the country and power plant name to variables for later use
var countryName = $feature["country_long"]
// Save the power plant name and annual generation to a variable
// for later use
var plantName = $feature.name
var annualGenerationGwh = $feature["estimated_generation_gwh"]
// Check if there is a value in the estimated annual generation
// attribute field. isEmpty(fieldOrValue) returns true if empty
var generationCheck = isEmpty(annualGenerationGwh)
// If there is not annual generation data, return a sentence for use
// in the pop-up that informs the user about this.
// The below expression uses conditional logic and a template literal:
if (generationCheck) {
var noGenerationTL = `${ plantName } does not have estimated annual generation data. Unable to calculate the number of citizens the power plant can supply electricity for annually.`
return noGenerationTL
}
// If there is average annual generation data, the script continues:
// Create a FeatureSet from the World Countries Electricity Consumption layer
var countriesGenFset = FeatureSetByName($map,
"World Countries Electricity Consumption",
['COUNTRY', 'Annual_Electricity_Consumption_', 'POP'], false)
// Filter the countries feature set. COUNTRY is attribute field in World
// Countries Population and Annual Electricity Consumption
// filteredCountryFset will be a FeatureSet with only one feature,
// because the powerplant country value is only equal to one country
var filteredCountryFset = filter(countriesGenFset,
'COUNTRY = @countryName')
// Select the first country in the filtered FeatureSet
// This essentially changes the data type from FeatureSet to a feature
// because in this case, there is only one feature in each FeatureSet
var filteredCountry = first(filteredCountryFset)
}
// Access the electricity consumption value for the country
// from the countries layer
// Note: bracket [] and . notation are both accepted
var electricityConsumption = filteredCountry.Annual_Electricity_Consumption_;
// Check if there is annual electricity consumption data for the country
// Instead of using isEmpty, we will check if the value is null
// If it isn't, return a sentence indicating this and exit the script
if (electricityConsumption == null) {
var noConsumptionTL = `There is no annual electricity consumption data for ${ countryName }. Unable to calculate the number of citizens the power plant can supply electricity for annually.`
return noConsumptionTL
}
// Access the population value for the country from the countries layer
var population = filteredCountry.POP;
// Compute the consumption per capita for that country
var consumptionPerCapita = electricityConsumption / population
// Calculate the number of citizens the plant can supply annually
var numCitizensAnnually = round(
(annualGenerationGwh * 1000000) /
(consumptionPerCapita), 0)
// Change the number to text so we can add thousand separators
var displayNumCitizensAnnually = Text(numCitizensAnnually,"###,###,###");
// Use a template literal to return the string we will display
// in the pop-up
var dataTL = `On average, a citizen in ${ countryName } consumes ${ text(round(consumptionPerCapita, 0), '###,###,###,###') } kilowatt-hours of electricity per year. ${ plantName } supplies electricity for ${ displayNumCitizensAnnually } citizens in ${ countryName } annually.`
return dataTL
Отображение результатов во всплывающем окне
Теперь, когда ваше выражение Arcade готово, пришло время использовать его в тексте всплывающих окон слоя Global Power Plants.
- На панели Слои убедитесь, что выбран слой Global Power Plants.
- На панели Атрибутивные выражения нажмите кнопку назад.
- На панели Всплывающие окна внизу панели щелкните Текст и затем щелкните Редактировать текст.
Откроется всплывающее окно редактора текста с текстом, который в данный момент отображается в слое Global Power Plants. Вы добавите результат выражения Arcade в существующий текст.
- Во всплывающем окне редактора текста поместите курсор в конец текста {expression/expr1} и нажмите Enter.
- Введите несколько черточек (-------------------------------) для создания разделителя абзацев. Нажмите Enter.
- Введите одну скобку: {.
Появится список доступных полей и выражений Arcade.
- Щелкните только что созданное выражение Число граждан, которое может обеспечить электростанция ежегодно Number of Citizens the Power Plant can Supply Annually.
Примечание:
Вы увидите, что созданное вами выражение Arcade указано в списке наряду с другими доступными полями атрибутов. Вы сможете легко распознать его благодаря содержательному имени, которое вы дали ему ранее.
Выражение будет добавлено в элемент Текст с уникальным идентификатором {expression/expr2}.
Примечание:
Если вы добавили или удалили какие-то другие выражения, у уникального идентификатора может быть номер, отличный от 2, например, {expression/exp3}.
- Щелкните OK, чтобы закрыть редактор текста всплывающего окна.
- Сохраните карту.
Теперь вы протестируете всплывающие окна.
- Закройте панели Всплывающие окна и Слои, чтобы освободить дополнительное место на карте.
- Приблизьтесь к интересующей области, например, к испанской Севилье.
- Щелкните электростанцию, чтобы отобразить всплывающее окно.
Во всплывающем окне теперь отображается новый абзац текста, созданный вашим выражением Arcade.
- Во всплывающем окне изучите информацию о потреблении электроэнергии на душу населения и количестве жителей, обслуживаемых электростанцией.
- Нажмите на другие электростанции, чтобы просмотреть их всплывающие окна.
В этом руководстве вы создали выражение ArcGIS Arcade, вычисляющее число жителей, которое электростанция может обеспечивать электроэнергией ежегодно. Вы узнали, как получить доступ к данным нескольких слоев через FeatureSets и функцию Filter(). Затем вы использовали эти данные в ряде вычислений, рассмотрели несколько случаев отсутствия данных и воспользовались для них выражениями для всплывающих окон. Выражение Arcade выполняется динамически, не влияя на базовые данные. В этом руководстве была затронута лишь часть из того, что вы можете сделать с помощью Arcade. Подробнее изучите Путь обучения Arcade.
Вы можете найти больше учебных пособий в галерее учебных пособий.