Ведущий программист компании MapBox Юнг Хан (Young Hahn) опубликовал стенограмму своей презентации с конференции FOSS4G.
Компания MapBox известна как разработчик open source картографической дизайн-студии TileMill и тайлового сервера TileStream. Недавно они выпустили новую систему MapBox Streets — аналог Google Streets, но на открытых картах OpenStreetMap. Это глобальный картографический сервис с зуммированием до уровня отдельных домов, тоннелей, станций метро и т.д.
В презентации, названной «Рендеринг мира» (Rendering the World) ведущий программист компании рассказывает, как им удалось сгенерировать тайлы на таком уровне зуммирования для всей планеты.
Если посчитать количество необходимых тайлов в глобальном масштабе, то объёмы данных выходят астрономические. В этой системе масштаб z0 соответствует одному тайлу на всю мировую карту, на уровне z1 карта состоит из четырёх фрагментов, на уровне z2 — 16 фрагментов и так далее. В общем, количество тайлов на каждом уровне z равняется z^4.
Если предположить совершенно высокую производительность сервера, скажем 1000 тайлов в секунду, и минимальный размер тайлов 400 байт, то уже на уровне z17 нам нужно 200 дней рендеринга, а объём картографических данных составляет 10,3 терабайта.
С такими цифрами даже сильная оптимизация рендеринга не даёт решающего эффекта. Если ускорить его вдвое, то время рендеринга увеличится всего лишь с 200 до 100 дней, что в обоих случаях неприемлемо.
Другим вариантом проблемы может быть простое увеличение количество серверов для рендеринга в реальном времени по конкретным запросам пользователям, поступающим в данный момент.
Но в реальности подобную систему трудно масштабировать. Подобные серверы медленные и дорогие в обслуживании, и для рендеринга в реальном времени требуется большое их количество, в то время MapBox — маленькая компания и не может себе этого позволить.
Как же они смогли сделать рендеринг всего мира на уровне z17? Они подошли к делу с умом. Анализ географических данных показывает, что больше половины земной поверхности на самом деле вообще не нужно рендерить. Около 60% тайлов представляют собой простые синие квадратики — территория мирового океана. В школе учат, что океан занимает 70-80% поверхности, но на самом деле синих квадратиков около 60%, потому что Антарктида и Гренландия покрывают гигантскую площадь.
Это как буквы в алфавите, 50% которых можно удалить из текста, и от этого текст не потеряет смысловой нагрузки.
Оптимизируя задачу дальше, разработчики MapBox начали анализировать, каков процент земной поверхности не несёт информационной нагрузки и может быть проигнорирован. Кроме океана, они выделили территорию суши, которая не находится рядом с береговой линией. Оказалось, что почти всегда это тоже однородные «пустые» тайлы. В общем, на береговую территорию приходится всего 2% тайлов. А если взять города, дороги и любые объекты человеческой жизнедеятельности, то они заметны всего лишь на 1% территории Земли!
Таким образом, количество тайлов на уровне z уже не выражается формулой z^4, поскольку при 1% полезной территории на каждом уровне масштаба нужно бцуть сгенерировать один единственный полезный тайл.
Система хранения тайлов MBTiles, созданная MapBox, позволяет хранить тайлы с учётом избыточности, то есть одинаковые тайлы не дублируются, а просто ссылаются на один образецю. Так что вместо 10,3 терабайта вся территория Земли на уровне z17 в этой системе занимает 200 гигабайт. А вместо 200 дней работы тайл-сервера рендеринг 2% полезной территории занимает всего 4 дня.
Автор: alizar