В статье описан один из вариантов решения задачи по фильтрации данных и содержимого виджетов в операционной панели ArcGIS в зависимости от текущего пользователя портала ArcGIS Enterprise или ArcGIS Online.
Идея заключается в том, что при входе пользователя Х в систему в операционной панели ArcGIS будут отображаться только данные доступные для него, и он не сможет увидеть данные, предназначенные для других пользователей. Это правило также будет применяться к диаграммам или виджетам, связанным с данными.
Для этого мы воспользуемся Выражением данных (Data Expression). Выражение данных — это любое выражение на Arcade, возвращающее набор объектов. Набор объектов можно использовать в качестве источника данных для завязанные на данные элементы, такие как список, индикатор, серийная диаграмма, круговая диаграмма, селектор или счетчик.
Выражения данных создаются, сохраняются и выполняются в ArcGIS Dashboards. Используя библиотеку функций Arcade, можно создавать выражения данных для комбинации, фильтрации или модификации существующих данных. В качестве источника данных можно использовать доступные сервисы, в том числе находящиеся в открытом доступе, например слои из ArcGIS Living Atlas.
Чтобы оценить возможности выражения данных загляните на страницу с примерами кода на Arcade для них.
Для нашей задачи мы настроим выражение данных для фильтрации данных сервиса в виджете Селектор категорий.
Используя следующее выражение Arcade:
// Write an expression that returns a FeatureSet.
// Фильтрация объектов по пользователю
// Идея - https://community.esri.com/t5/arcgis-dashboards-questions/filter-data-and-chart-based-on-login/m-p/1392150/highlight/true#M9227
// Списки пользователей
// Можно настроить получение из сервиса
var g1_users = [
'aleonov',
'user2',
'user3'
]
var g2_users = [
'oilgas',
'user1'
]
// Получение данных из сервиса, размещённого на портале
// Необходимо изменить для своего портала ArcGIS Enterprise или ArcGIS Online
var port = Portal('https://webadaptorhost.domain.com/webadaptorname'); // ваш адрес портала
var fs = FeatureSetByPortalItem(port,
'782a53304eda4456ae98976e7e504891', // id сервиса
1, // номер слоя в сервисе
['name'], // поле для фильтрации в функции Filter
false
);
Console(Count(fs)) // вывод в Консоли Сообщений Arcade общего кол-ва объектов в сервисе
Console(fs);
// Получение имени активного пользователя портала
var u = getUser(port);
var fullName = u.username;
Console (fullname) // проверка в Консоли Сообщений Arcade имени пользователя
// логика фильтрации данных сервиса
// изменить имя поля и SQL выражение для фильтрации
if (Includes(g1_users,fullName)){
return Filter(fs, "name LIKE 'NUR%'")
} else if (Includes(g2_users,fullName)) {
return Filter(fs, "name LIKE 'SEM%'")
} else {
return Filter(fs, "name = 'общий доступ'")
}
После чего настроим Действия для Селектора категорий. В Фильтре активируем фильтрацию всех элементов операционной панели и обязательно включим опцию Отображать, только если отфильтровано.
Теперь пользователям из списка g1_users видны датчики только на территорию Астаны, а пользователям из списка g2_users – только для города Семей.
Для отображения данных пользователю после открытия операционной панели нужно выбрать в Селекторе категорий – Выбрать всё.