Лучший способ анимировать радиолокационные данные в открытых слоях

9

У меня есть проект, использующий OpenLayers, который отображает данные радара на карте. Сами данные радара - это просто набор полигонов, каждый из которых заполнен одним из 6 возможных цветов. Цель состоит в том, чтобы оживить радар на карте. Каждый файл содержит радиолокационные данные за определенное время, а файлы разделены примерно на 5 минут, поэтому мой текущий подход заключается в циклическом просмотре всех файлов и загрузке их один за другим в новые отдельные слои. Как только каждый слой создан, его видимость установлена ​​на false и он добавляется на карту. Затем я анимирую слои, используя таймер, который включает видимость одного слоя и отключает видимость предыдущего слоя. В настоящее время все слои представляют собой векторные слои, и данные загружаются из файлов KML, хотя файлы данных могут быть практически любого формата, который лучше всего подойдет для этого проекта.

Проблема с этим подходом состоит в том, что когда я получаю достаточно большой промежуток времени (около 3 часов или около того) данных (примерно 36 слоев), потребление памяти становится довольно высоким (около 250 МБ). Предполагается, что конечный продукт сможет обрабатывать до 18 часов данных в одном цикле, что на основе указанного числа потребует более 1 ГБ памяти только для анимации и, вероятно, приведет к краху браузера или, по крайней мере, сделает его очень вялым.

Я попытался сделать то же самое, используя слои WMS для каждого слоя, но перерисовка была слишком медленной (анимация меняет слои каждые 100 мс), и потребление памяти было не намного лучше, чем у векторной версии.

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

TheOx
источник

Ответы:

9

Попробуйте раздвижное окно сортов. Вы можете буферизовать 10 слоев одновременно. Начните уничтожать слои и удалять их из DOM и памяти, как только вы достигнете 10 слоев. Поэтому, как только вы нажмете слой 10, слои 0-9 будут уничтожены, а слои 20-30 загружены с видимостью false. Это даст вам буфер из примерно 10 слоев, но вы можете изменить свой допуск, как считаете нужным для производительности. Если вы чувствуете, что 20 слоев работают лучше, переходите к 20.

          {Destroy Layers} |10|11...19|20| {Start Loading Layers}
|---------------------------------------------------------------------------|
                           
        Timespan           Current Possition
CaptDragon
источник
Вы, сэр, гений! На самом деле я еще не реализовал это на практике, но не вижу причин, по которым он не работает, а настраиваемый буфер означает, что мы можем дополнительно настроить его для различных сред. Я не могу отблагодарить вас за это предложение!
TheOx
Спасибо, я надеюсь, что это работает на практике. Дайте нам знать, как это работает.
CaptDragon
Только что завершили первоначальное тестирование и оно работает хорошо! В коде все еще есть место для оптимизации, но этот метод сохраняет объем памяти и настраивается в зависимости от памяти и пропускной способности клиентского компьютера. Еще раз спасибо за отличное предложение!
TheOx
Круто, приятно это слышать.
CaptDragon
@CaptDragon: (или TheOx) Можно ли опубликовать на рабочем примере? Я понимаю решение до некоторой степени, но простой пример и код очень помогли бы, поскольку у меня почти такая же проблема. Спасибо!
teknocreator
1

Рассматривали ли вы упрощение векторных слоев, чтобы уменьшить их размер. Если многоугольники содержат больше вершин, чем необходимо для целей отображения, упрощение (сглаживание) их приведет к уменьшению размера файла за счет уменьшения детализации. Я не уверен, какое программное обеспечение у вас есть, но несколько настольных приложений ГИС содержат функцию геообработки для упрощения функций.

Рич Вавзонек
источник
Это хорошая идея, но, к сожалению, проект требует отображения данных в полном разрешении. Однако я буду помнить об этом для некоторых других слоев данных в будущем, где мы могли бы использовать этот трюк.
TheOx
1

Помимо упрощения данных (даже немного может сэкономить много места), вы пробовали MapServer или какой-то другой способ превращения ваших данных в плитки с прозрачностью и создания слоя карты, чтобы положить поверх фонового слоя. Я видел этот подход с картами с хороплетом, в которых есть сотни или сотни тысяч полигонов (или маркеров), но я еще не смог попробовать его сам (из-за требований на стороне сервера).

Gary
источник