Tile Map Service Specification: различия между версиями

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
мНет описания правки
 
(не показано 15 промежуточных версий 3 участников)
Строка 1: Строка 1:
{{Статья|Черновик}}
{{Статья|Опубликована|../docs/tms-specification-ru}}
{{Аннотация|Перевод [http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification Tile Map Service Specification]}}


Данный документ является продуктом работы свободного сообщества участников, заинтересованных в создании клиент-серверного решения, предназначенного для работы с со стеком изображений различного разрешения. Он является своего рода руководством для реализации соответствующего программного обеспечения. Этот документ не является "официальным стандартом" и не заявлен OSGeo как официальный проект или рабочий продукт Фонда.
{{Аннотация|Перевод [http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification Tile Map Service Specification].}}
 
'''Перевёл: [http://gis-lab.info/forum/memberlist.php?mode=viewprofile&u=6901 Денис Рыков].'''
 
Данный документ является результатом работы свободного сообщества участников, заинтересованных в создании клиент-серверного решения, предназначенного для работы со стеком изображений различного разрешения. Он является своего рода руководством для создания соответствующего программного обеспечения. Этот документ не является "официальным стандартом" и не заявлен OSGeo как официальный проект или рабочий продукт Фонда.


Версия данного документа "1.0" и он больше не будет редактироваться. Изменения будут обсуждаться по адресу [http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification_Change_Requests Tile Map Service Specification Change Requests].
Версия данного документа "1.0" и он больше не будет редактироваться. Изменения будут обсуждаться по адресу [http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification_Change_Requests Tile Map Service Specification Change Requests].
Строка 22: Строка 25:
Tiled Web Service предоставляет доступ к ресурсам, в частности к картографическим тайлам, отрендеренным на определённом масштабном уровне. Доступ к этим ресурсам осуществляется посредством "REST" интерфейса. Клиент может получить доступ, например, к ресурсу, описывающему доступные карты, к ресурсу, содержащему описание доступных масштабных уровней карты, и, как уже было отмечено выше, непосредственно к самим тайлам.
Tiled Web Service предоставляет доступ к ресурсам, в частности к картографическим тайлам, отрендеренным на определённом масштабном уровне. Доступ к этим ресурсам осуществляется посредством "REST" интерфейса. Клиент может получить доступ, например, к ресурсу, описывающему доступные карты, к ресурсу, содержащему описание доступных масштабных уровней карты, и, как уже было отмечено выше, непосредственно к самим тайлам.


Каждый ресурс содержит описательную информацию и ссылки на ресурсы следующего уровня. Отметим, что поскольку для доступа к ресурсам используются
Каждый ресурс содержит описательную информацию и ссылки на ресурсы следующего уровня. Отметим, что поскольку для доступа к ресурсам используются URL, может показаться, что они имеют некоторое значение (например, ресурс для версии сервиса 1.0.0 содержит подстроку "1.0.0" в идентифицирующем его URL), но это не так - формат URL ''произвольный''.
URL, может показаться, что они имеют некоторое значение (например, ресурс для версии сервиса 1.0.0 содержит подстроку "1.0.0" в идентифицирующем его URL), но это не так - формат URL ''произвольный''.


Существует только одно требование, заключающееся в том, что ресурс должен быть идентифицируем по URL (например, <nowiki>http://tms.osgeo.org/1.0.0/</nowiki> может выглядеть как <nowiki>http://tms.osgeo.org/onepointzeropointzero</nowiki> или <nowiki>http://tms.osgeo.org/flipper.xml</nowiki>, то есть принимать любое значение, указанное в элементе <TileMapService> корневого ресурса).
Существует только одно требование, заключающееся в том, что ресурс должен быть идентифицируем по URL (например, <nowiki>http://tms.osgeo.org/1.0.0/</nowiki> может выглядеть как <nowiki>http://tms.osgeo.org/onepointzeropointzero</nowiki> или <nowiki>http://tms.osgeo.org/flipper.xml</nowiki>, то есть принимать любое значение, указанное в элементе <TileMapService> корневого ресурса).
Строка 68: Строка 70:
=== Ресурс TileMapService (TileMapService Resource) ===
=== Ресурс TileMapService (TileMapService Resource) ===


Ресурс <TileMapService> предоставляет описание сервиса, а также список доступных в рамках данного сервиса карт <TileMaps>. Опциональные элементы
Ресурс <TileMapService> предоставляет описание сервиса, а также список доступных в рамках данного сервиса карт <TileMaps>. Опциональные элементы ресурса в нижеприведённых примерах отмечены символом "|", остальные элементы являются обязательными.
ресурса в нижеприведённых примерах отмечены символом "|", остальные элементы являются обязательными.


Запрос:
Запрос:
Строка 161: Строка 162:
</pre>
</pre>


=== Ресурс TileMap Resource (TileMap Resource) ===
=== Ресурс TileMap (TileMap Resource) ===


Ресурс <TileMap> (обычно) представляет собой описание законченной карты. Однако иногда <TileMap> могут быть использованы как отдельные слои и результирующая карта на клиенте будет выглядеть как комбинация таких слоёв.
Ресурс <TileMap> (обычно) представляет собой описание законченной карты. Однако иногда <TileMap> могут быть использованы как отдельные слои и результирующая карта на клиенте будет выглядеть как комбинация таких слоёв.
Строка 343: Строка 344:
</pre>
</pre>


=== Ресурс Tile Resources ===
=== Ресурс Tile (Tile Resources) ===


Положение начала координат <TileMap> задаётся в единицах измерения, используемых системой координат карты. x-координата тайлов возрастасет в том же направлении, что и координата x исходных данных в выбранной системе координат, y-координата тайлов также изменяется в том же направлении, что и y-координата исходных данных.
Положение начала координат <TileMap> задаётся в единицах измерения, используемых системой координат карты. x-координата тайлов возрастасет в том же направлении, что и координата x исходных данных в выбранной системе координат, y-координата тайлов также изменяется в том же направлении, что и y-координата исходных данных.
Строка 371: Строка 372:
</pre>
</pre>


=== TileMap Diagram ===
=== Диаграмма TileMap ===


[[Файл:Tms.png]]
[[Файл:Tms.png]]
Строка 406: Строка 407:
* Во-вторых, база данных EPSG не включает в себя все наиболее распространенные системы координат. Существует множество местных систем координат, которые не отражены в данной базе, хотя EPSG принимает необходимые усилия по их включению. Кроме того, EPSG не содержит и ряд очень распространенных глобальных и используемых для отображения протяженных территорий систем координат предположительно по политическим соображениям. Например, не существует EPSG идентификатора для проекции Меркатора на весь мир или Альберса для Северной Америки.
* Во-вторых, база данных EPSG не включает в себя все наиболее распространенные системы координат. Существует множество местных систем координат, которые не отражены в данной базе, хотя EPSG принимает необходимые усилия по их включению. Кроме того, EPSG не содержит и ряд очень распространенных глобальных и используемых для отображения протяженных территорий систем координат предположительно по политическим соображениям. Например, не существует EPSG идентификатора для проекции Меркатора на весь мир или Альберса для Северной Америки.


'''The issues will be dealt with by fiat in this specification, matching implementation practice rather than following the database definition:'''
Эти проблемы просто обойдём принятием следующей спецификации, соответствующей скорее существующей практике применения, чем определению базы данных (EPSG):


* Для всех географических систем координат, представленных в базе данных EPSG, в рамках данной спецификации порядок координат предполагается следующий - долгота/широта, единицы измерения - десятичные градусы.
* Для всех географических систем координат, представленных в базе данных EPSG, в рамках данной спецификации порядок координат предполагается следующий - долгота/широта, единицы измерения - десятичные градусы.
Строка 415: Строка 416:
** '''OSGEO:42304''' PROJCS["NAD83 / NRCan LCC Canada", GEOGCS["NAD83", DATUM["North_American_Datum_1983", SPHEROID["GRS_1980",6378137,298.257222101], TOWGS84[0,0,0]], PRIMEM["Greenwich",0], UNIT["Decimal_Degree",0.0174532925199433]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["central_meridian",-95.0], PARAMETER["latitude_of_origin",49.0], PARAMETER["standard_parallel_1",49.0], PARAMETER["standard_parallel_2",77.0], PARAMETER["false_easting",0.0], PARAMETER["false_northing",0.0], UNIT["Meter",1]]
** '''OSGEO:42304''' PROJCS["NAD83 / NRCan LCC Canada", GEOGCS["NAD83", DATUM["North_American_Datum_1983", SPHEROID["GRS_1980",6378137,298.257222101], TOWGS84[0,0,0]], PRIMEM["Greenwich",0], UNIT["Decimal_Degree",0.0174532925199433]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["central_meridian",-95.0], PARAMETER["latitude_of_origin",49.0], PARAMETER["standard_parallel_1",49.0], PARAMETER["standard_parallel_2",77.0], PARAMETER["false_easting",0.0], PARAMETER["false_northing",0.0], UNIT["Meter",1]]


=== Максимизация кэшируемости ===
=== Максимизация кэширования ===


Тайловые карты обычно используются в качестве подложек и содержат информацию об относительно редко изменяющихся данных. Кроме того, они очень велики по объёму - количество тайлов может достигать нескольких миллионов. Учитывая эти факты, можно сделать вывод о том, что активное использование стратегии кэширования позволит оптимизировать производительность тайловых сервисов.
Тайловые карты обычно используются в качестве подложек и содержат информацию об относительно редко изменяющихся данных. Кроме того, они очень велики по объёму - количество тайлов может достигать нескольких миллионов. Учитывая эти факты, можно сделать вывод о том, что активное использование стратегии кэширования позволит оптимизировать производительность тайловых сервисов.
Строка 439: Строка 440:
<pre>header('Expires: ' . gmdate('D, j M Y H:i:s T', time() + 7 * 24 * 60 * 60));  // текущее время + 7 дней в секундах</pre>
<pre>header('Expires: ' . gmdate('D, j M Y H:i:s T', time() + 7 * 24 * 60 * 60));  // текущее время + 7 дней в секундах</pre>


Для HTTP 1.1 используйте заголовок "Cache-control". В отличие от старого "Expires", "Cache-control" не имеет привязку ко времени, а просто указывается период обновления данных, что позволяет решить проблему синхронизации времени, возникающую при использовании "Expires".
Для HTTP 1.1 используйте заголовок "Cache-control". В отличие от старого "Expires", "Cache-control" не имеет привязку ко времени, в этом случае просто указывается период обновления данных, что позволяет решить проблему синхронизации времени, возникающую при использовании "Expires".


<pre>
<pre>
Строка 448: Строка 449:
Информацию о заголовках, используемых для кэширования в HTTP 1.1, можно найти в [http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9 W3.org specification].
Информацию о заголовках, используемых для кэширования в HTTP 1.1, можно найти в [http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9 W3.org specification].


=== Implementing Cacheability ===
=== Реализация кэширования ===
 
Вы можете либо надеяться но то, что где-то кто-то на просторах Интернета закэширует ваши данные согласно переданным заголовкам кэширования, либо создать собственный кэш. Если вы используете Веб-сервер Apache 2.0, то это сделать очень просто.
 
Добавьте директиву mod_cache в определение вашего виртуального хоста <VirtualHost>:
 
<pre>
<IfModule mod_disk_cache.c>
CacheRoot /tmp/apache-cache
CacheSize 1024000
CacheEnable disk /cgi-bin/tms
CacheDirLevels 5
CacheDirLength 3
</IfModule>
</pre>
 
Это пример создания дискового кэша, который вы вероятнее всего будете использовать для своего TMS. Обратите внимание, как директива CacheEnable позволяет очень точно контролировать содержимое, которое вы собираетесь кэшировать. В данном примере будут кэшироваться только данные TMS сервиса и больше ничего. Вы можете настроить кэширование только конкретной карты внутри сервиса или даже отдельного масштабного уровня карты.
 
=== URL, являющиеся скриптами ===
 
В больших реализациях данной TMS-спецификации данные, обычно, не сгенерированы заранее, а создаются по запросу некоторым бэкенд-сервисом. Это означает, что URL, которые могут выглядеть как статические на самом деле являются динамическими.
 
[http://hoohoo.ncsa.uiuc.edu/cgi/env.html Спецификация CGI] позволяет реализовывать подобные сервисы довольно легко за счет передачи в URL информации о вызываемом ресурсе, которая в дальнейшем попадает в переменную окружения PATH_INFO:
 
<pre>
http://tms.osgeo.org/cgi-bin/tms/1.0.0/vmap0
 
PATH_INFO = 1.0.0/vmap0
</pre>
 
Если "tms" в данном примере является исполняемым CGI-скриптом, то он может легко извлечь оставшуюся часть URL и использовать её для формирования необходимого ответа.
 
Отметим, что по умолчанию поведение некоторых версий Microsoft IIS не соответствуют спецификации CGI в этом вопросе (Apache соответствует). За дополнительной информацией о том, как активировать эту возможность в IIS смотри http://support.microsoft.com/kb/q184320/.
 
Отметим, что в URL может использоваться символ ".", поэтому исполняемые скрипты (такие как PHP файлы) могут быть использованы в качестве TMS-серверов.
 
<pre>
Корневой ресурс:
http://tms.osgeo.org/tms.php
</pre>
 
<pre>
Запрос тайла с сервера:
http://tms.osgeo.org/tms.php/1.0.0/thetilemap/firstlevel/2/1.jpg
</pre>


=== URLs That are Actually Scripts ===
В целом, наиболее простой путь извлечения информации из входящего вызова - это взять переменную окружения PATH_INFO, удалить символы "/" в начале и в конце строки, а затем полученную таким образом строку разбить на части в местах расположения символа "/". В полученном списке первый элемент будет определять версию, второй - карту, третий - уровень, четвёртый - "x"-координату, пятый - "y"-координату (с расширением) тайла.


=== Использование граней ===
=== Использование граней ===

Текущая версия от 20:24, 28 марта 2013

Эта страница опубликована в основном списке статей сайта
по адресу http://gis-lab.info/qa/../docs/tms-specification-ru.html


Перевод Tile Map Service Specification.

Перевёл: Денис Рыков.

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

Версия данного документа "1.0" и он больше не будет редактироваться. Изменения будут обсуждаться по адресу Tile Map Service Specification Change Requests.

Любые ревизии будут помещены в новую рабочую копию.

Введение

Назначение документа

Tile Map Service (TMS) обеспечивает доступ к картам, построенным на основе пространственных данных, но не к самим данным. Данный документ стандартизирует процедуру запроса тайлов клиентами, а также способ описания данных, доступных на TMS-сервере.

Форма документа

В данном документе последовательно рассматривается описание общих и частных (таких как картографические тайлы) ресурсов, предоставляемых TMS-сервером, приводятся примеры соответствующих URL и возвращаемых значений.

Спецификация

Tiled Web Service предоставляет доступ к ресурсам, в частности к картографическим тайлам, отрендеренным на определённом масштабном уровне. Доступ к этим ресурсам осуществляется посредством "REST" интерфейса. Клиент может получить доступ, например, к ресурсу, описывающему доступные карты, к ресурсу, содержащему описание доступных масштабных уровней карты, и, как уже было отмечено выше, непосредственно к самим тайлам.

Каждый ресурс содержит описательную информацию и ссылки на ресурсы следующего уровня. Отметим, что поскольку для доступа к ресурсам используются URL, может показаться, что они имеют некоторое значение (например, ресурс для версии сервиса 1.0.0 содержит подстроку "1.0.0" в идентифицирующем его URL), но это не так - формат URL произвольный.

Существует только одно требование, заключающееся в том, что ресурс должен быть идентифицируем по URL (например, http://tms.osgeo.org/1.0.0/ может выглядеть как http://tms.osgeo.org/onepointzeropointzero или http://tms.osgeo.org/flipper.xml, то есть принимать любое значение, указанное в элементе <TileMapService> корневого ресурса).

Значение свойства "href" должно быть абсолютным URL (начинаться с "http://"). Например: href="http://www.service.org/subdirectory/tilemap.xml"

Корневой ресурс (Root Resource)

Корневой ресурс описывает доступные на сервере версии сервисов <TileMapService> (возможно также и другие типы сервисов).

Запрос:

http://tms.osgeo.org/

Ответ (Content-type: text/xml):

<?xml version="1.0" encoding="UTF-8" ?>
 <Services>
   <TileMapService title="Example Tile Map Service" version="1.0.0" href="http://tms.osgeo.org/1.0.0/" />
   <TileMapService title="New Example Tile Map Service" version="1.1.0" href="http://tms.osgeo.org/1.1.0/" />
   <FancyFeatureService title="Features!" version="0.9" href="http://ffs.osgeo.org/0.9/" />
 </Services>


Запрос:

http://www.osgeo.org/services/root.xml

Ответ:

<?xml version="1.0" ?>
 <Services>
   <TileMapService title="Example Static Tile Map Service" version="1.0.0" href="http://www.osgeo.org/services/tilemapservice.xml" />
 </Services>

Ресурс TileMapService (TileMapService Resource)

Ресурс <TileMapService> предоставляет описание сервиса, а также список доступных в рамках данного сервиса карт <TileMaps>. Опциональные элементы ресурса в нижеприведённых примерах отмечены символом "|", остальные элементы являются обязательными.

Запрос:

http://tms.osgeo.org/1.0.0/

Ответ (Content-type: text/xml):

<?xml version="1.0" encoding="UTF-8" ?>
 <TileMapService version="1.0.0" services="http://tms.osgeo.org">
   <Title>Example Tile Map Service</Title>
   <Abstract>This is a longer description of the example tiling map service.</Abstract>
 | <KeywordList>example tile service</KeywordList>
 | <ContactInformation>
 |   <ContactPersonPrimary>
 |     <ContactPerson>Paul Ramsey</ContactPerson>
 |     <ContactOrganization>Refractions Research</ContactOrganization>
 |   </ContactPersonPrimary>
 |   <ContactPosition>Manager</ContactPosition>
 |   <ContactAddress>
 |     <AddressType>postal</AddressType>
 |     <Address>300 - 1207 Douglas Street</Address>
 |     <City>Victoria</City>
 |     <StateOrProvince>British Columbia</StateOrProvince>
 |     <PostCode>V8W2E7</PostCode>
 |     <Country>Canada</Country>
 |   </ContactAddress>
 |   <ContactVoiceTelephone>12503833022</ContactVoiceTelephone>
 |   <ContactFacsimileTelephone>12503832140</ContactFacsimileTelephone>
 |   <ContactElectronicMailAddress>pramsey@refractions.net</ContactElectronicMailAddress>
 | </ContactInformation>
   <TileMaps>
     <TileMap 
       title="VMAP0 World Map" 
       srs="EPSG:4326" 
       profile="global-geodetic" 
       href="http://tms.osgeo.org/1.0.0/vmap0" />
     <TileMap 
       title="British Columbia Landsat Imagery (2000)" 
       srs="EPSG:3005" 
       profile="local" 
       href="http://tms.osgeo.org/1.0.0/landsat2000" />
   </TileMaps>
 </TileMapService>


Запрос:

http://www.osgeo.org/services/tilemapservice.xml

Ответ (Content-type: text/xml):

<?xml version="1.0" encoding="UTF-8" ?>
 <TileMapService version="1.0.0" services="http://www.osgeo.org/services/root.xml">
   <Title>Example Static Tile Map Service</Title>
   <Abstract>This is a longer description of the static tiling map service.</Abstract>
 | <KeywordList>example tile service static</KeywordList>
 | <ContactInformation>
 |   <ContactPersonPrimary>
 |     <ContactPerson>Paul Ramsey</ContactPerson>
 |     <ContactOrganization>Refractions Research</ContactOrganization>
 |   </ContactPersonPrimary>
 |   <ContactPosition>Manager</ContactPosition>
 |   <ContactAddress>
 |     <AddressType>postal</AddressType>
 |     <Address>300 - 1207 Douglas Street</Address>
 |     <City>Victoria</City>
 |     <StateOrProvince>British Columbia</StateOrProvince>
 |     <PostCode>V8W2E7</PostCode>
 |     <Country>Canada</Country>
 |   </ContactAddress>
 |   <ContactVoiceTelephone>12503833022</ContactVoiceTelephone>
 |   <ContactFacsimileTelephone>12503832140</ContactFacsimileTelephone>
 |   <ContactElectronicMailAddress>pramsey@refractions.net</ContactElectronicMailAddress>
 | </ContactInformation>
   <TileMaps>
     <TileMap 
       title="Vancouver Island Base Map" 
       srs="EPSG:26910" 
       profile="none" 
       href="http://www.osgeo.org/services/basemap.xml" />
   </TileMaps>
 </TileMapService>

Ресурс TileMap (TileMap Resource)

Ресурс <TileMap> (обычно) представляет собой описание законченной карты. Однако иногда <TileMap> могут быть использованы как отдельные слои и результирующая карта на клиенте будет выглядеть как комбинация таких слоёв.

Каждая карта <TileMap> разделена на несколько наборов TileSet в рамках которых она отрендерена на определённом масштабе и разбита на тайлы. На мелком масштабе (например, 1:10000000) карта может содержать всего несколько тайлов, тогда как на крупном (например, 1:10000) количество тайлов может исчисляться миллионами.

Отрендеренная в определенной проекции карта <TileMap> на отдельном масштабном уровне представлена упорядоченным набором регулярных изображений (тайлов) <TileSet>, которые вместе взятые образуют полное покрытие карты.

Запрос:

http://tms.osgeo.org/1.0.0/vmap0

Ответ (Content-type: text/xml):

<?xml version="1.0" encoding="UTF-8" ?>  
  <TileMap version="1.0.0" tilemapservice="http://tms.osgeo.org/1.0.0">
   <Title>VMAP0 World Map</Title>
   <Abstract>A map of the world built from the NGA VMAP0 vector data set.</Abstract>
 | <KeywordList></KeywordList>
 | <Metadata type="TC211" mime-type="text/xml" href="http://www.org" />
 | <Attribution>
 |   <Title>National Geospatial Intelligence Agency</Title>
 |   <Logo width="10" height="10" href="http://nga.mil/logo.gif" mime-type="image/gif" />
 | </Attribution>
 | <WebMapContext href="http://wms.org" /> 
 | <Face>0</Face>
   <SRS>EPSG:4326</SRS>
   <BoundingBox minx="-180" miny="-90" maxx="180" maxy="90" />
   <Origin x="-180" y="-90" />  
   <TileFormat width="256" height="256" mime-type="image/jpeg" extension="jpg" />
   <TileSets profile=global-geodetic">
     <TileSet href="http://tms.osgeo.org/1.0.0/vmap0/0" units-per-pixel="0.703125" order="0" />
     <TileSet href="http://tms.osgeo.org/1.0.0/vmap0/1" units-per-pixel="0.3515625" order="1" />
     <TileSet href="http://tms.osgeo.org/1.0.0/vmap0/2" units-per-pixel="0.17578125" order="2" />
     <TileSet href="http://tms.osgeo.org/1.0.0/vmap0/3" units-per-pixel="0.08789063" order="3" />
   </TileSets>
 </TileMap>


Запрос:

http://tms.osgeo.org/1.0.0/landsat2000

Ответ (Content-type: text/xml):

<?xml version="1.0" encoding="UTF-8" ?>
  <TileMap version="1.0.0" tilemapservice="http://tms.osgeo.org/1.0.0">
   <Title>British Columbia Landsat Imagery (2000)</Title>
   <Abstract>Landsat data collected in the year 2000 over British Columbia.</Abstract>
 | <KeywordList></KeywordList>
 | <Metadata type="TC211" mime-type="text/xml" href="http://www.org" />
 | <Attribution>
 |   <Title>Government of British Columbia</Title>
 |   <Logo width="10" height="10" href="http://gov.bc.ca/logo.png" mime-type="image/png" />
 | </Attribution>
 | <WebMapContext href="http://wms.gov.bc.ca" />
   <SRS>EPSG:3005</SRS>
   <BoundingBox minx="100000" miny="100000" maxx="1800000" maxy="1800000" />
   <Origin x="100000" y="100000" />
   <TileFormat width="256" height="256" mime-type="image/png" extension="png" />
   <TileSets profile="local">
     <TileSet href="http://tms.osgeo.org/1.0.0/landsat2000/2048" units-per-pixel="2048" order="0" />
     <TileSet href="http://tms.osgeo.org/1.0.0/landsat2000/1024" units-per-pixel="1024" order="1" />
     <TileSet href="http://tms.osgeo.org/1.0.0/landsat2000/512" units-per-pixel="512" order="2" />
     <TileSet href="http://tms.osgeo.org/1.0.0/landsat2000/256" units-per-pixel="256" order="3" />
     <TileSet href="http://tms.osgeo.org/1.0.0/landsat2000/128" units-per-pixel="128" order="4" />
     <TileSet href="http://tms.osgeo.org/1.0.0/landsat2000/64" units-per-pixel="64" order="5" />
   </TileSets>
 </TileMap>

Запрос:

http://www.osgeo.org/services/basemap.xml

Ответ (Content-type: text/xml):

<?xml version="1.0" encoding="UTF-8" ?>
  <TileMap version="1.0.0" tilemapservice="http://www.osgeo.org/services/tilemapservice.xml">
   <Title>Vancouver Island Base Map</Title>
   <Abstract>A map of the Vancouver Island built from British Columbia planimetric mapping 
   data and digital elevation hill shading.</Abstract>
 | <KeywordList></KeywordList>
 | <Metadata type="TC211" mime-type="text/xml" href="http://www.org" />
 | <Attribution>
 |   <Title>Goverment of British Columbia</Title>
 |   <Logo width="10" height="10" href="http://www.gov.bc.ca/logo.gif" mime-type="image/gif" />
 | </Attribution>
 | <WebMapContext href="http://openmaps.gov.bc.ca" />
   <SRS>EPSG:26910</SRS>
 | <Face>0</Face>
   <BoundingBox minx="500000" miny="4800000" maxx="700000" maxy="5500000" />
   <Origin x="500000" y="4800000" />  
   <TileFormat width="256" height="256" mime-type="image/png" extension="png" />
   <TileSets profile="none">
     <TileSet href="http://www.osgeo.org/services/basemap/L1" units-per-pixel="6400" order="0" />
     <TileSet href="http://www.osgeo.org/services/basemap/L2" units-per-pixel="1600" order="1" />
     <TileSet href="http://www.osgeo.org/services/basemap/L3" units-per-pixel="400" order="2" />
     <TileSet href="http://www.osgeo.org/services/basemap/L4" units-per-pixel="100" order="3" />
     <TileSet href="http://www.osgeo.org/services/basemap/L5" units-per-pixel="25" order="4" />
   </TileSets>
 </TileMap>

Каждая карта <TileMap> поддерживает одну систему координат <SRS> и один формат изображения. Если вы планируете обеспечить доступ к карте, отрендеренной в других проекциях или в других форматах, то в этом случае необходимо определить дополнительные элементы <TileMap> внутри <TileMapService>.

Объект <TileMap> имеет свойства <BoundingBox> и <Origin>. <BoundingBox> - это охват области интересов, он может быть использован клиентом для установки начального охвата карты. <Origin> - координаты левого нижнего угла тайла 0/0, или правого верхнего угла тайла -1/-1 (если вы сконфигурировали сервис таким образом, что карта содержит тайлы с отрицательными координатами). Координаты <Origin> могут располагаться вне визуальной области интересов (<BoundingBox>) из соображений удобства реализации.

<TileMap> может входить в состав более крупного <TileMap> как отдельная грань <Face>. Такие клиенты как OSGPlanet и GeoFusion используют отдельно полярные и экваториальные грани ("earth cube") для создания единого представления Земли из набора тайлов. Смотри #Использование граней.

<TileMap> может реализовать один из трёх "профилей": два глобальных в определённых проекциях и один локальный в произвольной проекции. Профиль подразумевает под собой фиксированный набор масштабных уровней, что позволяет легко комбинировать наборы тайлов, полученных из различных источников.

Профили

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

Тип профиля <TileMap> определяется в атрибуте "profile" элемента <TileSets>. Допустимые значения данного атрибута:

  • none
  • global-geodetic
  • global-mercator
  • local

global-geodetic

Если используется профиль "global-geodetic", то элемент <TileMap> должен удовлетворять следующим требованиям:

  • Использовать <SRS>EPSG:4326</SRS>
  • Снабжать каждый <TileSet>` информацией о разрешении согласно формуле: 0.703125 / 2^n, где n - целое неотрицательное.
    • При таком подходе начальный масштабный уровень состоит из двух тайлов размером 256x256 пикселов, покрывающих всю Землю, значение элемента <Origin> при этом равно (-180,-90). Другие комбинации размеров тайлов и значений <Origin> также допустимы на данном масштабе.
<TileSets profile="global-geodetic">
 <TileSet href="http://tms.osgeo.org/1.0.0/vmap0/0" units-per-pixel="0.703125" order="0" />
 <TileSet href="http://tms.osgeo.org/1.0.0/vmap0/1" units-per-pixel="0.3515625" order="1" />
 <TileSet href="http://tms.osgeo.org/1.0.0/vmap0/2" units-per-pixel="0.17578125" order="2" />
 <TileSet href="http://tms.osgeo.org/1.0.0/vmap0/3" units-per-pixel="0.08789063" order="3" />
 </TileSets>

global-mercator

Если используется профиль "global-mercator", то элемент <TileMap> должен удовлетворять следующим требованиям:

  • Использовать <SRS>OSGEO:41001</SRS>
  • Снабжать каждый <TileSet> информацией о разрешении согласно формуле: 78271.516 / 2^n, где n - целое неотрицательное.
    • При таком подходе начальный масштабный уровень состоит из четырёх тайлов размером 256x256 пикселов, покрывающих всю Землю, значение элемента <Origin> при этом равно (-20037508.34, -20037508.34). Другие комбинации размеров тайлов и значений <Origin> также допустимы на данном масштабе.

local

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

Если используется профиль "local", то элемент <TileMap> должен удовлетворять следующим требованиям:

  • Использовать произвольную систему координат и идентифицировать её внутри тега <SRS>
  • Снабжать каждый <TileSet> информацией о разрешении согласно формуле: 2^n
  • Указывать в атрибуте href поддиректорию, используя в качестве её имени значение "n", соответствующее данному <TileSet>.
<SRS>EPSG:3005</SRS>
 <BoundingBox minx="100000" miny="100000" maxx="1800000" maxy="1800000" />
 <Origin x="100000" y="100000" />
 <TileSets profile="local">
   <TileSet href="http://tms.osgeo.org/1.0.0/landsat2000/6" units-per-pixel="2048" order="0" />
   <TileSet href="http://tms.osgeo.org/1.0.0/landsat2000/5" units-per-pixel="1024" order="1" />
   <TileSet href="http://tms.osgeo.org/1.0.0/landsat2000/4" units-per-pixel="512" order="2" />
   <TileSet href="http://tms.osgeo.org/1.0.0/landsat2000/3" units-per-pixel="256" order="3" />
   <TileSet href="http://tms.osgeo.org/1.0.0/landsat2000/2" units-per-pixel="128" order="4" />
   <TileSet href="http://tms.osgeo.org/1.0.0/landsat2000/1" units-per-pixel="64" order="5" />
 </TileSets>

Ресурс Tile (Tile Resources)

Положение начала координат <TileMap> задаётся в единицах измерения, используемых системой координат карты. x-координата тайлов возрастасет в том же направлении, что и координата x исходных данных в выбранной системе координат, y-координата тайлов также изменяется в том же направлении, что и y-координата исходных данных.

Адрес тайлов определяется путём добавления к значению атрибута "href" элемента <TileSet> координаты "x", выступающей в роли имени директории и координаты "y", выступающей в роли имени файла с раширением, указанным в <TileFormat>.

Примеры:

Тайл, расположенный в начале системы координат первого масштабного уровня карты vmap0.
http://tms.osgeo.org/1.0.0/vmap0/levelzero/0/0.jpg
Тайл, расположенный в середине тайловой сетки третьего масштабного уровня карты vmap0.
http://tms.osgeo.org/1.0.0/vmap0/leveltwo/3/4.jpg
Тайл, расположенный в середине тайловой сетки пятого масштабного уровня карты landsat2000.
http://tms.osgeo.org/1.0.0/landsat2000/1/8500/8500.png
Тайл, расположенный в начале системы координат первого масштабного уровня карты basemap.
http://www.osgeo.org/services/basemap/L1/0/0.png

Диаграмма TileMap

Tms.png

Обработка ошибок

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

Тайловый сервер использует HTTP-коды ошибок для передачи общей информации о возникшей проблеме. Кроме этого, тело ответа может быть представлено XML-документом, содержащим более детальное описание ошибки в человекочитаемом виде.

Только HTTP-коды ошибок, представленные в данной спецификации, могут быть возвращены сервером.

  • Клиент обратился к URL несуществующего ресурса. Возвращается 404 HTTP-код ошибки (Not Found)
  • При обработке запроса к URL существующего ресурса возникла ошибка на стороне сервера. Возвращается 500 HTTP-код ошибки (Internal Server Error)

Сервер в опциональном порядке может возвращать в теле ответа некий контент, даже в случае возникновения ошибки. Например, это может быть XML-документ, содержащий детальную информацию об ошибке. В данном случае необходимо установить заголовок Content-type в значение text/xml.

<?xml version="1.0" ?>
 <TileMapServerError>
   <Message>The requested tile is outside the bounding box of the tile map.</Message>
 </TileMapServerError>

Советы по реализации

Пространственные системы координат

Определение пространственных систем координат основано на базе данных EPSG как источнике определения наиболее "известных" проекций.

Существует две принципиальные проблемы, связанные с использованием базы данных EPSG в качестве референсного источника:

  • Во-первых, база данных EPSG имеет несколько специфичных определений для наиболее распространенных географических систем координат, в частности EPSG:4326 -- географические координаты относительно эллипсоида WGS84. Определение для 4326 говорит, что порядок координат следующий - широта/долгота, единицы измерения - градусы, минуты, секунды. Однако, при использовании EPSG:4326 в Веб-картографии принято использовать обратный порядок координат - долгота/широта, а в качестве единиц измерения десятичные градусы.
  • Во-вторых, база данных EPSG не включает в себя все наиболее распространенные системы координат. Существует множество местных систем координат, которые не отражены в данной базе, хотя EPSG принимает необходимые усилия по их включению. Кроме того, EPSG не содержит и ряд очень распространенных глобальных и используемых для отображения протяженных территорий систем координат предположительно по политическим соображениям. Например, не существует EPSG идентификатора для проекции Меркатора на весь мир или Альберса для Северной Америки.

Эти проблемы просто обойдём принятием следующей спецификации, соответствующей скорее существующей практике применения, чем определению базы данных (EPSG):

  • Для всех географических систем координат, представленных в базе данных EPSG, в рамках данной спецификации порядок координат предполагается следующий - долгота/широта, единицы измерения - десятичные градусы.
  • Системы координат, не представленные в базе данных EPSG могут быть определены в самой TMS-спецификации, используя формат описания OSGEO:
    • OSGEO:41001 PROJCS["WGS84 / Simple Mercator", GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS_1984",6378137,298.257223563]], PRIMEM["Greenwich",0], UNIT["Decimal_Degree", 0.0174532925199433]], PROJECTION["Mercator_1SP"], PARAMETER["central_meridian",0], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["Meter",1]]
    • OSGEO:42310 PROJCS["WGS84+GRS80 / Mercator", GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["GRS 1980",6378137,298.257222101], TOWGS84[0,0,0]], PRIMEM["Greenwich",0], UNIT["Decimal_Degree",0.0174532925199433]], PROJECTION["Mercator_1SP"], PARAMETER["central_meridian",0], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["Meter",1]]
    • OSGEO:42101 PROJCS["WGS 84 / LCC Canada", GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS_1984",6378137,298.257223563]], PRIMEM["Greenwich",0], UNIT["Decimal_Degree",0.0174532925199433]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["central_meridian",-95.0], PARAMETER["latitude_of_origin",0], PARAMETER["standard_parallel_1",49.0], PARAMETER["standard_parallel_2",77.0], PARAMETER["false_easting",0.0], PARAMETER["false_northing",-8000000.0], UNIT["Meter",1]]
    • OSGEO:42304 PROJCS["NAD83 / NRCan LCC Canada", GEOGCS["NAD83", DATUM["North_American_Datum_1983", SPHEROID["GRS_1980",6378137,298.257222101], TOWGS84[0,0,0]], PRIMEM["Greenwich",0], UNIT["Decimal_Degree",0.0174532925199433]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["central_meridian",-95.0], PARAMETER["latitude_of_origin",49.0], PARAMETER["standard_parallel_1",49.0], PARAMETER["standard_parallel_2",77.0], PARAMETER["false_easting",0.0], PARAMETER["false_northing",0.0], UNIT["Meter",1]]

Максимизация кэширования

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

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

  • На самом клиенте, клиентское приложение записывает кэш на локальный диск.
  • В разделяемом кэше поставщика интернет-услуг, что позволит пользователям, осуществляющим доступ в Интернет через одного провайдера, использовать общий кэш.
  • В кэше на стороне сервера, что позволит снизить нагрузку на сервере за счёт уменьшения операций по генерированию тайлов.

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

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

Такие заголовки в версиях HTTP 1.0 и HTTP 1.1 отличаются и поскольку оба протокола активно используются, то важно указывать заголовки для обоих версий.

Для HTTP 1.0 используйте заголовок "Expires". Если вы рассчитываете, что ваши данные будут изменяться не чаще, чем раз в неделю, установите значение заголовка Expires в дату, отстоящую от текущей на одну неделю. Например, если 1 Января 2007 вы захотели установить данный заголовок, то, используя PHP, это бы выглядело следующим образом:

header('Expires: Mon, 8 Jan 2007 14:57:12 GMT');

Если вы не хотите каждую неделю изменять данный заголовок, то эту процедуру можно автоматизировать:

header('Expires: ' . gmdate('D, j M Y H:i:s T', time() + 7 * 24 * 60 * 60));   // текущее время + 7 дней в секундах

Для HTTP 1.1 используйте заголовок "Cache-control". В отличие от старого "Expires", "Cache-control" не имеет привязку ко времени, в этом случае просто указывается период обновления данных, что позволяет решить проблему синхронизации времени, возникающую при использовании "Expires".

header('Cache-Control: max-age=86400, must-revalidate');
header('Cache-Control: ' . 7 * 24 * 60 * 60 );

Информацию о заголовках, используемых для кэширования в HTTP 1.1, можно найти в W3.org specification.

Реализация кэширования

Вы можете либо надеяться но то, что где-то кто-то на просторах Интернета закэширует ваши данные согласно переданным заголовкам кэширования, либо создать собственный кэш. Если вы используете Веб-сервер Apache 2.0, то это сделать очень просто.

Добавьте директиву mod_cache в определение вашего виртуального хоста <VirtualHost>:

<IfModule mod_disk_cache.c>
 CacheRoot /tmp/apache-cache 
 CacheSize 1024000
 CacheEnable disk /cgi-bin/tms
 CacheDirLevels 5
 CacheDirLength 3
</IfModule>

Это пример создания дискового кэша, который вы вероятнее всего будете использовать для своего TMS. Обратите внимание, как директива CacheEnable позволяет очень точно контролировать содержимое, которое вы собираетесь кэшировать. В данном примере будут кэшироваться только данные TMS сервиса и больше ничего. Вы можете настроить кэширование только конкретной карты внутри сервиса или даже отдельного масштабного уровня карты.

URL, являющиеся скриптами

В больших реализациях данной TMS-спецификации данные, обычно, не сгенерированы заранее, а создаются по запросу некоторым бэкенд-сервисом. Это означает, что URL, которые могут выглядеть как статические на самом деле являются динамическими.

Спецификация CGI позволяет реализовывать подобные сервисы довольно легко за счет передачи в URL информации о вызываемом ресурсе, которая в дальнейшем попадает в переменную окружения PATH_INFO:

http://tms.osgeo.org/cgi-bin/tms/1.0.0/vmap0

PATH_INFO = 1.0.0/vmap0

Если "tms" в данном примере является исполняемым CGI-скриптом, то он может легко извлечь оставшуюся часть URL и использовать её для формирования необходимого ответа.

Отметим, что по умолчанию поведение некоторых версий Microsoft IIS не соответствуют спецификации CGI в этом вопросе (Apache соответствует). За дополнительной информацией о том, как активировать эту возможность в IIS смотри http://support.microsoft.com/kb/q184320/.

Отметим, что в URL может использоваться символ ".", поэтому исполняемые скрипты (такие как PHP файлы) могут быть использованы в качестве TMS-серверов.

Корневой ресурс:
http://tms.osgeo.org/tms.php
Запрос тайла с сервера:
http://tms.osgeo.org/tms.php/1.0.0/thetilemap/firstlevel/2/1.jpg

В целом, наиболее простой путь извлечения информации из входящего вызова - это взять переменную окружения PATH_INFO, удалить символы "/" в начале и в конце строки, а затем полученную таким образом строку разбить на части в местах расположения символа "/". В полученном списке первый элемент будет определять версию, второй - карту, третий - уровень, четвёртый - "x"-координату, пятый - "y"-координату (с расширением) тайла.

Использование граней

Элемент "face-id", расположенный внутри <TileMap>, может использоваться различными клиентскими приложениями. Каким именно образом он используется, описано здесь.

Заполнить информацию о поддержке данной возможности...

Список ПО, реализующего поддержку TMS

Серверы

Клиенты

  • Worldkit: http://worldkit.org/tilemap/
  • Openlayers: http://openlayers.org/
  • Cadcorp SIS: Screenshot
  • Merkaartor - редактор данных OpenStreetMap, позволяет использовать TMS-слои в качестве подложек: Отметим, что нумерация тайлов в тайловой сетке Google Maps начинается с c с тайла 0,0, расположенного в верхнем левом углу, а не в нижнем левом.

Возвращаемые коды ошибок

Если ваш тайловый сервер представлен статичным набором файлов, то Веб-сервер будет самостоятельно устанавливать коды ответов в том числе и когда клиент запросит несуществующий ресурс или возникнет ошибка на стороне сервера.

Если же ваш тайловый сервер представляет из себя динамическое Веб-приложение, то вам необходимо самостоятельно устанавливать HTTP-коды ответов. В противном случае даже при возникновении ошибки сервер HTTP будет возвращать XML документ с кодом ответа 200 (OK), что является неверным. На PHP функция, возвращающая информацию об ошибке может выглядеть следующим образом:

header("HTTP/1.0 404 Not Found");
header("Content-type: text/xml");
print "<?xml version='1.0' ?>";
print "<TileMapServerErrror>";
print "<Message>You requested a map tile [ $path_info ] that does not exist.</Message>";
print "</TileMapServerError>";

Отметим, что помимо установки кода ответа в данном примере также устанавливается соответствующее значение Content-type. Также обратите внимание на отсутствие заголовков, отвечающих за кэширование. Это связано с тем, что не следует кэшировать ответы сервера, содержашие сообщения об ошибках.

Дополнительная информация

  • What is REST
  • OpenStreetMap's "Slippy tiles" Отметим, что нумерация тайлов в тайловой сетке Google Maps начинается с верхнего левого угла, а не с нижнего левого.