2016-10-28 16 views
1

Я использую листовку L.esri.dynamicMapLayer для отображения большого количества полилиний на карте, а запрос на экспорт на ArcGIS Server для их рисования может занять некоторое время. Если пользователь быстро делает несколько масштабирования или сковородок, я могу завершить кучу ожидающих запросов на экспорт, что также блокирует другие запросы на ArcGIS Server. Все эти запросы на экспорт, кроме последнего, бесполезны.Как предотвратить обновление динамическогоMapLayer при каждом масштабировании или панорамировании карты?

Для других слоев клиентской стороны я уже контролирую обновление, убедившись, что пользователь прекратил масштабирование или панорамирование не менее 2 секунд, прежде чем обновлять слои самостоятельно. Как я могу сделать то же самое для dynamicMapLayer, могу ли я приостановить или остановить автоматическое обновление и решить, когда я хочу, чтобы запрос на экспорт был сделан?

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

ответ

3

Как предотвратить обновление dynamicMapLayer при каждом масштабировании или панораме карты?

Вы не можете. It is designed that way.

Если ребята из esri не переделают, чтобы сделать подкласс L.GridLayer вместо L.ImageOverlay, его практически нет.

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

С ужасным, уродливым взломом. Перезапишите частный метод L.Esri.DynamicMapLayer._update, чтобы он стал декоратором по сравнению с предыдущим методом, например. что-то вроде:

(function() { 
    var previousProto = L.Esri.DynamicMapLayer.prototype; 
    L.Esri.DynamicMapLayer.include({ 
    _update: function(){ 
     throttle(previousProto._update, 2000); 
    } 
    }); 
})(); 

Это некрасиво, это против большинства хороших методов кодирования (перезаписи частных метод, eeeew), и он может сломаться.

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

Я не согласен. «Плитка» не означает «статический». Вы можете легко применить кэш-распаковка или использовать time dimension, или send all data to the client and let it slice it into vector tiles for quick rendering, или использовать что-то причудливое, как Carto(DB)'s Torque.

Тот факт, что ваши инструменты Esri не позволяют вам легко создавать разные наборы плиток или не разрешать черепичный доступ к смене ресурсов или не разрешать запуск недопустимых данных на стороне клиента, не означает что это невозможно.

+0

Спасибо за андерсера. Как насчет удаления dynamicMapLayer на zoomStart или dragStart, а затем повторного добавления его через 2 секунды. Просто попробовал это и, похоже, сработал. Это тоже уродливо ... но, похоже, это работает. Для плиток есть атрибут, который будет использоваться в качестве фильтра для контроля того, какие линии видны или нет. Там уже 3 возможных значения для этого параметра и могут быть больше в будущем. Клиент предпочитает использовать dynamicLayers, и вместо этого мы планируем использовать упрощенные геометрии на более высоких уровнях масштабирования для повышения производительности. Вероятно, используя алгоритм Дугласа-Пьюкера. – greenkarmic

+0

В вашем случае я бы сделал несколько наборов прозрачных плит и добавлял/удалял их на карту в зависимости от ситуации.При необходимости делегируйте функции с функциями щелчка. Даже используйте VectorGrid. Я нахожу, что клиенты заставляют технологический вопрос (много раз) ошибочно. – IvanSanchez

+0

Забавно, что вы должны сказать, что только что закончили длинную цепочку писем с клиентом, и я думаю, что она, наконец, готова пойти на компромисс в использовании плиток ... Не может быть счастливее, я потратил столько времени на оптимизацию карты, используя dynamicLayer. последние несколько дней. Она просто не получала огромных последствий для динамики динамики и не хотела компрометировать функции. Даже после того, как я показал ей прото, используя плитки и как быстро это было, она не хотела сдвинуться с места. Во всяком случае, да, я буду использовать прозрачные плитки, возможно, PNG8, по одному для каждого значения атрибута. Уф. – greenkarmic