Подключаем тайлы с retromap.ru в своё приложение

Решенные задачи, первая запись - описание решения.
Ответить
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3325
Зарегистрирован: 11 апр 2008, 21:09
Статьи: 33
Проекты: 9
Репутация: 495
Ваше звание: Author
Контактная информация:

Подключаем тайлы с retromap.ru в своё приложение

Сообщение Denis Rykov » 18 дек 2015, 23:37

В качестве эксперимента хотел подключить какую-нибудь карту из http://retromap.ru/ в QGIS через QuickMapServices. Однако сходу это не получилось. Стало интересно как там всё устроено. Судя по всему, авторы этого сервиса умышленно ввели ряд определённых ограничений, усложняющих возможность подключения тайлов в пользовательские приложения.

Во-первых, если вы попытаетесь скопировать URL какого-либо тайла, подсмотренный в консоли, то получите ошибку 403 Forbidden, например. Причина в том, что сервис парсит заголовок Referer и если его значение отлично от http://retromap.ru/m.php, то он отвечает 403 ошибкой. С этим вроде разобрался, поправив немного код QMS и подключив слой по схеме QuadKey, однако, вылезла проблема номер два.

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

Код: Выделить всё

http://www.hutun.ru/f19f53e/14194717/121311132.jpg
http://www.hutun.ru/f19f53e/14194717/FE3b37_1497006541.jpg
Первый тайл - это QuadKey, а второй - это судя по всему какой-то велосипед от авторов retromap.ru. Поковыряв немного код, было установлено, что так оно и есть - в зависимости от XYZ координат тайла по определённой формуле вычисляется имя тайла (при этом используется алгоритм хэширования md5).

Чтобы показать как оно работает - набросал небольшой пример подключения карты в Leaflet: пример. URL сервера, используемый в примере - это прокси, пересылающий запросы на http://www.map.host.ru и добавляющий нужный заголовок Referer (дроплет от DigitalOcean).

Как я уже писал - автор явно даёт понять, что он не хочет, чтобы его тайлы использовались в сторонних приложениях, чтобы запутать пользователя он даже JS-функции пишет кодами символов, пример взят отсюда:

Код: Выделить всё

document.write('<script language="JavaScript">' + stringer('}(rr+tvs+bfu+s)."qE=Fw"),6"1F>Fh"t(genceall.pqe(rf.ip; "n"r=uvt=efr,}q;=)wh trganve;lq. rn-r6u1t,e0r()r"tFs"b=u!s).0"(0t0A0r0a0h0c".=pv(;f)i6;1q-+hpt gnnreult.eqr,)02(=r!tgsnbiudso.cqn=ef.{])m6[1t>shitlg_npealm.(qf(if;iq; )n)r1u+t)e)r1)-0h=t=ggnneild.owc(nteA.r]amh[ct.swi(lr_epbammu(Nf(i*;m)*q0,1m+()xwi(freerbpm_umN=(pg nriarvt{S)=qr, mr(atvt;a)e6w1k,c6u1b- hntogintecln.uqf') + '</scr'+'ipt>');
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3325
Зарегистрирован: 11 апр 2008, 21:09
Статьи: 33
Проекты: 9
Репутация: 495
Ваше звание: Author
Контактная информация:

Re: Подключаем тайлы с retromap.ru в своё приложение

Сообщение Denis Rykov » 23 янв 2016, 08:33

Насколько я понял админ retromap.ru добавил IP моего дроплета в блэклист, поэтому карта по ссылке выше не отображается (403 ошибка при запросе тайлов). Так что, если хотите получить доступ к тайлам (пока вас также не залочат), то можете поднять свой собственный прокси. Пример простейшего конфига для nginx:

Код: Выделить всё

server {
  listen 8080;
  access_log /var/log/nginx/retromap.log;

  location / {
    proxy_pass "http://www.map.host.ru";
    proxy_set_header Referer "http://retromap.ru/m.php";
  }
}
Spatial is now, more than ever, just another column- The Geometry Column.

Ответить

Вернуться в «Рецепты»