Pull to refresh

Comments 6

Пользуясь случаем, задам ещё вопрос к системе плагинов Leaflet.
Там принято под узкие задачи создавать отдельные классы, наследуя их от стандартных.
Суть проблемы проще пояснить на примере.

Скажем, есть общий класс L.TileLayer. А для специфических провайдеров делается что-то в таком духе:
L.TileLayer.Provider = L.TileLayer.extend({ ... });
А используется так:
L.tileLayer.provider('Stamen.Watercolor').addTo(map);
Это плагин плагин leaflet-providers и пока как будто бы всё логично.

Но идём дальше.
Есть, скажем, плагин TileLayer.Grayscale, которые переводит тайловый слой в оттенки серого.
Внутри у него то же наследование:
L.TileLayer.Grayscale = L.TileLayer.extend({ ... });
Используется аналогично:
L.tileLayer.grayscale(...).addTo(map);

Внимание вопрос: а как их использовать вместе? Что, если я хочу использовать слой Stamen.Watercolor и чтобы он стал черно-белым? Я не знаю. И это лишь один из примеров. Мне это кажется серьезным архитектурным изъяном — изъяном не самого Leaflet, а именно системы плагинов.

Но возможно, я что-то недопонимаю?
Да, это как раз один из примеров, автор второго плагина должен был делать расширение к L.TileLayer, а не городить потомка. Что-то типа:
L.TileLayer.prototype.makeGrayScale = function() {...}
Оба рендера работают неплохо, однако, если переключитесь на webgl, то стоит помнить, что ресурсы (например картинки тайлов) нужно будет пускать через прокси, иначе получите:

Хм, правда? Я понимаю, что задачи разные бывают, но как по мне — это был бы почти блокер. Это ведь означает, что без сервера вы работать не можете. При этом работа без сервера с малыми нагрузками вполне воможна.


И еще вопрос — а что с SVG? Если я верно понял, их кто-то должен рендерить либо в канвас, либо в WebGL. Кто именно и в какой момент? Означает ли это, что в итоге будет потеряна значительная часть функциональности, например анимации? И насколько при этом теряется производительность?

Хм, правда? Я понимаю, что задачи разные бывают, но как по мне — это был бы почти блокер. Это ведь означает, что без сервера вы работать не можете. При этом работа без сервера с малыми нагрузками вполне воможна.


Обычно все популярные открытые тайловые сервисы (OSM и тд) поддерживают cross-origin, а если вы используете какой-то сервис без него, то скорее всего можно нарушить соглашение об использовании, если это ваш сервис, то просто включите на нем cross-origin.

По поводу SVG, если вы именно хотите загрузить вектор из SVG, то оба фреймворка умеют делать и слои и маркеры из SVG, честно говоря, анимацию проверить не удалось. Leaflet'овые плагины вроде используют родной SVG браузера, а вот OL да, рисует на canvas.

Ну, наверное да. Практически все равно рабочих сервисов не так много, их можно по пальцам двух рук пересчитать.


А что до второго — я не вижу возможности как следует поддерживать SVG, если рендерит в канвас или WebGL какой-то сторонний компонент. Это довольно сложный стандарт, его и браузеры-то не всегда как следует умеют (не полностью или с багами). И это обидно (хотя наверное зависит от задач — у меня просто каждый второй заказчик непременно хочет SVG маркеры, да еще и с анимацией, в виде разного рода диаграмм).

К сожалению, следующей статьи так и не последовало
Sign up to leave a comment.

Articles