Online maps pack
На главную | Полезные статьи | Скачать карты | Поддержать проект |
Чтобы приложения для навигации могли на лету подгружать из интернета нужные участки карты нужно хранить файлы карты особым образом. Карту разделяют на небольшие кусочки (обычно, это изображения формата PNG размера 256x256 px) и хранят их на специальных серверах. При этом, названия этих файлов (и папок, в которых они лежат) обычно являются числами - координатами, которым соответствует то или иное изображение. Например, это может выглядеть так:
www.funmap.com / 10 / 200 / 115.png
Генерация подобного адреса навигационных приложениях происходит в два шага:
1 - Навигатор загружает текстовый файл с “заготовкой” адреса.
www.funmap.com / Z / X / Y.png
2 - Навигатор подставляет на место букв XYZ координаты кусочка карты, который нужно отобразить на экране.
www.funmap.com / 10 / 200 / 115.png
Обычно, чтобы подключить любую другую карту достаточно создать еще один файл-заготовку с новым адресом и буквами XYZ на требуемых местах.
www.Another-map.org/satellite / X / Y / Z.png
И в большинстве случаев, навигатор без проблем заменит XYZ на требуемые числа и карта будет загружаться. Большинство сайтов с дополнительными источниками карт для того или иного навигатора именно такие файлики и предлагают.
Увы, но бывают исключения в виде “сложных” карт. К примеру, на некоторых серверах для нумерации файлов может использоваться другая система координат. И чтобы загруженный кусок карты соответствовал требуемому месту, числа XYZ нужно прогнать через ряд математических преобразований. (обозначу их, как XYZ во второй проекции)
www.funmap.com / X2 / Y2 / Z2.png
А на некоторых серверах в адресах используются дополнительные числа. Например, все файлы могут быть разделены на подпапки по 1000 файлов в каждой. Тогда надо будет вычислить эти два дополнительные числа.
www.funmap.com / Folder_1 / X / Folder_2 / Y / Z.png
К сожалению, навигационные приложения не могут выполнять многие из этих дополнительных вычислений. А значит, чтобы не ограничивать себя в выборе карт, которые можно подключить к своему навигатору, потребуется дополнительная утилита, которая выполнит все те задачи, с которыми не сможет справится мобильный навигатор.
Как уже говорилось, AnyGIS - это серверное приложение. В тех случаях, когда не удается подключить навигатор к какому-либо источнику карт напрямую…
Навигатор -> funmap.com/ X2 / Y2 / Z2
… можно сделать это через дополнительное звено: через AnyGIS.
Навигатор -> anygis.com/ funmap / X1 / Y1 / Z1 -> funmap.com/ X2 / Y2 / Z2
Навигатор может обращаться к AnyGIS со стандартными XYZ. AnyGIS проведет все необходимые преобразования и сформирует нужный URL-адрес. Затем он скачает с него файл с кусочком карты и отошлет этот файл обратно на навигатор (или же просто сделает редирект). В результате, на смартфоне будет отображаться карта, подключиться к которой ранее не представлялось возможным.
Помимо этого AnyGIS может осуществлять несложную обработку изображений на лету. Например, он может скачать несколько слоев для многослойных карт, “склеить” их в одно изображение и отослать его на навигатор. Такая функция может пригодиться для навигаторов, которые не умеют самостоятельно работать со слоями.
Кроме того, AnyGIS умеет делать несложные преобразования карт в разных проекциях. А точнее, пока только одно: сделать подгонку карт из проекции WGS84 (Яндекс карты, Космоснимки) в стандартную проекцию Web Mercator. Это позволит подключить Яндекс карты к навигаторам, которые не могут сами осуществить подобные преобразования. Например к Guru Maps.
Стоит заметить, что в целях ускорения быстродействия эта подгонка происходит по упрощенной схеме. А именно, с помощью обычного смещения карты. Технически, это происходит следующим образом. Допустим, требуется получить кусок карты для этого места. (На изображении - эталон - кусок карты в стандартной проекции).
Для начала, вычисляются координаты четырех ближайших к требуемому месту кусочков WGS84 карты. Все четыре кусочка загружаются и “склеиваются” в один большой квадрат.
Вычисляется, на какое расстояние требуется “сместить” новую карту. На большом квадрате делаются соответствующие отступы и вырезается кусок стандартного размера.
Получаем довольно похожий кусочек карты на то, что требуется. В принципе, для большинства задач такой грубой подгонки будет вполне достаточно. Однако стоит отметить, что небольшие расхождения все-таки будут присутствовать. Особенно они будут заметны ближе к полюсам.
Кроме того, на то, чтобы “отфотошопить” карту на лету, потребуется некоторое время. То есть, карта с подобными преобразованиями будет загружаться не столь быстро, как остальные карты без каких-либо обработок.
Ну, и последний режим, в котором может работать AnyGIS - это поиск наилучшего варианта карты для данной местности. Особенно это будет актуально для растровых (грубо говоря, отсканированных) карт, которые покрывают не всю планету, а только какой-нибудь небольшой кусок местности.
Для этого формируется список карт, отсортированных в порядке их приоритета. Сначала AnyGIS проверяет первую карту: есть ли на сервере с ней файл с интересующим нас кусочком местности? Если нет, то проверяется вторая карта и так далее по списку.
Подобный режим позволяет склеить мелкие разрозненные кусочки с разных серверов в цельную неразрывную карту, которой сравнительно удобно пользоваться. Не требуется вручную переключаться между десятком различных карт, пока не отыщется хотя бы одна, которая будет пригодна для этой местности.
В качестве примера подобной карты вы можете ознакомиться с набором карт для туризма по России - RusOutdoor Maps.
Некоторые сайты с картами отображают информацию только для авторизированных пользователей. Среди них, известная многим Strava Heatmap. Если просматривать эту карту через браузер компьютера или смартфона, то никаких проблем не возникает: вводим логин и пароль, жмем на кнопку войти и сайт показывает карту.
Увы, но навигатор – это не браузер. Он может лишь получать прямой доступ к тайлам по ссылке. Никаких данных на html страницу он ввести не сможет. Что ж, можно ему в этом помочь. Для этого всего-то то нужно научить наш сервер вести себя как браузер дистанционным управлением (Headless Browser).
Когда навигатор подключится к нашему серверу, то сервер зайдет на сайт с картой, введет туда мой личный логин и пароль, загрузит требуемое изображение, а затем перешлет его обратно к навигатору пользователя. Как видите, все довольно просто. Хотя и требует некоторого дополнительного времени на работу этого промежуточного компонента. Более подробно о технической реализации данного скрипта вы можете прочитать в моей статье на Habr.com.
А еще есть сайты, которые используют векторные карты. Они отрисовывают их в реальном времени силами браузера. Так что у них попросту нет растровых тайлов, которые мог бы скачать навигатор смартфона. Чтобы иметь возможность подключаться и к таким картам потребовалось разработать специальную утилиту.
По сути, это еще один браузер с дистанционным управлением. По запросу навигатора он заходит на сайт с картой, отматывает ее на нужное место, делает скриншот этого места и отсылает его обратно на навигатор. Как вы понимаете, грузятся такие карты более медленно, зато теперь в навигаторе есть карты, к которым до этого вообще нельзя было подключиться.
Кстати, одной из карт, которую теперь можно отображать, стала интерактивная карта с сайта OverpassTurbo.eu. В этой статье написал инструкцию, как сделать так, чтобы навигатор смог показывать карту с сайта Overpass, на которой будут отображаться результаты вашего скрипта. На скриншоте ниже - мой скрипт подкрашивающий гравийные дорожки в парках.