Визуализация данных с помощью HTML5 Canvas и SVG. SVG: основы векторной графики в HTML Разница между Canvas и SVG


(Обзорная статья по следам конференции по разработке ПО в Екатеринбурге и другим выступлениям. Видео-версию доклада в Екатеринбурге см. на techdays.ru )

Что такое HTML5 Canvas и SVG?

HTML5 Canvas

– элемент представляет собой холст для отрисовки растровой графики. Фактически, это пустой блок заданных размеров, на котором можно рисовать с помощью специальных API для JavaScript.

API включает в себя 45 специальных методов и 21 атрибут, используемые для отображения графических примитивов, задания стилей, трансформаций, доступа к отдельным пикселям, проецирования изображений и видео.

Сам элемент определен непосредственно в спецификации HTML5. API для него описывается отдельным документом -- HTML Canvas 2D Context .

SVG

Music Can Be Fun

Красивая музыкально-графическая игра-визуализация (http://musiccanbefun.edankwan.com/).

Примеры схем на SVG

Схема человеческого скелета, переодических система химических элементов и респираторная система (http://ie.microsoft.com/testdrive/Graphics/RealWorldDataAndDiagrams/Default.xhtml).

Карты Яндекс

Более близкий пример из реальной жизни – при отрисовке маршрутов используется SVG (если браузер поддерживает). См. также доклад “Карты и SVG” с нашего HTML5 Camp.

Еще примеры :

  • Beauty of the Web http://www.beautyoftheweb.com/ – реальные сайты из реального мира
  • Dev: unplugged http://contest.beautyoftheweb.com/ – проекты-участники соревнования приложений на HTML5

Разница между Canvas и SVG

В различных сценариях для динамичной отрисовки графики может лучше подходить или Canvas или SVG – к этому вопросу мы еще вернемся в конце. А пока остановимся на ключевых различиях между одним и другим:

Canvas SVG
Формат Растровый Векторный
Масштабирование
Доступ

Доступ к отдельным пикселям (RGBA)

Доступ к отдельным элементам (DOM)

Индексируемость и Accessibility

Виден только конечный растр (нельзя выделить фигуры, текст и т.п.) - плохо для Accessibility

Можно посмотреть структуру (например, вытащить весь текст)

Стилизация

Визуальные стили задаются при отрисовке через API

Визуальные стили задаются атрибутами, можно подключать CSS

Программирование

JS API для работы с примитивами

DOM для работы с элементами

Обновление

Для обновления - рисование поверх или полная перерисовка

Возможно изменение отдельных элементов

События

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

Легко вешаются события от мыши через DOM, обрабатываются автоматически.

Интеграция кода

Код на JS отдельно от Canvas

Внутрь можно включать JS

Эти различия необходимо учитывать при использовании той или иной технологии для визуализации данных. Например, отрисовка графика функции может быть легче с помощью Canvas, в то же время вывод подсказок (с определением объекта под указателем мыши), проще сделать с помощью SVG.

На практике, правда, уже есть ряд готовых библиотек для визуализации данных, которые частично нивелируют эти различия.

Я не буду вдаваться в основы работы с каждой из технологий, в качестве вводной рекомендую доклад Вадима Макеева (Opera) с HTML5 Camp “Динамическая графика: Canvas и SVG ”.

См. также доклады MIX 2011:

Обработка изображений с помощью Canvas

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

Хорошим примером того, где это нужно, являюется задача обработки/анализа изображений.

Processing.js предлагает два подхода к описанию визуализации: промежуточный код, в дальнейшем разбираемый самой библиотекой (отдельным файлом или внутри страницы) и явный код на JavaScript.

Например, чтобы нарисовать фрактал множество Мандельброта, можно использовать как вариант, указанный на странице с соответствующим примером , так и такой код на JavaScript:

var xmin = -2.5; var ymin = -2; var wh = 4; function sketchProc(processing) { processing.setup = function () { processing.size(200, 200); processing.noLoop(); }; processing.draw = function () { processing.loadPixels(); var maxiterations = 200; var xmax = xmin + wh; var ymax = ymin + wh; var dx = (xmax - xmin) / (processing.width); var dy = (ymax - ymin) / (processing.height); var y = ymin; for (var j = 0; j < processing.height; j++) { var x = xmin; for (var i = 0; i < processing.width; i++) { var a = x; var b = y; var n = 0; while (n < maxiterations) { var aa = a * a; var bb = b * b; var twoab = 2.0 * a * b; a = aa - bb + x; b = twoab + y; if (aa + bb > 16.0) { break ; } n++; } if (n == maxiterations) processing.pixels.setPixel(i+j*processing.width, 0); else processing.pixels.setPixel(i+j*processing.width, processing.color(n*16 % 255)); x += dx; } y += dy; } processing.updatePixels(); }; } var canvas = document.getElementById("myCanvas" ); var p = new Processing(canvas, sketchProc);

Попробовать самостоятельно можно здесь: http://silverbook.ru/projects/html5datavisualization/demo3-processingjs.htm (копируем код, вставляем в консоль и выполняем).

JavaScript InfoVis Toolkit (JIT)

Для отображения данных JIT принимает исходные значения в виде JSON:

var json = { "label" : ["label A" , "label B" , "label C" , "label D" ], "values" : [ { "label" : "date A" , "values" : }, { "label" : "date B" , "values" : }, { "label" : "date E" , "values" : }, { "label" : "date F" , "values" : }, { "label" : "date D" , "values" : }, { "label" : "date C" , "values" : }] }; var pieChart = new $jit.PieChart({ injectInto: "infovis" , animate: true , offset: 30, sliceOffset: 0, labelOffset: 20, type: "stacked:gradient" , showLabels:true , resizeLabels: 7, Label: { type: "Native" , size: 20, family: "Arial" , color: "white" }, Tips: { enable: true , onShow: function (tip, elem) { tip.innerHTML = "" + elem.name + ": " + elem.value; } } });

достаточно вызвать отрисовку:

PieChart.loadJSON(json);

jQuery Sparklines

Визуализация на карте с помощью SVG

Переходим к SVG и начнем с простого примера. Представьте себе, что вам нужно отобразить какие-то данные на карте регионов, как это сделать проще всего?

Если у вас есть готовая карта в виде SVG (я взял карту России с сайта Википедии), то это делается очень просто – достаточно, чтобы внутри SVG-документа у каждого региона был свой уникальный id, далее вставляем карту как inline svg и простым кодом раскрашиваем в нужный цвет:

var SverdlovskOblast = document.getElementById("SverdlovskOblast" ); SverdlovskOblast.style.fill = "#fe3300" ;

Если сделать все то же самое в цикле, то уже можно раскрасить не просто область, но и целый регион или даже всю страну:

var data = [{id: "KurganOblast" , value: 30}, {id: "SverdlovskOblast" , value: 200}, {id: "TyumenOblast" , value: 75}, {id: "KhantiaMansia" , value: 100}, {id: "YamaloNenetsAutDistrict" , value: 20}, {id: "ChelyabinskOblast" , value: 150}]; for (var i = 0; i< data.length; i++) { var item = data[i]; var region = document.getElementById(item.id); region.style.fill = RGBtoHex(item.value, 0, 0); }

Библиотеки для визуализации данных с помощью SVG

Как я уже говорил, для решения традиционной задачи визуализации числовых данных в виде графиков и диаграмм подходят как Canvas, так и SVG. В обоих случаях это достаточно легко делается с помощью соответствующих библиотек.

Примеры с Canvas мы уже посмотрели, давайте теперь посмотрим на несколько библиотек для работы с SVG. (Это также не исчерпывающий список, но довольно качественные и популярные решения.)

Raphaël

Чтобы добавить простую круговую диаграмму достаточно такого кода:

var r = Raphael("chart" , 640, 480); var pie = r.g.piechart(320, 240, 100, );

Несколькими дополнительными операциями можно добавить легенду, подписи к диаграмме и интерактивные подсказки:

var r = Raphael("chart" , 640, 480); r.g.txtattr.font = "12px "Fontin Sans", Fontin-Sans, sans-serif" ; r.g.text(320, 100, "Interactive Pie Chart" ).attr({"font-size" : 20}); var pie = r.g.piechart(320, 240, 100, ,
{legend: ["%%.%% – Enterprise Users" , "IE Users" ], legendpos: "west" ,
href: ["http://raphaeljs.com" , http://g.raphaeljs.com ]});
pie.hover(function () { this .sector.stop(); this .sector.scale(1.1, 1.1, this .cx, this .cy); if (this .label) { this .label.stop(); this .label.scale(1.5); this .label.attr({"font-weight" : 800}); } }, function () { this .sector.animate({scale: }, 500, "bounce" ); if (this .label) { this .label.animate({scale: 1}, 500, "bounce" ); this .label.attr({"font-weight" : 400}); } });

Аналогичным образом можно выводить и другие типы диаграмм, используя соответствующие методы. См. примеры непосредственно на сайте расширения http://g.raphaeljs.com/

Highcharts JS

API библиотеки позволяет достаточно легко сгенерировать диаграмму по данным в JSON:

var chart1 = new Highcharts.Chart({ chart: { renderTo: "charts" , defaultSeriesType: "bar" }, title: { text: "Fruit Consumption" }, xAxis: { categories: ["Apples" , "Bananas" , "Oranges" ] }, yAxis: { title: { text: "Fruit eaten" } }, series: [{ name: "Jane" , data: }, { name: "John" , data: }] });

Немного более сложным скриптом можно указать дополнительные детали, например, вывести легенду, настроить подсказки:

var chart = new Highcharts.Chart({ chart: { renderTo: "charts" , defaultSeriesType: "area" , spacingBottom: 30 }, title: { text: "Fruit consumption *" }, subtitle: { text: "* Jane\"s banana consumption is unknown" , floating: true , align: "right" , verticalAlign: "bottom" , y: 15 }, legend: { layout: "vertical" , align: "left" , verticalAlign: "top" , x: 150, y: 100, floating: true , borderWidth: 1, backgroundColor: "#FFFFFF" }, xAxis: { categories: ["Apples" , "Pears" , "Oranges" , "Bananas" , "Grapes" , "Plums" , "Strawberries" , "Raspberries" ] }, yAxis: { title: { text: "Y-Axis" }, labels: { formatter: function () { return this .value; } } }, tooltip: { formatter: function () { return "" + this .series.name +"
" + this .x +": " + this .y; } }, plotOptions: { area: { fillOpacity: 0.5 } }, series: [{ name: "John" , data: }, { name: "Jane" , data: }] });

При необходимости можно заменить стили по умолчанию на свои собственные.

Что выбрать: Canvas или SVG?

Как видно из примеров выше, для задач визуализации данных зачастую подходит и та, и другая технология. Многие вещи делаются схожим образом. В случаях, где нужен попиксельный вывод, очевидно, лучше подходит Canvas. Там, где диаграмма бьется на отдельные объекты, в которых нужно поддерживать интерактивность, лучше подходит SVG.

Лучше подходит Canvas
  • Редактирование растровой графики
  • Наложение эффектов на графику/видео
  • Генерирование растровой графики (визуализация данных, фракталы, графики функций)
  • Анализ изображенией
  • Игровая графика (спрайты, фон и т.п.)
Лучше подходит SVG
  • Масштабируемые интерфейсы
  • Интерактивные интерфейсы
  • Диаграммы, схемы
  • Векторное редактирование изображений

В графической форме это можно представить так:

Наконец, еще один важный срез, который также важно учитывать в выборе технологии – производительность отрисовки при использовании Canvas и SVG:

На практике Сanvas лучше работает при небольших размерах области отрисовки и на большом числе объектов, в SVG лучше подходит при необходимости масштабирования или вывода на большой экран и на не слишком большом количестве выводимых за раз объектов.

В большинстве Web-страниц встречается графика. Она позволяет красочно и наглядно представить информацию. Во многих случаях лучше показать картинку, чем давать длинное текстовое описание.
Существуют два способа размещения графических изображений на странице:

  • вставка отдельных картинок;
  • заполнение фона картинкой.

В любом случае графическое изображение берется из файла.

Вставка на страницу графического изображения из файла графического формата производится с помощью тега (от англ, image - изображение) с указанием адреса файла в качестве аргумента атрибута SRC:

Адрес графического файла - этолибо URL-адрес, либо имя файла, возможно, с указанием пути. Например, для показа графического файла logotip.jpg следует написать тег

Для увеличения скорости передачи графического изображения в теге можно использовать атрибут (дополнительный параметр) LOWSRC, который принимает в качестве аргумента адрес графического файла. Вы можете создать два графических файла: один (например, пусть это файл logotip.jpg) содержит картинку, полученную с высоким разрешением, а другой (например, logotip.gif) - картинку, полученную с низким разрешением. Тогда тег

Предпишет браузеру сначала загрузить файл logotip.gif, а затем по мере приема заменить его файлом logotip.jpg.
Другой способ ускорения загрузки графики заключается в задании размеров прямоугольной области, в которой будет размещено графическое изображение, с помощью атрибутов WIDTH (ширина) и HEIGHT (высота), измеряемых в пикселах. Если указать эти атрибуты, то браузер сначала выделит место под графику, подготовит макет документа, отобразит текст и только потом загрузит графику. Заметим, что браузер сжимает или растягивает изображение, встраивая его в рамки указанного размера. Пример указания размеров изображения:

Графика обычно используется вместе с текстом, поэтому возникает задача выравнивания текста и графического изображения. Эта задача решается с помощью атрибута ALIGN тэга с применением различных аргументов. Например, мы можем пожелать, чтобы текст обтекал картинку справа или слева. Обычно картинка встраивается вплотную с текстом, что может быть некрасиво. Во избежание этого, можно задать пустые поля вокруг иллюстрации. Поля создаются с помощью атрибутов VSРАСЕ для верхнего и нижнего полей и НSPACE для боковых полей в теге . Аргументы этих атрибутов указываются в виде чисел, определяющих размеры полей в пикселах. Для отмены обтекания графики текстом служит тег
.
Следующий тег задает обтекание графики из файла logotip.jpg справа (картинка будет находиться слева от текста):

Если требуется расположить картинку справа от текста, то нужно атрибуту ALIGN присвоить аргумент RIGHT :

Чтобы задать поля вокруг картинки, надо написать тег вида:

Здесь числа 20 и 10 определяют размеры полей.
Рассмотрим пример совместного использования графики и текстов. Откройте Блокнот (текстовый редактор Notepad) Windows. Напишите в нем HTML-код с использованием рассмотренных выше тегов. Ниже приводится программа, выводящая некоторый текст и графику. В качестве графического файла можно использовать любой из имеющихся у вас файлов. Здесь используется файл logotip.gif.


Упражнение 1



<Н1>Текст обтекает графику справа
Это - пример совместного использования текста и графики.
Текст программы HTML можно писать в любом текстовом редакторе. При этом используются теги разметки текста.

Этот текст выводится с нового абзаца. Чтобы сделать это, мы использовали специальный тег.


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

Рис. 657. Текст обтекает картинку справа

Широкие возможности точного позиционирования изображений (как и других элементов) на странице предоставляют таблицы и стили . Эти элементы HTML будут рассмотрены позже. Например, вы можете определить таблицу без видимых рамок, а в ячейках этой таблицы разместить картинки, тексты и другие элементы.

Этот пост - первый из серии статей о SVG (Scalable Vector Graphic), рассказывающий об основах векторной графики на сайте.

Векторная графика широко применяется в полиграфии. Для веб-сайтов существует SVG, которая согласно официальной спецификации на w3.org является языком для описания двумерной графики в XML. SVG включает в себя три типа объектов: фигуры, изображения и текст. SVG существует с 1999 года , а с 16 августа 2011 включена в рекомендации W3C . SVG сильно недооценена веб-разработчиками, хотя имеет несколько важных преимуществ.

Преимущества SVG

  • Масштабирование: в отличие от растровой графики, SVG не теряет в качестве при масштабировании, поэтому ее удобно использовать для разработки под retina.
  • Уменьшение HTTP-запросов: при использовании SVG сокращается количество обращений к серверу, соответственно увеличивается скорость загрузки сайта.
  • Стайлинг и скриптинг: при помощи CSS можно менять параметры графики на сайте, например фон, прозрачность или границы.
  • Анимация и редактирование: при помощи javascript можно анимировать SVG, а также редактировать в текстовом или графическом редакторе (InkScape или Adobe Illustrator).
  • Малый размер: объекты SVG весят намного меньше растровых изображений.

Основные SVG-фигуры

Согласно официальной спецификации можно рисовать простые объекты с помощью SVG: прямоугольник, окружность, линию, эллипс, ломаную линию или многоугольник при помощи тега svg .

Простая линия с помощью тега line с всего двумя параметрами - точками начала (x1 и x2) и конца (y1 и y2):

Также можно добавить атрибуты или стили stroke and stroke-width, чтобы задать цвет и ширину:

Style="stroke-width:1; stroke:rgb(0,0,0);"

Ломаная линия

Синтаксис аналогичен предыдущему, используется тег polyline , атрибут points задает точки:

Прямоугольник

Вызывается тегом rect, можно добавить некоторые атрибуты:

Окружность

Вызывается тегом circle , в примере с помощью атрибута r задаем радиус, cx и cy задают координаты центра:

Эллипс

Вызывается тегом ellipse , работает аналогично circle , но можно задать два радиуса - rx и ry :

Многоугольник

Вызывается тегом polygon , многоугольник может иметь разное количество сторон:

Использование редакторов

Как видно из примеров, рисование базовых SVG-фигур - это очень просто, но объекты могут быть намного сложнее. Для таких нужно использовать редакторы векторной графики, например Adobe Illustrator или Inkscape, где можно сохранять файлы в SVG-формате, а потом редактировать в текстовом редакторе. Вставлять на страницу SVG можно с помощью embed, iframe и object:

Пример - изображение айпода с сайта OpenClipArt.org .

Для включения изображения в определенном месте страницы существует тег . Этот тег имеет обязательный параметр: SRC="", и несколько необязательных. Параметр SRC="" указывает браузеру адрес, где искать рисунок и в качестве значения должен иметь URL-адрес ресурса, где размещен графический файл. В простейшем случае этот файл будет размещен в корневом каталоге или в папке IMG Вашего сайта. Необязательные параметры:

Параметр ALT="" в качестве значения содержит надпись, рассказывающую о содержании изображения для тех посетителей, браузеры которых не поддерживают графику или работают в режиме отключенной графики. Эта же надпись появляется при наведении указателя мышки на изображение.

Параметры WIDTH="" HEIGHT="" в качестве значений имеют размеры изображения по ширине и высоте в пикселях. Эти параметры желательно указывать в коде страницы, чтобы браузер заранее оставлял место для изображения, тогда, при загрузке, страница будет меньше "дергаться". Кроме того, эти параметры можно употреблять для регулирования размеров рисунка в окне браузера.

Параметр BORDER="" прорисовывает рамку вокруг изображения. В качестве значения указывается цифра, указывающая ширину рамки в пикселях.

Параметр ALIGN= определяет положение изображения на странице, и может принимать значения TOP - выравнивает верхнюю границу изображения по самому высокому элементу текущей строки, TEXTTOP - выравнивает верхнюю границу изображения по самому высокому текстовому элементу текущей строки, MIDDLE - выравнивает середину изображения по базовой линии текущей строки, ABSMIDDLE - выравнивает середину изображения посередине текущей строки. BASELINE или BOTTOM - выравнивает нижнюю границу изображения по базовой линии текущей строки, ABSBOTTOM - выравнивает нижнюю границу изображения по нижней границе текущей строки, HSPACE= - определяет отступ по горизонтали, VSPACE= - определяет отступ по вертикали.

Синтаксис тэга:

Бегущая строка

Бегущая строка задается тегом .

Атрибутами этого тэга являются bgcolor - цвет фона бегущей строки, height - высота строки, width - ширина строки.

Direction - задает направление движения бегущей строки - direction="left" (right, up, down) - движение влево (вправо, вверх, вниз).

Behavior - поведение строки - behavior="scroll" (slide, alternate). Scroll - обычная прокрутка (можно не прописывать, оно так и есть по умолчанию)



Slide - прокрутка с остановкой, строка пробегает до края и останавливается. Если одновременно с behavor="slide" употребить параметр loop, то строка прокрутится установленное количество раз и остановится у края. Alternate - строка будет двигаться от края к краю.
Scrollamount - скорость движения строки, scrollamount="1". Может принимать значения от 1 до 10. 1 - самое медленное движение, 10 - самое быстрое.

Синтаксис тега: текст

Современные веб-браузеры могут воспроизводить видео и звуковые файлы различных форматов. Для этого они используют встроенные проигрыватели (plug-in, элементы управления ActiveX) или внешние программы проигрыватели. Вставить звук или видео в HTML-документ можно с помощью различныз тегов:

- для вставки фонового звука;

- для вставки видео в формате AVI;

- для вставки звуковых и видеофайлов;

- для вставки звуковых и видеофайлов.

При решении вставить звук и/или видео в HTML-документ следует учитывать, что соответствующие файлы имеют довольно большой объем. Наиболее популярными в веб сейчас являются файлы звуковых форматов MP3, WMA, AIFF, AU, RealAudio (c расширением ra и ram), MP4, MIDI и видеоформатов MPEG, MOV. Звуковой формат WAV и видеоформат AVI в Интернете используются довольно редко.

Такой вывод следует из доклада председателя правления «Башнефти» , озвученного общему собранию акционеров компании, копия которого поступила в распоряжение редакции .

Из документа следует, что в результате геологоразведочных работ, в 2018 году была открыта 81 продуктивная залежь с запасами 19 миллионов тонн.

При этом применение высокоэффективных геолого-технических мероприятий и внедрение современных технологий повышения нефтеотдачи позволили сохранить по итогам 11 месяцев добычу нефти на зрелых месторождениях в Башкирии на уровне 2017 года - 15 миллионов тонн. Всего объем добычи за указанный период составил 17,3 миллиона тонн нефти.

В докладе также отмечается, что создание единой производственной цепочки с добывающим и перерабатывающим комплексом «Роснефти» повысило эффективность работы Уфимских НПЗ и привело к снижению операционных и логистических затрат. В частности, освоен выпуск бензина «Евро-6» и начато промышленное производство дорожного битума по новому ГОСТу.

Объем розничной реализации на АЗС «Башнефти» за 11 месяцев 2018 года увеличился по сравнению с аналогичным периодом прошлого года на 13,2 процентов и достиг 1,7 миллиона тонн.

Для реализации стратегии в области нефтехимии ведется модернизация нефтехимического производства. Так, в мае 2018 года на «Уфаоргсинтезе» введена в эксплуатацию новая установка производства кумола - сырья для изготовления красок, растворителей, различных полимеров, используемых в автомобильной промышленности, медицине и фармакологии. На очереди - реконструкция комплекса производства ароматики на «Уфанефтехиме», строительство новых установок по производству олефинов на «Уфаоргсинтезе».

Консолидированный показатель операционной прибыли за 9 месяцев 2018 года вырос по сравнению с аналогичным периодом 2017 года на 22,6 процента и составил 135,5 миллиарда рублей. Чистая прибыль «Башнефти» достигла 74,6 миллиарда рублей, что на 73,5 процента превышает аналогичный показатель прошлого года.

В течение третьего квартала «Башнефть» выплатила акционерам объявленные на годовом собрании в июне 2018 года дивиденды в размере 28,2 миллиарда рублей, а совокупный объем выплаченных с начала года дивидендов составил 43 миллиарда рублей.

При этом уровень чистого долга компании снизился и по состоянию на 30 сентября 2018 года составил 40,1 миллиарда рублей (на аналогичную дату 2017 года данный показатель составлял 104,7 миллиарда рублей).

При этом за отчетный период налоговые отчисления в бюджет Башкортостана с учетом разового платежа по налогу на прибыль увеличились по сравнению с аналогичным периодом прошлого года в 1,5 раза и составили 50,5 миллиарда рублей.