- Ходят слухи, что если сложить вместе все тайлы Google Maps, то размер потребного хранилища для такого кеша будет исчисляться сотнями терабайт.
-
- Давайте посчитаем. Для начала, узнаем количество тайлов на территорию Москвы.
-
- Исходные данные таковы.
- Территория — квадрат со стороной 30 километров.
- Всего есть 20 LOD-ов (масштабная линейка из 20-ти ступеней).
- Каждый следующий масштаб отличается от предыдущего в два раза, т.е. тайлов на одну и ту же территорию в четыре раза больше (или меньше, если в другую сторону).
- Самый крупный масштаб 1 : 1128.497176.
- Плотность картинки 96 DPI (дюйм карты насчитывает 96 пикселей).
- Тайл — квадрат со стороной 256 пикселов.
- Средний тайл весит 0.02 мегабайт. В отличие от остальных данных, этот параметр получен экспериментально и не может быть на 100% точным. Скорее всего он весит меньше, поскольку плотность информации очень разная на разных масштабах и территориях.
-
- Имеем 1128.5 дюймов местности в 1 дюйме карты, что дает нам 1128.5 * 25.4 / 1000 / 96 = 0.29858 метров на 1 пиксель.
- Чтобы закрыть 30 километров надо 30000 / 0.29858 / 256 = 392.48 тайлов. Это по одной стороне.
- Значит на Москву надо 392.48 ** 2 = 154041.12 тайлов.
- Что в мегабайтах означает 0.02 * 154041.12 = 3080.82 мегабайт или 3 гигабайта.
-
- Итак, мы выяснили, что для самого крупного масштаба гуглокарт на Москву надо 3 гигабайта тайлов. Масштаб на ступень меньше потребует 3080.82 / 4 = 770 мегабайт, следующая ступень потребует 192 мегабайта, и далее — геометрическая прогрессия на 20 шагов. Пяти гигабайт должно хватить с избытком на всю масштабную линейку.
-
- Теперь, если хотите, можете сами посчитать, сколько надо тайлов (сотни терабайт, да?) на цилиндрическую развертку (проекция Меркатора) Земли в целом.
- Длина экватора - 40076 км. Длина меридиана – 40009 км, нам нужна половина (от полюса до полюса). Короче, считать надо прямоугольник 40000 км на 20000 км в несколько округленном виде.
-
- У меня получилось 2 738 терабайт. Три петабайта на весь глобус, и это только один масштаб, пусть и самый крупный. Я правильно посчитал? А то у меня с арифметикой часто глюки бывают.
-
def GooGlobeTilesSize(): squareSide = 30.0 * 1000.0 # meters scale20 = 1128.497176 # meters in meter dpi = 96 tileSide = 256.0 # pixel tileMB = 0.02 # megabyte inch = 2.54 / 100.0 # meter m2px = scale20 * inch / dpi # meters in pixel tilesLine = squareSide / m2px / tileSide squareTiles = tilesLine ** 2 squareMegabytes = squareTiles * tileMB print '%s гигабайт на Москву' % (squareMegabytes / 1000.0) |
Комментариев нет:
Отправить комментарий