НА ГЛАВНУЮ СТРАНИЦУ

"ВЗГЛЯД ИЗ-ЗА ГУГЛА": НУЖНЫ ЛИ НАМ ЭТИ СНИМКИ И...
КАК ИХ ВСТАВИТЬ В ГИС?

- Оригиналы вместо репродукций

- Высокое разрешение и точная геопривязка

- Получить нужные блоки

- Снимки, снимки... карты!

- Другие картсервисы: как устроены Космоснимки.Ру

- Благодарности и ссылки

О Google Maps знают нынче почти все, даже словечко уже удобное образовалось: среди гисовцев иначе как "гугл" эти снимки и не называют. Кто только не высказывался о значении и роли этих сервисов. Здесь же, прежде чем переходить к геопривязке, хотелось бы задаться простым вопросом: а вообще, нужны ли нам в ГИС данные гугл?

Оригиналы вместо репродукций

В ценности бесплатных данных высокого разрешения сомнений нет: ну кто ж откажется получить на свой родной московский квартал такую вот картиночку с клумбами и подъездами:

или вот такую .

Даже отбросив шпионские устремления, из чистой эстетики вряд ли удержишься, чтобы не позаимствовать парочку вот таких фрагментов

знакомых мест .

Но, как известно, бескрайние просторы покрыты отнюдь не "картинками с домами" QuickBird, а довольно грубыми снимками Landsat ETM+ (в просторечии "ландсат"). Для гугл разрешение их улучшено до 15 м, кроме того, усилен контраст и подчеркнуты детали и они довольно сильно сжаты. В результате такой решительной обработки их порой трудно назвать привлекательными, хотя в наглядности им не откажешь. Оригиналы ландсат, на первый взгляд, проигрывают гугловским образцам. Рассмотрим, например, г. Нижнеангарск с окрестностями, в обоих вариантах:

Снимок с карты ГуглОригинальный снимок Ландсат

Однако, здраво оценивая стиль обработки гугл, видим: по сути, главной задачей было улучшение резкости и контрастности в угоду широкой публике. В результате на оригинале оттенки леса читаются лучше, для любителей природы такой снимок интереснее. Разница, впрочем, не везде существенна, но обрабатывать ландсат-то вы можете сами, и отрегулируете параметры снимка под свои задачи точнее. Исходный ландсат, правда, имеет 30-метровое зерно. Однако не все знают, что получив 8-й канал, можно и самостоятельно улучшить разрешение ландсата. Вот улучшенный снимок на ту же территорию - согласитесь, есть разница!

Снимок с карты ГуглЛандсат обработанный

Сравнивая с исходными образцами, легко заметить и другие недостатки гугловского ландсата: чрезмерная степень сжатия, смазывающая муаром все мелкие особенности ландшафта, лесных пород, например. Излишнюю степень резкости, которая тушует, а не подчеркивает некоторые тонкие линии и т. п. Всего этого можно избежать, если взять дело в свои руки. Где получить и как обработать ландсат, не имея ни ENVI ни ERDAS, описано здесь. В пользу оригиналов говорит еще и то, что они геопривязаны. Однако, как мы увидим далее, и для данных гугл это не представляет большой сложности. Иными словами, если уж вы все-таки решили пользоваться гуглом, то дальнейшие разъяснения помогут вам получить и привязать фрагменты. Растровый массив гугла огромен, и в нем, несомненно, найдутся удачные фрагменты. Ну и конечно, снимки высокого разрешения! Словом, раз теперь можно подглядывать "из-за гуглА", зачем себе отказывать в невинном удовольствии?

Высокое разрешение и точная геопривязка

Итак, вопрос о доставке гугла до ГИС все равно стоит. Рассмотрим принципы расчета геопривязки с азов. Что нужно, чтобы привязать растр в ГИС? Во-первых, нужно знать его "родную" проекцию, во-вторых, нужно каким-либо способом составить world-файл для плоской (аффинной) геокоррекции. При первом же взгляде интуиция подсказывает географу, что проекция гугла, скорее всего, цилиндрическая, хоть мы нигде не видим сетки координат. Дальнейшие исследования подтверждают: составители гугла пользовались меркаторской проекцией. В документации, правда, это нигде не звучит, и аргументы на эту тему мы опустим. Если вам интересно, вы сможете найти их в дискуссии по ссылке [3].

Перейдем к world-файлу: если проекция известна и поворота растра относительно оси координат нет, то для привязки существенны всего четыре параметра: разрешение по X и Y, координаты X и Y верхнего левого угла. Этого достаточно, чтобы составить world-файл и привязать растр эффективно и точно. Подробнее об этом есть в [5]. Попробуем подобраться к этим параметрам с помощью математики.

Детально устройство Google Maps описано в источнике [2], и повторяться вряд ли нужно, поэтому перейдем сразу к географическим тонкостям проблемы. Растровый массив гугла составлен из блоков 256*256 и имеет квадратную форму на любом уровне детальности. Меркаторское пространство же, как известно географам, сильно вытянуто по долготе. Самый общий уровень, изображение всего мира, в гугле имеет вот такой, квадратный вид:

а меркаторская карта вот:

Как совместить эти два пространства, не растягивать же гугл по вертикали? Не придется: если внимательно приглядеться, квадрат гугла охватывает карту мира не целиком, а лишь до некоторых пределов. Создатели гугла не включили полярные области, они ведь все равно сильно искажены и мало кому интересны. Таким образом, отображение гугла на меркаторской карте мира представляет тоже квадрат: он показан голубыми "линиями отреза" на картинке. В результате ампутации по широтам 85.0511287798066° растровый массив любого уровня укладывается в меркаторское пространство... Остается поточнее определиться с проекцией - вариантов немного. Как известно, она может быть основана на эллипсоиде (обычно WGS-84), или, в упрощенном варианте, на сфере. На эллипсоиде считать параметры геопривязки сложнее, но на наше счастье, сервис Google Maps базируется на сферическом варианте - это установлено на опыте, путем проб и ошибок - сам гугл об этом умалчивает.

Итак, займемся сферическим вариантом. Как водится, сначала удобнее определиться с мастшабом - то бишь, с разрешением. Размер пиксела по X и Y одинаковый на всем пространстве, как и должно быть в родной проекции. Он легко рассчитывается: сопоставив ширину массива гугла сооответствующего уровня (в пикселах) и ширину меркаторского пространства (в метрах), получаем размеры одного пиксела. Ширина меркаторского пространства равна длине экватора 2*p*R, где R - радиус референц-сферы проекции.

Ширина растрового массива известна: для нулевого, самого общего уровня, она равна 256 пиксел. Взяв радиус сферы 6 371 000 м, принятый в продуктах ESRI (мы же привязываем для ArcMap?), получаем, что ширина мира равна 40030172 м. Соответственно, размер самого крупного пиксела равен 156368 м. Привязанный с этим разрешением в ГИС растровый массив нулевого уровня выглядит вот как:

На следующем, первом уровне размер пиксела в два раза меньше, на втором еще в два раза и так далее. На 16-м уровне, таким образом, получаем 2.385984 м на пиксел. Получается, что значения размеров пиксела растрового массива в меркаторском пространстве на конкретной сфере зависят только от уровня детализации, и этих значений столько, сколько применяется уровней. Можно составить себе постоянную справочную таблицу. Разумеется, это же разрешение работает для любого растрового фрагмента, для блока 256 на 256, не только для массива в целом. Обозначим его XYres, это базовая, очень важная величина.

Идем далее: имея определенный фрагмент растра и зная разрешение уровня, нужно рассчитать его положение в массиве. Как правило, в ГИС нам известны долгота и широта области Lon/Lat, от них нам нужно перейти к координатам фрагмента в массиве всего уровня в пикселах. Вывод алгоритма пересчета есть в [2], здесь же приводятся лишь упрощенные формулы, уже подготовленные к эффективному использованию:

Xp = BM0 * (1 + LonRad/Pi);

Yp = BM0 * { 1 - 0.5*ln[ (1+sin(LatRad))/(1-sin(LatRad)) ] /Pi };

BM0 здесь центр всего массива Google Map в пикселах, точнее, ширина, делённая пополам. Для 18-го уровня, например, это будет 33554432/2 = 16777216.

LonRad, LatRad - долгота и широта места в радианах (не в градусах!!!);

Xp, Yp - координаты на растровом массиве данного уровня в пикселах, от верхнего левого угла массива. Не забудьте их округлить до целых чисел.

Итак, зная географические координаты нужной области, вычисляем Xp, Yp. Разумеется, в нашем случае мы будем привязывать не абстрактную точку, а верхний левый угол какого-либо фрагмента растра, точнее, одного из его блоков 256 * 256: иными словами, годятся не любые значения Xp, Yp, а только кратные 256. Можно вычислить так называемые номера блоков в гугловском массиве, они все равно понадобятся для эффективной организации получения:

NumX = Xp/256; NumY = Yp/256;

Результат должен быть округлен, но в какую сторону? По идее, в большую, чтобы, рассчитывая номер блока с пикселом 257 на наивысшем уровне, мы получили второй, а не первый номер. Зная положение фрагмента растра в общем массиве и разрешение XYres, сами координаты X и Y в меркаторском пространстве на сфере вычисляются просто. Нужно лишь не забыть о том, что они отсчитываются уже не от верхнего левого угла, а от центра, и могут быть отрицательными:

X = XYres * (Xp - BM0); Y = XYres * (BM0 - Yp);

Кроме этих координат и разрешения, для привязки блоков в ГИС ничего не нужно. Как составить по этим параметрам world-файл, напоминаю, рассказано в [5]. Да, только не забыть в окне ГИС выставить проекцию "Меркатор на сфере", причем определенного выше радиуса. Такой проекции нет в OZI Explorer и в Mapinfo, и привязка гугла там из-за этого не такая простая :(

Получить нужные блоки

Чтобы получить нужные блоки, нужно знать их имена в номенклатуре гугл, раньше это был набор букв, например, "trtqrststsstttttrs": бессмыслица на первый вгляд, но очень удобная на практике, если кто помнит. Теперь принцип именования почти одинаков у всех провайдеров веб-тайлов - номер блока по X, номер по Y, и уровень детальности Z. Например, набрав в интернете адрес http://khm0.google.ru/kh/v=45&x=39617&y=20478&z=16, мы получим квадрат с изображением спорткомплекса "Олимпийский" в Москве. В строке основные параметры выделены жирным шрифтом.

Видно, что Z равен 16-ти, значит, блок 16-го уровня... По счету вообще-то уровень семнадцатый, но такова уж нумерация гугла, которая во всем начинается с нуля. Это легко проверить - строка вызова нулевого уровня, т.е. всего мира http://khm0.google.ru/kh/v=45&x=0&y=0&z=0

Обратим внимание, что номера первого блока также не первые, а нулевые, т.е. из порядковых номеров вычитается единица. Для экономии на вычислениях можно округлять номер блока не вверх, а вниз, применяя функцию Floor - это дает точно такой же эффект.

Рассмотрим остальные части строки вызова блоков: "v=39" обозначает версию массива гугл. Версии, как можно догадаться, постоянно обновляются, и нужно следить за их выпусками. Поиграйте с номерами версий, некоторым знатокам удается вызывать старые, архивные снимки. О новых выпусках не сообщается подробно, но известно, что иногда даже через месяц одна версия сменяется другой. Появляются новые детальные снимки Quick Bird на ранее "ландсатовские территории". Добавляются новые суб-метровые данные для уровней 19-22 на многие города Европы. Меняется также оформление снимков, приёмы их обработки: изображения становятся привлекательнее на всех уровнях. Но это уже лирика, вернемся к цифрам ;)

Первая часть строки, левее версии, http://khm0.google.ru/kh/... это, разумеется, адрес сервера и каталог, где расположены блоки. Этот адрес тоже может со временем меняться.

Итак, для получения снимков нужны номера блоков, которые уже понятно, как рассчитывать. Собственно, выше изложено абсолютно все, что нужно вставить в строку вызова блоков. Если вы знакомы с основами программирования, или хотя бы "на ты" с калькуляцией в таблицах, то несложно рассчитать номера многочисленных блоков в таблице и получить список. Скачать блоки можно по списку можно программой Reget, а склеить - программой Google Stitch или аналогичными мозаичными инструментами.

Снимки, снимки... карты!

Вcем известно, что кроме спутниковых изображений, гугл содержит еще и карты дорог, улиц, со станциями метро, остановками транспорта и т.п. Карта не такая уж бесполезная. Ну, по Москве несложно её и купить, а вот по другим городам, Европы например? Соблазнительно, что карта гугл покрывает сплошняком все цивилизованные просторы, включая сельские и горные края. В общем-то это тоже сплошной массив, как и космоснимочный. Просто есть обширные пустые или неподробные пространства, а есть "разрисованные" регионы. Мало того, массив карт есть отдельно для каждого уровня (всего их пока 18), и несмотря на свой "векторный" облик, эти массивы растровые. Нетрудно заметить при загрузке, что массивы точно так же состоят из блоков размеры 256 х 256 пиксел... Немного интуиции, и нас осенит, что с именами блоков проблем не будет. Проверить это несложно - подглядим строку вызова в момент загрузки, например, центра Парижа:

http://mt0.google.com/vt/v=w2.96&x=4149&y=2818&zoom=4

Что можно сказать? Сайт уже другой, но в том же домене. Версия пишется более дробно, это понятно. Далее идут опять же номера блоков. Проверка показывает, что нумерация точно такая же: начинается от левого верхнего угла и с нуля, не с единицы. Блок самого высокого уровня также имеет номера x=0 y=0 и тоже слева сверху, как принято на картинках.

http://mt0.google.com/vt/v=w2.96&x=0&y=0&z=0

Еще одна подсказка - после получения тайлов вы обнаружите, что блоки карты гугл имеют формат не JPEG, а PNG, так уж они хранятся на сайте. Учтите это, когда будете "сшивать" массив воедино.

Вот собственно и все, что можно сказать о вызове тайлов. Слишком много приходится считать в уме? Теперь много программ, которые автоматизируют процесс. Наиболее развитая на данный момент - TilesOnLine от MitrichTools. Она использует вышеописанный алгоритм, и за ее точность можно поручиться от GeoFAQ.

Другие картсервисы: как устроены космоснимки.ру

Ход прогресса доказывает живучесть принципов организации интернет-картографии, изложенных выше. Изучив их на примере Гугла, несложно понять любую другую систему. Яркий пример - российский картографический сервис "Космоснимки", созданный фирмой "Сканэкс" (после совместной карты с Яндексом). Посмотрим, как устроено их картографическое пространство, чем оно похоже на Гугл и чем отличается.

Сходства бросаются в глаза сразу: используется также меркаторская проекция. В результате пространство "изометрично" и это оказывается крайне удобным для ГИС и других приложений, как описано выше. Блоки также имеют размер 256 пикселов. Они тоже "открыты", то есть к ним можно обратиться как через интерфейс сайта, так и по отдельности, зная некий хитрый адрес. Также как и в гугле, блоки каждого следующего уровня в два раза отличаются от предыдущих охватом территории, притом, что их размер в пикселях не изменяется.

Размер всего мира по ширине на самом начальном нулевом уровне также составляет 256 пиксел. Блоки, словом, такие же, есть надежда, что и устройство карты аналогичное.

Весь мир нулевого уровня

Как же привязать блок "Космоснимков"? Рассмотрим строку вызова уже знакомого комплекса "Олимпийский" ;)

http://maps.kosmosnimki.ru/TileSender.ashx?ModeKey=tile&MapName=Kosmosnimki&...x=6849&y=12231&z=16

Параметр "z=" в самом конце - это уровень, "zoom", он начинается с нуля, как и в гугле. Сравнивая с блоком гугла, видим, что масштаб очень похож - получается, с проекцией мы не промахнулись. Параметры "x=" и "y=" - тоже номера блоков, но отсчитываются они не от верхнего левого угла всего массива, а от нуля координат в Гвинейском заливе. Однако контуры блока явно другие, и номера скорее всего, не такие как в гугле. Чтобы их расчитать по географическим координатам, не получится так запросто использовать вышеприведенные формулы, потому что они относились к проекции "Меркатор на сфере", а Сканекс применяет "Меркатор на WGS". Для разовой привязки проще будет подглядеть меркаторские WGS-координаты через ГИС. Для верхнего левого угла блока они будут равны 4188136 и 7479821 м. Как теперь перейти к пикселам? Нужно узнать разрешение массива на данном уровне.

Для этого внимательно рассмотрим WGS-84: размер большой полуоси эллипсоида, лежащей в плоскости экватора равен, как можно узнать из справочников, 6378137 м. По сути, это радиус экваториального круга. Вычисляя длину экватора, как простой окружности через 2*p*R, получаем 40075016.69 метров. Можно условно называть это шириной меркаторского мира. На картинке всего сканекс-мира, приведенной выше, она соответствует 256 пикселям. Соответственно разрешение самого крупного (опять же нулевого, если судить по строке вызова) уровня получается равным 156543 метров на пиксель, следующего уровня - в два раза меньше и т.п. Исходя из этого, разрешение 16-го уровня - 2.388657 м, и оно другое, чем в гугле - несколько больше. Это понятно - мы ведь взяли другой радиус сферы - то бишь эллипсоида... Точнее, всего лишь экваториальной окружности: в нашем случае, только она играет роль при расчете ;)

Зная разрешение в метрах на пиксел, делим меркаторские координаты на него и получаем количество пикселей, затем, поделив на 256 - узнаём номера блоков, словом, все примерно как в гугле. Ну а формат world-файла для ГИС давно известен, составляем его вручную для левого верхнего угла блока или массива блоков - неважно.

блок c геопривязкой

Конечно, можно рассчитать меркаторские координаты и самостоятельно, раздобыв формулу для эллипсоида, но это ежели вы сочиняете свой инструмент. А в ГИС привязать любой растровый массив можно и не зная координат вообще! Просто сочиняете world-файл, указывая только разрешение, и это дает вам верный масштаб. Далее сажаете растр лапой в нужное место, и дело в шляпе. По сути, меркаторские координаты нужны только для вызова блоков - для расчета их номеров.


В общем-то, это всё, что нужно знать, даже слишком. Тем более что в данный момент не одна программа работает с тайлами и дает точную привязку под ГИС. Особенности этих программ обсуждаются здесь. Но прошел тот энтузиазм первых дней интернет-картографии, когда увидеть свой дом из космоса, повесить на стену плакат своих путешествий удивляло и восторгало. Теперь с веб-картами работают все кому не лень, совершенствуясь с каждым днем, решая новые задачи и осваивая новые методы. Словом, продолжение в любом случае следует. Но какое?

Благодарности и ссылки

1. Wladimirych@yandex.ru: Глубочайшие благодарности автору удобнейшего средства Google Down для работы с Google Map, особенно за идею эффективной организации получения с помощью Reget. Программа Google Map Stitch до сих пор вполне пригодна для автономной склейки единой мозаики.

2. T.G.Z.: Весьма наглядное описание "Как устроен Google Maps", огромное спасибо. Исходные формулы были взяты именно оттуда (не без некоторого дополнения).

3. Вадиму Каминскому, Митричу и другим участникам дискуссии на форуме Dataplus.ru, вовремя подавшим ценные мысли и ссылки, за отработку "меркаторской" идеи, за неравнодушное отношение к теме вообще и за оппонирование в частностях, что безусловно было на пользу :)

4. Григорию Кувшинникову: Полное понимание проекции не сложилось бы без вовремя подброшенной им ссылки на полноценное описание проекционных преобразований. Это дало толчок математической части задачи, что дало возможность решить ее красиво и компактно.

5. Всем соратникам по борьбе с ArcView, с которыми вместе еще на заре ГИС удалось отладить работу с world-файлами и накопить на эту тему бесценный опыт.

6. Филу (Feel), чья недюжинная энергию в расковыривании алгоритма Космоснимков удачно сплелась с умением лаконично общаться на бейсике :)

Автор: Geologic

Статью можно обсудить здесь, на форуме GeoFAQ