войти зарегистрироваться

.NET whois

индекс
93,75

Обзор библиотеки для интерактивной визуализации данных WPF DynamicDataDisplay

image
Здравствуйте, уважаемые хабрапользователи!

В этом посте я расскажу вам о нашей разработке — бесплатной Open-source библиотеке для интерактивной визуализации данных WPF DynamicDataDisplay.
Немного о нас: мы — это сотрудники лаборатории технологий Microsoft факультета Вычислительной математики и кибернетики Московского государственного университета. Недавно на Хабре была статья о том, каким наш факультет видится студенту первого курса, а теперь этот пост позволит вам немного больше узнать о том, чем занимаются студенты нашего факультета на более старших курсах. Пример того, над чем работают пятикурсники — это наша библиотека для интерактивной визуализации научных данных DynamicDataDisplay (сокращенно — D3).

Немного истории


Разработка библиотеки началась в сентябре 2007 года в рамках сотрудничества нашей лаборатории и Microsoft Research Cambridge. Летом 2008 года первая версия библитеки была опубликована на сайте dynamicdatadisplay.codeplex.com/, где находится и развивается и поныне. С момента публикации минуло еще 3 выпуска стабильной версии библиотеки. Сейчас готовится к выпуску следующая версия — предположительно, v0.4, которая будет содержать в себе весьма много изменений и нововведений.

Но довольно вступительных слов — что же DynamicDataDisplay за библиотека и какие у нее возможности?

Возможности DynamicDataDisplay


DynamicDataDisplay предназначен для использования в managed-приложениях, построенных на технологиях WPF или Silverlight (об этом чуть позже).
Вы можете сказать, что уже и так существует предостаточно .NET библиотек для рисования графиков, и тут я с вами соглашусь — количество действительно есть. Но вот качество зачастую оставляет желать лучшего — попросите такой компонент построить график на основе данных длиной несколько десятков тысяч, и уже на нескольких сотнях элементов вы ощутите значительное замедление.
Основные преимущества DynamicDataDisplay над своими аналогами — это ориентированность на интерактивное отображение данных больших объемов, бесплатность, наличие открытого исходного кода. Интерактивное отображение данных больших объемов означает, что вы получите не статичное изображение вашей информации, а живой график, с возможностью передвигаться по нему, приближать отдельные области и отдаляться от них. DynamicDataDisplay отличается модульной и гибкой архитектурой, что позволяет вам с легкостью изменять и дополнять ее под свои нужды.

Итак, что же умеет показывать DynamicDataDisplay:
  • Линии — графики:
    image
  • Последовательность маркеров — небольших визуальных элементов, связанных с данными. На уровне маркеров есть поддержка DataBinding, а более сложные взаимосвязи между данными и внешним видом маркера вы можете задать из C#-кода.
    image
    Различные встроенные маркеры:
    image
    Разнообразные bar chart'ы:
    image
    image
  • Разнообразнейшего вида оси — обычные числовые, временные двух типов (типа DateTime и типа TimeSpan) и другие. Следующий рисунок наглядно проиллюстрирует то буйство возможных осей, которые могу присутствовать рядом с графиком:
    image
    Как видно, у нас нет фиксированного числа предопределенных осей, что дает пользователю библиотеки неограниченную свободу в поиске наилучшего набора осей.


Следующий большой раздел возможностей D3 — это

Карты


DynamicDataDisplay умеет загружать из интернета, сохранять на жесткий диск и, конечно же, показывать всевозможные карты. В официальных выпусках D3 у нас есть только один провайдер карт — OpenStreetMaps — бесплатный и свободный картографический сервер, разрешение которого на выпуск его провайдера в комплетке D3 мы получили. Дело в том, что компонент DynamicDataDisplay выкладывается в интернет от имени Microsoft, что накладывает ряд ограничений на те готовые провайдеры карт, которые мы могли бы выложить вместе с компонентом — не можем же, в конце концов, от имени Microsoft взламывать карты Google или Yahoo, Yandex или Mail.ru, или самой Microsoft (Bing Maps). Впрочем, написать такой провайдер самому довольно легко — я приведу пример нерабочего кода провайдера карт Google Sky:

    public sealed class GoogleSkyServer: NetworkTileServer
    {
        public GoogleSkyServer()
        {
            UriFormat = «XXX.google.com/mw-planetary/sky/XXX.jpg»;
            ServerName = «Google Sky»;
            ServersNum = 2;
            MinServer = 1;
            FileExtension = ".jpg";
        }
 
        protected override string CreateRequestUriCore(TileIndex index)
        {
            var level = (int)index.Level;
            var y = MapTileProvider.GetSideTilesCount(level) / 2 — index.Y — 1;
            var x = MapTileProvider.GetSideTilesCount(level) / 2 + index.X;
            string uri = String.Format(UriFormat, CurrentServer, x, y, level);
            return uri;
        }
    }

(Пример сделан нерабочим специально, во избежание.)

Вот так выглядят карты OpenStreetMaps в наибольшем отдалении:
image
Как вы можете заметить, вертикальная ось содержит отсчеты, распределенные нелинейно, — это из-за того, что именно так распределена широта в исходных картах. Поэтому мы применяем к данным, отображаемым над картой, преобразование Меркатора, чтобы они находились именно там, где и должны находиться.

А вот так выглядит карта, к которой самой применено нелинейное преобразование Меркатора, которое у нас делается эффектом-шейдером:
image
К данным, которые накладываются на эту карту, уже не надо применять никакого преобразования, поскольку обе оси — широт и долгот — линейны.

На основе карт мы разработали довольно много других визуализаций: например, это фрактал Мандельброта, который по мере приближения к нему рассчитывает дополнительные тайлы карты, которые затем добавляются в пирамиду тайлов (пирамида тайлов — это дерево тайлов, упорядоченное по уровню масштаба. На первом уровне может быть, скажем, одно изображение, на втором — 4, на 3 — 16 и т.д.):
image

Загруженные тайлы карты могут быть упакованы в разновидность zip-архива (WPF'овский package, такой же, как использующийся в форматах документов docx, xlsx, xps) и затем распространяться в более удобной форме, работая как предзагруженный кэш тайлов.

Изолинии


DynamicDataDisplay умеет рисовать линии уровня или изолинии, причем на произвольной, даже кривоугольной сетке:
image
На данном изображении показаны линии уровня высот и глубин Земли. Сами изолинии получаются довольно объемными и, будучи отрисованными средствами WPF, довольно заметно притормаживают. Для ускорения их отображения мы применяем рендеринг изображения изолиний в битмапы, которые затем рисуются силами карты. Получается весьма шустро.

Вот так выглядят изолинии, отрисованные сами по себе, без промежуточного сохранения в битмап:
image

Перспективы развития DynamicDataDisplay


В будущем мы планируем развивать DynamicDataDisplay, чтобы он захватил мир становился все лучше и лучше.
Вот некоторые нововведения, которые или уже находятся в разработке, или скоро начнут разрабатываться:
  • цветовые карты
  • трехмерные визуализации:
    • поверхности уровня
    • сетки
    • маркеры в трехмерном пространстве
  • карты из DeepZoom


Ну и наконец, набор ссылок на все, связанное с нашей библиотекой:

Полезные ссылки



На данный момент библиотека довольно известна за пределами России, если судить, например, по статистике codeplex.com. Несколько коммерческих проектов успешно используют библиотеку DynamicDataDisplay. Цель этой статьи — повысить известность библиотеки в России.
На этом пока все, надеюсь, вы найдете нашу библиотеку полезной и сможете легко и успешно использовать ее в ваших проектах!

комментарии (32)

  • Когда планируется использование новейших технологий Windows 7, например, Direct2D?
    • Женя, не повергай меня в панику — я ж серьезно начал пытаться вспомнить, что это такое)
    • WPF 4 сам использует Direct2D, так что, думаю, достаточно перекомпилировать библиотеку под .NET 4.
  • «Direct2D is a new 2-D graphics API for Windows 7. Direct2D provides Win32 developers with the ability to perform 2-D graphics rendering tasks with superior performance and visual quality» бла-бла-бла отсюда.

    А ты — «вспомнить» :)
    • Да, согласен, не знал.
  • Я так понимаю есть возможность однажды закачать нужную часть карты и дальше использовать ее без подключения к интернету.
    • Да, вы правы. Главное — это правильно настроить место, куда будут сохраняться закачанные тайлы — если выбор из нескольких позиций, таких, как папка самого приложения, папка Temp и прочие. Под правильной настройкой места я понимаю такое расположение в файловой системе, которому не грозит внезапная очистка, как, например, папке Temp или TemporaryInternetFiles.
      • Идея в следующем: закачать карту один раз, нанести на нее какие-то свои данные и дальше отдать программу другому человеку, у которого отсутствует интернет для пользования.
        • Да, так сделать можно. А вот что вы понимаете под «нанести на нее какие-то свои данные»?
          • Задача стоит в нанесении в определенных координатах точек(маркеров) с некоторым описанием.
            • Да, это сделать можно.
              • отлично, после работы сегодня будем играться с библиотекой.
                Спасибо Вам за разработку.
  • Здорово. Выглядит круто.

    Одна неприятность: при попытке открыть ссылку с xbap у меня возникла ошибка:
    " Невозможно установить или запустить приложение. Для этого приложения необходимо сначала установить сборку System.Threading Версия 1.0.3058.34407 в глобальный кэш сборок (GAC).".

    Как обойти? .net 1.1 ставить, чтоли?
    • Странно, потому что у других пользователей проблем не было.
      .NET 1.1 ставить однозначно не нужно, возможно стоит попробовать установить Microsoft Parallel Extensions to .NET Framework 3.5, June 2008 Community Technology Preview (http://www.microsoft.com/downloads/details.aspx?FamilyId=348F73FD-593D-4B3C-B055-694C50D2B0F3&displaylang=en). Дело в том, что мы его используем.
      • это помогло
        • * стоит добавить коммент в статью, чтобы другие знали
        • Видимо, у тех, у кого не возникало проблем с этим набором демонстраций, PFx уже был установлен.
    • у меня кстати на рабочем пк такая же бага… попробуем совет, что ниже!
  • Умные ребята :)
  • Что изображено на первой картинке?
    • Если вы про ту, что с США, то, кажется, это уровни осадков. Видимо замеры производились на метеостанциях, и метеостанции так расположены по территории США.
  • А какие выходные форматы графики поддерживаются?
    Кстати, вы метеорологию выбрали для примера или у проекта есть ориентация на эту область?
    • Если вы имеете, в какие форматы можно сохранять карты — то в те, которые поддерживает WPF (png, jpg, bmp и что-то еще).
      Метеорология — только для примера, ведь даже остальные изображения никак с метеорологией не связаны.
      • >(png, jpg, bmp и что-то еще).
        а векторные форматы есть?
        • Понимаете, мы никогда не задавались целью поддержки сохранения (видимо, изображения) в векторный формат, потому что у нас другая цель — создать библиотеку для построения приложения с интерактивными визуализациями внутри. Сохранять библиотека умеет лишь простое изображение того, какую визуализацию она сейчас изображает. Так что вектор никогда не был нашей целью.
          Если прикрутить печать в xps, то будет сохранение отображаемых, скажем, линий или маркеров, в векторный формат (проще говоря, в WPF'овский Path). Но и это мы не делали, потому что нужды не было.
        • Кстати, а зачем вам нужно сохранять результат визуализации в векторном виде? Может быть, вы расскажете и мы прикрутим эту возможность)
          • все очень просто. Визуализируемые данные могут применяться в публикациях. А растровой картинке мало кто будет рад. Плюс постпроцессинг иногда требуется(ну тут уже вопрос холиваров кому что удобнее постпроцессить). Я пользуюсь одной софтиной, NCL(http://ncl.ucar.edu), ее разрабатывает американское сообщество метеорологов(океанологи тоже там рядом бродят). Можете посмотреть на нее, там много хороших идей, хотя она и сложна. Если бы Ваша система работала бы с вектором и была бы не для платформы MS, я бы с удовольствием бы подумал о переходе на нее.
            • Ясно, спасибо за объяснение. Хоть поддержку вектора мы добавить можем, но платформу изменить — точно не можем)
  • Очень жаль, что заточено всё под технологии MS. Сейчас всё-таки большая часть научного мира работает в nix-системах.
    • А вообще библиотека выглядит очень круто. Но для своих целей использовать не смогу из-за причины, описанной выше.
    • Возможно, вы правы, но и у меня есть свои аргументы:
      1) Мы — лаборатория технологий Microsoft. Было бы странно, если бы мы использовали не майкрософтовские технологии.
      2) Заказ на эту библиотеку исходит со стороны MS Research. В последнее время Microsoft довольно сделала для ученых — взять хотя бы тот же F#, который именно на них и ориентирован. MS Research найдут, как применить нашу библиотеку.
      3) В сентябре этого года мы общались на тему совместной деятельности с Институтом космических исследований. Так вот — хотя там действительно много чего делается в nix-системах, они весьма с большой готовностью откликнулись на предложение немного адаптировать нашу Windows-библиотеку под их нужды. В случае если бы появился удобный инструмент, заточенный под их задачи, они бы спокойно стали использовать Windows — ведь для них операционная система — это всего лишь инструмент, среда, в которой работают их непосредственные программы. И если такие программы будут работать под Windows, то и ученые могут ее использовать.

      Впрочем, это только мое мнение.
Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.