Принцип формирования имён тайлов

Последнее изменение: 02/06/2020 13:36:32

В именах тайлов Google Earth содержится следующая информация:

Типы данных

На данный момент насчитывается всего 7 типов, каждый из которых характеризуется данными которые в нём записаны. Вот, все существующие на данные момент типы данных с примером имен тайлов и кратким описанием:

 Общий вид имени: 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
 Общий вид имени: 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
 Общий вид имени: q2-xxx-q.yyy 
  
    q2  - служебные данные, доступны после дешифровки и распаковки
    xxx - цифровое имя тайла, по которому рассчитываются его координаты и уровень зума
    q   - q-tree
    yyy - версия тайла
 
 Пример: q2-0203103311303103-q.306
 Общий вид имени: 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): Снимок для z1 На втором уровне зума уже есть 4 тайла, с именами 00,01,02,03 (первый 0 в имени говорит о родителе, а вторая цифра - о номере квадрата ): Снимок для z2 А вот на третьем уровне у нас всего 8 тайлов (вместо предполагаемых 16-ти): Снимок для z3 Остальные восемь тайлов третьего зума "виртуальные" и покрывают ту часть предыдущих тайлов, которая была окрашена в чёрный цвет. Имена виртуальных тайлов: 000,001,010,011,032,033,022,023 и соответственно, на всех последующих уровнях зума у этих тайлов не будет "детей". Это случилось из-за того, что изображение реальной Земли в первом тайле имеет разрешение 128*256 пикселей, а всё остальное - виртуальное несуществующее пространство, которое было введено для того, чтобы не нарушать структуру дерева. Т.о. размер первого тайла был увеличен до 256*256 пикселей и картинка стала отображать несуществующую Землю с координатами 180,-180 и -180,180 (для реальной Земли: 90,-180 и -90,180). Как видно, на реальную Землю мы вышли лишь на третьем уровне, отбросив несуществующие виртуальные тайлы.

Из всего этого, можно сделать очень важные выводы:

Так же, очень легко получить координаты тайла (любого его пикселя) по имени файла, учитывая, что нам известны координаты начального тайла (для первого уровня зума) и то, что последующие тайлы образуются от начального, делением на 4 (на 2 по широте и на 2 по долготе).

Алгоритм может быть следующим:

Delphi code
  1. var
  2.   i: integer;
  3.   lat1, lat2, lon1, lon2: single;
  4. begin
  5.   lat1:= 180; lon1:=-180;        //Верхний левый угол. Пиксель с номером (0,0)
  6.   lat2:=-180; lon2:= 180;        //Нижний правый угол. Пиксель с номером (256,256)
  7.   for i:=2 to length(DigitName) do
  8.   if DigitName[i]='0' then      // DigitName - входная строка с цифро-именем (0123201)
  9.   begin
  10.     lat1:=(lat1+lat2)/2;
  11.     lon1:=lon1;
  12.     lat2:=lat2;
  13.     lon2:=(lon1+lon2)/2;
  14.   end
  15.   else
  16.     if DigitName[i]='1' then
  17.     begin
  18.       lat1:=(lat1+lat2)/2;
  19.       lon2:=lon2;
  20.       lat2:=lat2;
  21.       lon1:=(lon1+lon2)/2;
  22.     end
  23.     else
  24.       if DigitName[i]='2' then
  25.       begin
  26.         lat2:=(lat1+lat2)/2;
  27.         lon2:=lon2;
  28.         lat1:=lat1;
  29.         lon1:=(lon1+lon2)/2;
  30.       end
  31.       else
  32.         if DigitName[i]='3' then
  33.         begin
  34.           lat2:=(lat1+lat2)/2;
  35.           lon1:=lon1;
  36.           lat1:=lat1;
  37.           lon2:=(lon1+lon2)/2;
  38.         end;
  39. 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"