Вопрос или проблема
У меня есть приложение на чистом JS, в котором я позволяю пользователю “настраивать” свое собственное аркадное выражение с помощью интерфейса. Я использую это аркадное выражение, чтобы масштабировать слой по-разному в зависимости от масштаба просмотра.
Рассмотрим следующее аркадное выражение (для тестирования):
var scale = When(
$view.scale >= 144447, 1,
$view.scale >= 72223 && $view.scale < 144447, 10,
$view.scale >= 36111 && $view.scale < 72223, 1,
$view.scale >= 18055 && $view.scale < 36111, 10,
$view.scale >= 9027 && $view.scale < 18055, 1,
$view.scale >= 4513 && $view.scale < 9027, 10,
$view.scale >= 2256 && $view.scale < 4513, 1,
$view.scale >= 1128 && $view.scale < 2256, 10,
10
);
return scale;
Для тестирования я просто изменил рендерер слоя, чтобы использовать это выражение:
layer.renderer.visualVariables[0].valueExpression = arcadeExp;
Этот код хорошо работает в версии 4.28, но не в 4.29 или 4.30.
Я пытался использовать методы из createVisualVariables и createContinuousRenderer и многие другие способы, но ни один из них не сработал в 4.29, только в 4.28.
Единственный способ, которым я мог это реализовать, был ручной обновление слоя с использованием layer.refresh(), когда масштаб изменялся.
Ответ или решение
Ваша проблема, связанная с изменениями в работе библиотеки ArcGIS JS API, вероятно, вызвана изменениями, которые были внедрены в версиях 4.29 и 4.30. Давайте рассмотрим несколько шагов для устранения вашей проблемы и получения желаемого результата.
1. Проверка версии API
Первое, что стоит сделать, — это убедиться, что вы используете правильные версии и зависимости ArcGIS JS API в вашем проекте. В возможных обновлениях могли быть внесены изменения в обработку визуальных переменных, которые затрагивают поведение вашего кода.
2. Обновление выражений Arcade
При необходимости обновите ваш Arcade-код, чтобы он следовал последним рекомендациям из документации. ArcGIS часто вносит изменения в поддержку синтаксиса или в поведение When
.
Вот пример, как можно создать переменную масштаба более современным способом с использованием CreateContinuousRenderer
:
layer.renderer = createContinuousRenderer({
field: "yourField",
minValue: 0,
maxValue: 100,
visualVariable: [{
type: "size",
valueExpression: `var scale = When(
$view.scale >= 144447, 1,
$view.scale >= 72223 && $view.scale < 144447, 10,
$view.scale >= 36111 && $view.scale < 72223, 1,
$view.scale >= 18055 && $view.scale < 36111, 10,
10);
return scale;`,
stops: [
{value: 1, size: 5},
{value: 10, size: 15}
]
}]
});
3. Обновление рендерера при изменении масштаба
Помимо ручного обновления слоя с помощью layer.refresh()
, вы можете также попробовать слушать события изменения масштаба и обновлять визуальную переменную напрямую. Это может выглядеть так:
view.watch("scale", function(newScale) {
layer.renderer.visualVariables[0].valueExpression = arcadeExp; // Переприсваиваем выражение
layer.renderer.update(); // Принудительное обновление рендерера
});
4. Использование visualVariables
Проверьте и убедитесь, что ваша конфигурация visualVariables
коректна. Если вы используете специальные типы visualVariables
, убедитесь, что они поддерживаются в версии 4.29/4.30:
layer.renderer.visualVariables = [{
type: "size",
valueExpression: arcadeExp,
stops: [
{ value: 1, size: 5 },
{ value: 10, size: 15 }
]
}];
Заключение
Если после всех этих изменений вы все еще сталкиваетесь с проблемами, проверьте журнал консоли на наличие сообщений об ошибках или предупреждений, которые могут указать на конкретные проблемы, связанные с совместимостью. Также полезно просмотреть примеры в документации ArcGIS, которые могут продемонстрировать правильное использование новых обновлений API, поскольку возможны изменения и в самой структуре данных.
Если у вас есть доступ к поддержке Esri, вы также можете обратиться туда за более детальной помощью, так как они могут предоставить информацию о возможных несовместимостях между версиями.