Tile Map Service Specification

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Эта страница является черновиком статьи.


Перевод 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 Resource (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
  • Must provide <TileSet> sub-directories below the <Profile> href value, using the value of "n" appropriate for that <TileSet> as the sub-directory name.
<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 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 Diagram

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>

Implementation Advice

Spatial Referencing Systems

Maximizing Cacheability

Implementing Cacheability

URLs That are Actually Scripts

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

Элемент "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 начинается с верхнего левого угла, а не с нижнего левого.