Принцип формирования имён тайлов
Последнее изменение: 02/06/2020 13:36:32В именах тайлов Google Earth содержится следующая информация:
- тип данных, записанных в тайле
- уровень зума тайла
- версия тайла
- номер слоя (только у тайлов типа слой)
- историческая дата (только у тайлов типа снимок исторического режима)
- географические координаты тайла
Типы данных
На данный момент насчитывается всего 7 типов, каждый из которых характеризуется данными которые в нём записаны. Вот, все существующие на данные момент типы данных с примером имен тайлов и кратким описанием:
- снимки - не что иное, как обычные jpg файлы, с разрешением 256*256 пикселей
Общий вид имени: f1-xxx-i.yyy f1 - данные предназначены для отображения xxx - цифровое имя тайла, по которому рассчитываются его координаты и уровень зума i - изображение yyy - версия тайла Пример: f1-0203102130303313033-i.121
- исторические снимки - тоже что и снимки, но в имени тайла присутствует дополнительная информация о дате снимка
Общий вид имени: f1-xxx-i.yyy-hhh f1 - данные предназначены для отображения после дешифровки xxx - цифровое имя тайла, по которому рассчитываются его координаты и уровень зума i - изображение (от англ. image) yyy - версия тайла hhh - дата тайла Пример: f1-0311-i.28-f6c89
- текстуры детализированных 3D моделей
Общий вид имени: f1-xxx-d.zzz.yyy f1 - данные предназначены для отображения после дешифровки xxx - цифровое имя тайла, по которому рассчитываются его координаты и уровень зума d - слой zzz - номер слоя yyy - версия тайла Пример: f1-0201301123203330021-d.50200.235
- накладываемые векторные слои (дороги, имена, метки и проч.)
Общий вид имени: f1с-xxx-d.zzz.yyy f1с - данные предназначены для отображения после дешифровки и распаковки xxx - цифровое имя тайла, по которому рассчитываются его координаты и уровень зума d - слой zzz - номер слоя yyy - версия тайла Пример: f1c-020123220231-d.571.153
- рельеф (ландшафт)
Общий вид имени: f1с-xxx-t.yyy f1с - данные предназначены для отображения после дешифровки и распаковки xxx - цифровое имя тайла, по которому рассчитываются его координаты и уровень зума t - рельеф (от англ. terrain) yyy - версия тайла Пример: f1c-00323212113-t.192
- квадро-дерево (QuadTree, q-tree, q-дерево) - набор ссылок на существующие тайлы
Общий вид имени: q2-xxx-q.yyy q2 - служебные данные, доступны после дешифровки и распаковки xxx - цифровое имя тайла, по которому рассчитываются его координаты и уровень зума q - q-tree yyy - версия тайла Пример: q2-0203103311303103-q.306
- q-дерево для исторического режима (или q-дерево нового поколения)
Общий вид имени: qp-xxx-q.yyy qp - служебные данные, доступны после дешифровки и распаковки xxx - цифровое имя тайла, по которому рассчитываются его координаты и уровень зума q - q-tree yyy - версия тайла Пример: qp-0200223232330230-q.37
Не все типы данных присутствуют на каждом зуме (или точнее, не для каждого зума, тайлы этих типов запрашиваются, т.к. тайл на одном уровне зума может содержать в себе информацию сразу по нескольким зумам. Это касается, естественно, только векторных/служебных типов тайлов). Так, тайлы q-дерева присутствуют на уровнях зума кратных 4 (и на первом зуме): 1,4,8,12,16,20 и т.д. Тайлы рельефа присутствуют на нечётных зумах, начиная с третьего: 3,5,7,9,11 и т.д. Слои могут вообще начинаться и присутствовать лишь на нескольких глубоких зумах.
Уровень зума
Зум тайла определяется по длине его цифрового имени: каждый символ соответствует одному уровню.
Имя Зум 0 -> 1 символ -> 1 03 -> 2 символа -> 2 020 -> 3 символа -> 3 и т.д.
Координаты
Цифровые имена тайлов определяют географические координаты, т.е. область на поверхности Земли, которую описывает данный файл. Для простоты понимания, речь пойдёт о снимках, но все рассуждения справедливы и для всех остальных типов тайлов.
Формирование цифрового имени в Google Earth основано на том, что каждый следующий уровень содержит в 4 раза больше информации, чем предыдущий. Соответственно, если первый уровень описывается лишь одним тайлом, то второй - четырьмя, третий - шестнадцатью и т.д. Но у Google Earth есть своя особенность, которая вытекает из проекции Земли на плоскость, которую использует Google Earth.
Итак, картинка, для первого уровня зума, содержащая изображение всей планеты выглядит так (нанесены координаты углов и по центру - цифровое имя тайла: 0): На втором уровне зума уже есть 4 тайла, с именами 00,01,02,03 (первый 0 в имени говорит о родителе, а вторая цифра - о номере квадрата ): А вот на третьем уровне у нас всего 8 тайлов (вместо предполагаемых 16-ти): Остальные восемь тайлов третьего зума "виртуальные" и покрывают ту часть предыдущих тайлов, которая была окрашена в чёрный цвет. Имена виртуальных тайлов: 000,001,010,011,032,033,022,023 и соответственно, на всех последующих уровнях зума у этих тайлов не будет "детей". Это случилось из-за того, что изображение реальной Земли в первом тайле имеет разрешение 128*256 пикселей, а всё остальное - виртуальное несуществующее пространство, которое было введено для того, чтобы не нарушать структуру дерева. Т.о. размер первого тайла был увеличен до 256*256 пикселей и картинка стала отображать несуществующую Землю с координатами 180,-180 и -180,180 (для реальной Земли: 90,-180 и -90,180). Как видно, на реальную Землю мы вышли лишь на третьем уровне, отбросив несуществующие виртуальные тайлы.
Из всего этого, можно сделать очень важные выводы:
- для описания одной и той же области, в Google Earth нужно в 2 раза меньше файлов, чем в GoogleMaps;
- разрешение блока, в градусах на пиксель, величина постоянная, для данного уровня зума, и равна по долготе и широте;
- линии координатной сетки параллельны друг другу и отстоят друг от друга на равные промежутки.
Так же, очень легко получить координаты тайла (любого его пикселя) по имени файла, учитывая, что нам известны координаты начального тайла (для первого уровня зума) и то, что последующие тайлы образуются от начального, делением на 4 (на 2 по широте и на 2 по долготе).
Алгоритм может быть следующим:
- var
- i: integer;
- lat1, lat2, lon1, lon2: single;
- begin
- lat1:= 180; lon1:=-180; //Верхний левый угол. Пиксель с номером (0,0)
- lat2:=-180; lon2:= 180; //Нижний правый угол. Пиксель с номером (256,256)
- for i:=2 to length(DigitName) do
- if DigitName[i]='0' then // DigitName - входная строка с цифро-именем (0123201)
- begin
- lat1:=(lat1+lat2)/2;
- lon1:=lon1;
- lat2:=lat2;
- lon2:=(lon1+lon2)/2;
- end
- else
- if DigitName[i]='1' then
- begin
- lat1:=(lat1+lat2)/2;
- lon2:=lon2;
- lat2:=lat2;
- lon1:=(lon1+lon2)/2;
- end
- else
- if DigitName[i]='2' then
- begin
- lat2:=(lat1+lat2)/2;
- lon2:=lon2;
- lat1:=lat1;
- lon1:=(lon1+lon2)/2;
- end
- else
- if DigitName[i]='3' then
- begin
- lat2:=(lat1+lat2)/2;
- lon1:=lon1;
- lat1:=lat1;
- lon2:=(lon1+lon2)/2;
- end;
- end;
Переменная lat1 будет содержать широту точки 1 (соответствует координате Y=0), lon1 - долготу точки 1 (соответствует координате X=0). Переменные lat2 и lon2 будут содержать широту и долготу для точки 2, с координатами Y=256, X=256 - соответственно. Поскольку в географии, координаты принято указывать в последовательности: широта, долгота, а нумерация пикселей на картинке X,Y -может возникнуть путаница, при создании файла привязки. Вот пример записи координат в tab-файл привязки:
(lon1,lat1) (0,0) Label "Point:0-0", (lon1,lat2) (0,256) Label "Point:0-256", (lon2,lat1) (256,0) Label "Point:256-0", (lon2,lat2) (256,256) Label "Point:256-256"