Najlepszy sposób na animację danych radarowych w openlayers

9

Mam projekt wykorzystujący OpenLayers, który wyświetla dane radarowe na mapie. Same dane radarowe to tylko kilka wielokątów, z których każdy jest wypełniony jednym z 6 możliwych kolorów. Celem jest animacja radaru na mapie. Każdy plik zawiera dane radarowe dla danego czasu, a pliki są oddzielone przez około 5 minut, więc moim obecnym podejściem jest zapętlenie wszystkich plików i załadowanie ich jeden po drugim do nowych osobnych warstw. Po utworzeniu każdej warstwy jej widoczność jest ustawiona na false i jest dodawana do mapy. Następnie animuję warstwy za pomocą timera, który włącza widoczność jednej warstwy i wyłącza widoczność poprzedniej warstwy. Obecnie wszystkie warstwy są warstwami wektorowymi, a dane są ładowane z plików KML, chociaż pliki danych mogą mieć praktycznie dowolny format, który będzie najlepszy dla tego projektu.

Problem z tym podejściem polega na tym, że po osiągnięciu dość dużego przedziału czasu (około 3 godzin) danych (co odpowiada około 36 warstwom) zużycie pamięci staje się dość wysokie (około 250 MB). Produkt końcowy ma być w stanie obsłużyć do 18 godzin danych w jednej pętli, która w oparciu o powyższą liczbę wymagałaby ponad 1 GB pamięci tylko na animację i prawdopodobnie spowodowałaby awarię przeglądarki lub przynajmniej spowolnienie.

Próbowałem tego samego przy użyciu warstw WMS dla każdej warstwy, ale przerysowanie było zbyt wolne (animacja zmienia warstwy co 100 ms), a zużycie pamięci nie było dużo lepsze niż wersja wektorowa.

Przeszukałem sieć, próbując znaleźć jakiś przykład, jak to zrobić, ale jak dotąd wymyślam z pustymi rękami. Czy ktoś ma jakieś sugestie, jak to zrobić? Przyjmę wszelkie pomysły, które masz w tym momencie, ponieważ utknąłem w tym od tygodni bez odpowiedzi.

Wół
źródło

Odpowiedzi:

9

Wypróbuj swego rodzaju przesuwane okno. Możesz buforować 10 warstw jednocześnie. Rozpocznij niszczenie warstw i usuwanie ich z DOM i pamięci po osiągnięciu 10 warstw. Więc kiedy trafisz warstwę 10, warstwy 0-9 są niszczone, a warstwy 20-30 są ładowane z widocznością fałszu. To da ci bufor około 10 warstw, ale możesz zmodyfikować swoją tolerancję, jeśli uznasz to za stosowne do wydajności. Jeśli uważasz, że 20 warstw działa lepiej, wybierz 20.

          {Destroy Layers} |10|11...19|20| {Start Loading Layers}
|---------------------------------------------------------------------------|
                           
        Timespan           Current Possition
CaptDragon
źródło
Jesteś geniuszem! Nie wdrożyłem tego jeszcze w praktyce, ale nie widzę żadnego powodu, aby nie działał, a regulowany bufor oznacza, że ​​możemy dalej dostosowywać to do różnych środowisk. Nie mogę ci wystarczająco podziękować za tę sugestię!
TheOx
Dzięki, mam nadzieję, że zadziała w praktyce. Daj nam znać jak to działa.
CaptDragon
Właśnie ukończył wstępne testy i działa dobrze! W kodzie jest jeszcze miejsce na optymalizację, ale ta metoda zmniejsza zużycie pamięci i można ją konfigurować w oparciu o pamięć i przepustowość komputera klienckiego. Jeszcze raz dziękuję za doskonałą sugestię!
TheOx
Wspaniale, dobrze to słyszeć.
CaptDragon
@CaptDragon: (lub TheOx) Czy byłoby możliwe opublikowanie postu na działającym przykładzie? Rozumiem rozwiązanie do pewnego stopnia, ale widzę prosty przykład, a kod bardzo by pomógł, ponieważ mam prawie ten sam problem. Dzięki!
teknocreator
1

Czy rozważałeś uproszczenie warstw wektorowych, aby zmniejszyć ich rozmiar pliku. Jeśli wielokąty zawierają więcej wierzchołków, niż jest to potrzebne do celów wyświetlania, wówczas uproszczenie (wygładzenie) zmniejszy rozmiar pliku kosztem zmniejszenia szczegółów. Nie jestem pewien, jakie oprogramowanie masz do dyspozycji, ale kilka aplikacji komputerowych GIS zawiera funkcję geoprzetwarzania w celu uproszczenia funkcji.

Bogaty Wawrzonek
źródło
To dobry pomysł, ale niestety projekt wymaga wyświetlenia danych w pełnej rozdzielczości. Będę jednak o tym pamiętać w przypadku niektórych innych warstw danych w dalszej części drogi, w których możemy zastosować tę sztuczkę.
TheOx
1

Oprócz uproszczenia danych (nawet trochę może zaoszczędzić dużo miejsca) wypróbowałeś MapServer lub inny sposób przekształcania danych w kafelki z przezroczystością i tworzenia warstwy mapy, która będzie układać się na warstwie tła. Widziałem to podejście z mapami choropleth, które mają setki do setek tysięcy wielokątów (lub markerów), ale nie byłem jeszcze w stanie tego wypróbować (z powodu wymagań po stronie serwera).

Gary
źródło