Обсудить в форуме Комментариев 2Редактировать в вики
Перевод 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"
Корневой ресурс описывает доступные на сервере версии сервисов <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> предоставляет описание сервиса, а также список доступных в рамках данного сервиса карт <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> могут быть использованы как отдельные слои и результирующая карта на клиенте будет выглядеть как комбинация таких слоёв.
Каждая карта <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>. Допустимые значения данного атрибута:
Если используется профиль "global-geodetic", то элемент <TileMap> должен удовлетворять следующим требованиям:
<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", то элемент <TileMap> должен удовлетворять следующим требованиям:
Локальный профиль "local" построен снизу вверх, начиная с самого низкого разрешения к самому высокому. Локальные профили, как и глобальные, также построены на строго фиксированном наборе масштабных уровней, при этом может быть использована произвольная система координат.
Если используется профиль "local", то элемент <TileMap> должен удовлетворять следующим требованиям:
<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>
Положение начала координат <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
При возникновении ошибки на сервере важно, чтобы клиент смог легко это обнаружить, а также понять, почему это случилось, поэтому пользователь должен получать необходимые уведомления.
Тайловый сервер использует HTTP-коды ошибок для передачи общей информации о возникшей проблеме. Кроме этого, тело ответа может быть представлено XML-документом, содержащим более детальное описание ошибки в человекочитаемом виде.
Только HTTP-коды ошибок, представленные в данной спецификации, могут быть возвращены сервером.
Сервер в опциональном порядке может возвращать в теле ответа некий контент, даже в случае возникновения ошибки. Например, это может быть 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):
Тайловые карты обычно используются в качестве подложек и содержат информацию об относительно редко изменяющихся данных. Кроме того, они очень велики по объёму - количество тайлов может достигать нескольких миллионов. Учитывая эти факты, можно сделать вывод о том, что активное использование стратегии кэширования позволит оптимизировать производительность тайловых сервисов.
Кэширование может быть выполнено на различных уровнях, расположенных между сервером и клиентом:
Для того, чтобы кэширование было осуществлено на одном из вышеназванных уровней, необходимо предоставить механизму кэширования соответствующую информацию.
Если ваш тайловый сервер реализован на одном из языков написания сценариев или языке программирования, то вы можете самостоятельно указать необходимые 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 сервиса и больше ничего. Вы можете настроить кэширование только конкретной карты внутри сервиса или даже отдельного масштабного уровня карты.
В больших реализациях данной 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>, может использоваться различными клиентскими приложениями. Каким именно образом он используется, описано здесь.
Заполнить информацию о поддержке данной возможности...
Если ваш тайловый сервер представлен статичным набором файлов, то Веб-сервер будет самостоятельно устанавливать коды ответов в том числе и когда клиент запросит несуществующий ресурс или возникнет ошибка на стороне сервера.
Если же ваш тайловый сервер представляет из себя динамическое Веб-приложение, то вам необходимо самостоятельно устанавливать 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. Также обратите внимание на отсутствие заголовков, отвечающих за кэширование. Это связано с тем, что не следует кэшировать ответы сервера, содержашие сообщения об ошибках.
Обсудить в форуме Комментариев 2Редактировать в вики
Последнее обновление: 2014-05-14 23:46
Дата создания: 20.03.2013
Автор(ы): Денис Рыков
© GIS-Lab и авторы, 2002-2021. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов. (подробнее).