Hatred's Log Place

DON'T PANIC!

Nov 13, 2019 - 4 minute read - туризм

ГГЦ карты для QMapShack в виде TMS (Tile Map Service)

QMapShack умеет работать с сетевыми картами, которые представлены в виде тайлов с определённым соглашением о вызове. Что бы работать с подобными сервисами нужно создать файл-описание с расширением .tms. Описание формата можно почитать здесь.

До недавнего времени я обходился в основном картами OpenCycleMap, TMS файл для которых идёт вместе с QMS. А для нужных районов уже искал/скачивал листы карт ГГЦ (в народе: “новый” генштаб) и делал им обвязку в виде .vrt файла (такие карты содержать описание нужных преобразований, не затрагивая самих исходников карты, тем самым можно делать “обрезку карт” и они понимаются всем, что использует GDAL).

Но это дело малость меня достало и захотелось быстро под рукой иметь и ГГЦ карты. Естественно, при условии наличия доступа к сети и доступности сервисов.

С чего начать?

Первым делом нужно найти сервисы, которые предоставляют доступ к картам ГГЦ по спецификации TMS. Поиск в интернете дал несколько ресурсов:

  • https://melda.ru/locus/maps/
    • это первый найденный ресурс. Адаптируется просто но доступ крайне медленный. Подробно рассматривать не буду.
  • https://anygis.ru
    • TMS агрегатор, предоставляет как доступ к локальным картам, так и может вернуть ссылку на другой TMS ресурс. Собственно его и взял за основу, он же навёл на:
  • https://nakarte.me
    • помимо доступа через TMS позволяет ещё и просто удобно смотреть карту, плюс экспорт выбранной области в JNX, и загрузку GPX с отображением на карте, а помимо этого:

AnyGIS.ru

Сначала смотрим на API:

Обращаем внимание на обозначения X, Y, Z, что это:

X ,Y - это номера тайлов в стандартной проекции Web Mercator. Z - уровень приближения для нее же. Иными словами, это - те же самые значения, что используются для получения карт OpenStreetMaps. Так же, вместо номеров тайлов можно указать координаты в десятичном формате:

Host / MapName / Longitude / Latitude / Z
https://anygis.ru/api/v1/Wikimapia/56.062293/37.708244/10

Потом смотрим на список карт:

Таблица нам даёт такие полезные данные, как:

  1. Пример ссылки на тайл, там легко достаточно понять, где X, где Y, а где Z.
  2. Имя самой карты (часть URL).
  3. Название, ну чисто так, что бы было.
  4. И, конечно, Max zoom level - максимальный уровень приближения на котором отдаётся карта.

Карты которые нам интересны:

  • Combo_Best_GGC - автоматически выбирает масштаб карты для выбранного уровня приближения. Имхо - не всегда удобно.
  • И все Locals_Ggc_XXXXX, кроме суффикса _jpg, а вариант с суффиксом _fast или без— на собственный выбор. Нам более интересен этот вариант, так как можем поиграться с уровнями приближения, если нужно.

Сведём в табличку URL и максимальный уровень приближения (минимальный всегда 0):

Scale URL Max zoom level
1:25000 https://anygis.ru/api/v1/Locals_Ggc_00250/X/Y/Z 15
1:50000 https://anygis.ru/api/v1/Locals_Ggc_00500/X/Y/Z 14
1:100000 https://anygis.ru/api/v1/Locals_Ggc_01000/X/Y/Z 13
1:200000 https://anygis.ru/api/v1/Locals_Ggc_02000/Y/X/Z 12

Сам TMS имеет вид:

<TMS>
 <Title>OSM D-Land TK 50</Title>
 <MinZoomLevel>3</MinZoomLevel>
 <MaxZoomLevel>18</MaxZoomLevel>
 <Layer idx="0">
  <Title>Open Topo Map</Title>
  <ServerUrl>http://a.tile.opentopomap.org/%1/%2/%3.png</ServerUrl>
  <MinZoomLevel>3</MinZoomLevel>
  <MaxZoomLevel>11</MaxZoomLevel>
 </Layer>
 <Layer idx="1">
  <Title>Trails</Title>
  <ServerUrl>http://tile.waymarkedtrails.org/hiking/%1/%2/%3.png</ServerUrl>
  <MinZoomLevel>3</MinZoomLevel>
  <MaxZoomLevel>9</MaxZoomLevel>
 </Layer>
 <RawHeader>
   <Value name="User-Agent">Whatever</Value>
 </RawHeader>
 <Copyright>Map data: (c) OpenStreetMap contributors, ODbL | Rendering: (c) OpenTopoMap, CC-BY-SA | Trails by tile.waymarkedtrails.org </Copyright>
</TMS>

Здесь:

  • %1Z
  • %2X
  • %3Y

Слои (Layers) позволяют задать разные источники данных и уровни масштабирования, на которых они отображаются. Порядок имеет значение, точнее не совсем порядок, а значение idx=XXX: чем оно выше тем более приоритетна карта и если она присутствует на данном уровне масштабирования, именно она будет отображена. Почему более мелкие масштабы приоритетны? А что бы не мельчить на малых значениях Zoom Level. Более того, в интерфейсе QMS вы сможете включать/выключать отдельные слои. Здесь оказывается полезен и перехлёст слоёв:

GGC map in QMapShack via TMS

GGC map in QMapShack via TMS

Собираем всё вместе и получаем файл GGC_AnyGIS.ru.tms с содержимым:

<TMS>
 <Title>ГосГисЦентр: AnyGIS.ru/NaKarte.me, все масштабы (частичное покрытие)</Title>
 <MinZoomLevel>0</MinZoomLevel>
 <MaxZoomLevel>15</MaxZoomLevel>
 <Layer idx="0">
  <Title>ГосГисЦентр 250 м</Title>
  <ServerUrl>https://anygis.ru/api/v1/Locals_Ggc_00250/%2/%3/%1</ServerUrl>
  <MinZoomLevel>0</MinZoomLevel>
  <MaxZoomLevel>15</MaxZoomLevel>
 </Layer>
 <Layer idx="1">
  <Title>ГосГисЦентр 500 м</Title>
  <ServerUrl>https://anygis.ru/api/v1/Locals_Ggc_00500/%2/%3/%1</ServerUrl>
  <MinZoomLevel>0</MinZoomLevel>
  <MaxZoomLevel>14</MaxZoomLevel>
 </Layer>
 <Layer idx="2">
  <Title>ГосГисЦентр 1000 м</Title>
  <ServerUrl>https://anygis.ru/api/v1/Locals_Ggc_01000/%2/%3/%1</ServerUrl>
  <MinZoomLevel>0</MinZoomLevel>
  <MaxZoomLevel>13</MaxZoomLevel>
 </Layer>
 <Layer idx="3">
  <Title>ГосГисЦентр 2000 м</Title>
  <ServerUrl>https://anygis.ru/api/v1/Locals_Ggc_02000/%2/%3/%1</ServerUrl>
  <MinZoomLevel>0</MinZoomLevel>
  <MaxZoomLevel>12</MaxZoomLevel>
 </Layer>
 <Copyright>(c) AnyGIS, (c) NaKarte.me, (C) ГГЦ</Copyright>
</TMS>

Помещаем этот файл в любой удобной директории и прописываем путь к ней в настройках QMS (Файл → Настройка пути к картам). После чего карту в списке включаем и… Profit!

Что ещё?

Если вдруг что-то недогружается: правой кнопкой мыши по карте и выбрать пункт “Перезагрузить карты”.

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

Ещё, из замеченных минусов: много где нет километровок, поэтому переход от 500м к 2км не такой гладкий.

Ну и меня не оставляет идея воспользоваться файлами NaKarte.me для создания локального TMS сервера.