Картографические заморочки Степан «Step» Ильин (step@gameland.ru) Хакер, номер #108, стр. 108-042-1 Маленькие секреты большого сервиса Google MapsЕсли бы несколько лет назад мне кто-нибудь сказал, что я смогу рассмотреть спутниковую антенну на крыше своего дома прямо из инета, я бы рассмеялся и, скорее всего, даже поспорил на кругленькую сумму, что этого не может быть. Однако время идет, и к сервисам, подобным Google Earth, все не только привыкли, но и вообще воспринимают их как должное. Только вот использование их зачастую ограничивается игрой «Найди свой дом на карте». И только! Да разве ж можно оставлять такое сокровище без дела? Не знаю, как тебя, а меня лично всегда напрягало то, что Google Maps - это чисто онлайновый сервис. Да, программа Google Earth умеет кэшировать просматриваемые участки карт, только толку от этого мало. Не будешь же вручную просматривать весь город квадрат за квадратом, чтобы программа таки сохранила оффлайн-копию карты. Конечно, нет! К тому же у программы есть другие серьезные недостатки:
Этот список можно было бы продолжить, но вместо поиска недостатков я решил заняться изучением внутренностей сервиса Google Maps. Через некоторое время пришло понимание общих принципов работы и стало ясно, что написать программу, которая могла бы сама в автоматическом режиме скачать квадрат карты с заданными координатами, не так сложно. Но, прежде чем браться за кодинг, я решил сначала поискать готовые варианты. И не прогадал. Их оказалось аж целых три! Автоматическая закачка картПервой программой, которую по иронии судьбы отыскал сам же Google, оказалась Earth Slicer. То, что когда-то начиналось с задумки просто автоматической закачки карт Google, стало чуть ли не полноценной навигационной системой. Не без ограничений, конечно, но в то же время вполне работоспособной. Что она умеет? Ну конечно же закачивать карты. Причем быстро, в несколько потоков и, что важно, с разных зеркал (их у Google, естественно, несколько). При этом процесс закачки символично обозначен на экране: блоки, которые уже готовы, и которые только предстоит закачать наглядно выделены. В общем, не прошло и нескольких минут, как я выкачал огромный квадрат вокруг нашего офиса с максимальной детализацией. Спасибо провайдеру: 1-2 Мб в секунду льет практически стабильно. В принципе, можно было остановиться и на этом, довольствуясь результатом и по сути достигнутой целью. Но вот так заканчивать эксперимент не хотелось. Если есть карта и эта карта максимально приближена к действительности, то почему бы не использовать ее в связке с GPS? Мы уже проделывали нечто подобное в статье «5 шагов навстречу GPS», но использовали при этом онлайн-сервис. А как бы привязать карту к координатам и использовать на ноутбуке или КПК без подключенного интернета? Очень просто, если вспомнить о существовании утилиты Ozi Explorer. О том, как привязать закачанную карту к реальным координатам, читай во врезке. На сайте программы можно найти плагины, например, для автодокачки недостающих блоков, а помимо этого альфа-вариант второй версии программы, в которой существенно переработан интерфейс. Наши разработкиGoogleMapViewer (или сокращенно GoogleMV) — это еще одна подобная утилита от отечественного разработчика, которая прекрасно умеет склеивать изображения любого размера и сохранять их в jpg-формате. Опять же большой плюс заключается в функции привязки реальных координат вкупе с работой с Ozi Explorer. Работать с программой очень удобно, поскольку закачка, подобно Google Earth, осуществляется с фоновом режиме и в этот момент можно искать другие области для закачки, изменяя зону просмотра. Чтобы получить готовую карту, не надо вводить какие-либо координаты и вообще как-либо морочиться, достаточно просто выделить нужную область на карте. Однако после непродолжительной работы с GoogleMV выяснилась одна ее неприятная особенность. Несмотря на то что кэш программы неограничен, она не учитывает важную деталь, а именно то, что у файловой системы есть ограничения по количеству файлов. Офисный компьютер, где часть дисков до сих пор находится на FAT, начал сходить с ума. Быстро найденная альтернатива в лице GoogleV с этой проблемой успешно справилась. Кроме того, тулза удивила поддержкой ключевых точек (waypoints) и треков (tracks) самых разных форматов. GoogleV также лихо прокладывает маршруты и вообще оставляет только самые позитивные впечатлений. Хитрая система для хранения карт предполагает, что изображения содержаться в больших файлах. Такие файлы могут содержать множество единичных изображений, и ими удобно пользоваться для того, чтобы обмениваться выкачанными наборами или переносить с одного компьютера на другой. Маленькие хитростиНекоторое время я все же елозил в Google Earth, вручную кэшируя нужные участки карты. Закачивать их заново не хотелось, поэтому возник вполне резонный вопрос: а как бы этот кэш оттуда вытащить и превратить в один jpg-файл? Для этого нам понадобится следующее приложение: http://google-earth.narod.ru/download/GE_JPG_extractor.7z. Далее нужно открыть файл, который расположен здесь: C:\Documents and Settings\ИМЯ_ТЕКУЩЕГО_ПОЛЬЗОВАТЕЛЯ\Local Settings\Application Data\Google\GoogleEarth\dbCache.dat Поскольку файловая система не предназначена для хранения в одной папке сотен тысяч файлов, они складываются во вложенные папки так, чтобы в каждой папке было не более 1-2 тысяч файлов. Поскольку программа не умеет различать, какие данные новые, а какие старые, файлы с одинаковыми именами будут пересекаться, и в итоге в кэше останется картинка, которая попала в него последней). Пока эти файлы мало приспособлены к автоматической обработке другими программами из-за особенностей составления имени. Имена там такие, какими они были при получении из интернета. Но их можно склеить, написав простенькую программу на C#: const int imagesize = 256; // можно 257 - тогда будет с сеткой static void Main(string[] args) { int t = Convert.ToInt32(args[0]), l = Convert.ToInt32(args[1]), h = Convert.ToInt32(args[2]), w = Convert.ToInt32(args[3]); Image img = new Bitmap(w * imagesize - 1, h * imagesize - 1, System.Drawing.Imaging.PixelFormat.Format32bppArgb); Graphics g = Graphics.FromImage(img); g.Clear(Color.FromArgb(228,227,223)); for (int i = 0; i < w; i++) for (int j = 0; j < h; j++) { String fn_jpg = генерим имя спутника; Try { Image ij = new Bitmap(fn_jpg); g.DrawImage(ij, i * imagesize, j * imagesize); } catch (System.Exception ex) { } String fn_png = генерим имя карты; Try { Image ip = new Bitmap(fn_png); g.DrawImage(ip, i * imagesize, j * imagesize); } catch (System.Exception ex) { } } img.Save("имя.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); } Примечательно, что можно извлечь файлы для использования в программе GoogleMV. В этом случае достаточно лишь поставить флажок «GoogleMV (имена файлов 'qrst')». Готово! Первая версия программы Google Earth разработана вовсе не Google, а компанией Keyhole, Inc.. Гугл приобрел ее в 2004 году. В версии 4.2 появилась технология Google Sky, позволяющая рассматривать звездное небо. Как узнать, когда были сделаны последние снимки и с каким разрешением? На сайте http://bbs.keyhole.com/ubb/postlist.php/Cat/0/Board/latest/page/0 периодически появляется информация о том, какая область и с каким разрешением был отснята. В частности, 31 марта был обновлен Лас-Вегас в США; разрешение 3 дюйма на пиксель, это 76 мм на пиксель. Невероятно, но факт. Есть ли еще способ узнать дату съемки фрагмента? Есть!
Пасхальное яйцоКак и во многих других солидных продуктах, в Google Earth есть пасхальное яйцо. Причем очень прикольное - настоящий авиасимулятор. Для запуска игры необходимо одновременно нажать клавиши <Ctrl>, <Alt> и <А>. Перед тобой появится специальное окошко, в котором можно выбрать самолет. Пока пользователям доступны всего две модели самолетов: F16 Viper или SR22. Затем стоит ознакомиться со списком клавиш управления. После этого разрешается взлетать. Игра не была анонсирована, и о ее существовании не говорится в документации. WWW
DVDТе программы, которые нам разрешили выложить, ты сможешь найти на нашем DVD. |