Основы конфигурирования тайловых сеток: различия между версиями

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
(Новая страница: «{{Статья|Черновик}} == Введение == Итак, предположим, что вы ознакомились со спецификацией …»)
 
мНет описания правки
Строка 36: Строка 36:
h = (maxy - miny)/R = (6045880-5613155)/3000 = 144 (пикселов)
h = (maxy - miny)/R = (6045880-5613155)/3000 = 144 (пикселов)
</pre>
</pre>
[[Файл:Zoom-level-0.png]]
'''1500'''
<pre>
w = (maxx - minx)/R = (920220-287157)/1500 = 422 (пикселов)
h = (maxy - miny)/R = (6045880-5613155)/1500 = 288 (пикселов)
</pre>
[[Файл:Zoom-level-1.png]]
'''1000'''
<pre>
w = (maxx - minx)/R = (920220-287157)/1000 = 633 (пикселов)
h = (maxy - miny)/R = (6045880-5613155)/1000 = 432 (пикселов)
</pre>
[[Файл:Zoom-level-2.png]]
Как уже было отмечено выше, разрешение i-го (i - целое больше 0) масштабного уровня может быть произвольным, однако на практике наиболее распространённым является случай, когда разрешение i-го уровня Ri в 2 раза выше разрешения предыдущего Ri-1:
<pre>Ri = Ri-1/2</pre>
Разрешение 0-го (i=0) масштабного уровня может устанавливаться произвольно, но опять же на практике широкое распространение получил следующий подход. Считается, что на нулевом уровне должно быть такое разрешение, которое бы позволило уместить карту целиком в один тайл. Чтобы его рассчитать, нам необходимо определиться с размерами тайла.
=== Размер тайла ===
Размер тайла (ширина и высота) определяет объём информации, передаваемой одним тайлом. Очевидно, что чем больше геометрические размеры тайла, тем больший объём дискового пространства он занимает и тем дольше он будет передаваться клиенту. Чем меньше размер тайла, тем он быстрее может быть доставлен клиенту, но при этом возрастает количество запросов с серверу, что в конечном итоге приводит к еще более длительному процессу получения тайлов. Экспериментальным путём было установлено, что наиболее эффективный размер тайла - 256x256 пикселов. Пример тайла сервиса OpenStreetMap:
[[Файл:Osm-tile-example.png]]
Вернёмся к нашей задаче определения разрешения 0-го уровня. Определим ширину (W) и высоту (H) карты в единицах измерения данных:
<pre>
W = maxx-minx = 920220-287157 = 633063 (м)
H = maxy-miny = 6045880-5613155 = 432725 (м)
</pre>
Тогда разрешение 0-го уровня можно вычислить так:
<pre>R0 = max(W,H)/256 = 633063/256 = 2472</pre>
Можно записать общую формулу расчета разрешения i-го уровня карты размером WxH с размером тайла 256x256 с учётом соотношения Ri = Ri-1/2:
<pre>Ri = max(W,H)/(256*2^i)</pre>
=== Положение начала отсчёта тайловой сетки ===
Начало отсчёта тайловой сетки, задаваемое в единицах измерения исходных данных, определяет индексы тайлов, по которым они будут доступны. Согласно спецификации TMS начало отсчёта тайловой сетки может располагаться вне охвата карты. В этом случае тайл (0,0) может и не существовать, однако это достаточно экзотический случай. Наиболее распространённым является случай, когда начало отсчёта тайловой сетки совпадает с координатами левого нижнего угла охвата карты (minx, miny):
[[Файл:Zoom-level-2-ll.png]]
Другой часто встречающийся случай (не согласующийся со спецификацией TMS) - это когда положение начала отсчета тайловой сетки помещается в левую верхнюю точку охвата карты (minx, maxy):
[[Файл:Zoom-level-2-ul.png]]
Данный подход используется, например, в OpenStreetMap. Пример запроса тайла по адресу <nowiki>http://b.tile.openstreetmap.org/01/0/1.png</nowiki>:
[[http://wiki.gis-lab.info/images/0/05/Osm-tile-example-0-1.png‎]]

Версия от 18:00, 29 марта 2013

Эта страница является черновиком статьи.


Введение

Итак, предположим, что вы ознакомились со спецификацией Tile Map Service и решили создать собственный TMS-сервис. Спецификация предполагает, что у вас уже есть готовый набор тайлов или перечень необходимых настроек, согласно которому эти тайлы будут создаваться (см. раздел URL, являющиеся скриптами). Наиболее распространенной является ситуация, когда автор TMS-сервиса не только создаёт прослойку между готовым набором тайлов и клиентским приложением, но и отвечает за подготовку самих тайлов. В этом случае разработчик должен хорошо разбираться в вопросах, связанных с конфигурированием тайловых сеток. Даже если в его приложении тайлы создаются по запросу, то есть "на лету", эти знания также крайне необходимы.

Параметры тайловой сетки

Проекция

Прежде всего важно определиться с проекцией, которая будет использоваться для отрисовки данных. Для этого необходимо ответить на вопрос для каких целей будут предназначены ваши тайлы. Если вы хотите просто отображать свою карту поверх подложек, предоставляемых такими сервисами как OpenStreetMap или Google Maps, то вы должны использовать такую же проекцию, что и указанные сервисы, а именно EPSG:3857. Если же вы преследуете какие-то иные цели, например, желаете вычислять расстояния, измерять площади объектов на карте или планируете создать карту Антарктида, то в этом случае вам необходимо выбрать наиболее подходящую для этих задач проекцию.

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

Охват

Следующий важный этап - это выбрать охват (ограничивающий прямоугольник), то есть ту область на которую будут генерироваться тайлы, вне ее тайлы не создаются. Параметры охвата Алтайского края получим на основе данных слоя административных границ набора Geosample. Для этого воспользуемся утилитой ogrinfo:

ogrinfo -sql "SELECT ST_Transform(the_geom, 32644) FROM admin WHERE name='Алтайский край'" PG:"host=gis-lab.info dbname=geosample user=guest password=guest" | grep Extent

В результате чего мы получим охват интересующей нас территории в единицах измерения системы координат проекции EPSG:32644 (minx, miny, maxx, maxy):

Extent: (287157.161574, 5613155.489664) - (920220.378205, 6045880.725611)

Масштабные уровни (разрешения)

После того, как мы определились с проекцией и охватом, необходимо разобраться с масштабными уровнями. Каждый масштабный уровень определяет разрешение с которым отрендерена карта на данном уровне, при этом количество таких уровней может быть произвольным. Величина разрешения, используемого на том или ином уровне также ничем не лимитирована. Разрешение показывает сколько единиц измерения координат исходных данных укладывается в одном пикселе отрендеренной карты. Таким образом в нашем случае (проекция UTM) единицы измерения разрешения - м/пиксел, в случае же работы с географическими системами координат это будут градус/пиксел.

Предположим, мы хотим предоставить доступ к нашим данным, отрендеренным с разрешениями R, равными 3000, 1500 и 1000 метров на пиксел. Посчитаем для этих разрешений размеры результирующей карты (w - ширина, h - высота):

3000

w = (maxx - minx)/R = (920220-287157)/3000 = 211 (пикселов)
h = (maxy - miny)/R = (6045880-5613155)/3000 = 144 (пикселов)

Zoom-level-0.png

1500

w = (maxx - minx)/R = (920220-287157)/1500 = 422 (пикселов)
h = (maxy - miny)/R = (6045880-5613155)/1500 = 288 (пикселов)

Zoom-level-1.png

1000

w = (maxx - minx)/R = (920220-287157)/1000 = 633 (пикселов)
h = (maxy - miny)/R = (6045880-5613155)/1000 = 432 (пикселов)

Zoom-level-2.png

Как уже было отмечено выше, разрешение i-го (i - целое больше 0) масштабного уровня может быть произвольным, однако на практике наиболее распространённым является случай, когда разрешение i-го уровня Ri в 2 раза выше разрешения предыдущего Ri-1:

Ri = Ri-1/2

Разрешение 0-го (i=0) масштабного уровня может устанавливаться произвольно, но опять же на практике широкое распространение получил следующий подход. Считается, что на нулевом уровне должно быть такое разрешение, которое бы позволило уместить карту целиком в один тайл. Чтобы его рассчитать, нам необходимо определиться с размерами тайла.

Размер тайла

Размер тайла (ширина и высота) определяет объём информации, передаваемой одним тайлом. Очевидно, что чем больше геометрические размеры тайла, тем больший объём дискового пространства он занимает и тем дольше он будет передаваться клиенту. Чем меньше размер тайла, тем он быстрее может быть доставлен клиенту, но при этом возрастает количество запросов с серверу, что в конечном итоге приводит к еще более длительному процессу получения тайлов. Экспериментальным путём было установлено, что наиболее эффективный размер тайла - 256x256 пикселов. Пример тайла сервиса OpenStreetMap:

Osm-tile-example.png

Вернёмся к нашей задаче определения разрешения 0-го уровня. Определим ширину (W) и высоту (H) карты в единицах измерения данных:

W = maxx-minx = 920220-287157 = 633063 (м)
H = maxy-miny = 6045880-5613155 = 432725 (м)

Тогда разрешение 0-го уровня можно вычислить так:

R0 = max(W,H)/256 = 633063/256 = 2472

Можно записать общую формулу расчета разрешения i-го уровня карты размером WxH с размером тайла 256x256 с учётом соотношения Ri = Ri-1/2:

Ri = max(W,H)/(256*2^i)

Положение начала отсчёта тайловой сетки

Начало отсчёта тайловой сетки, задаваемое в единицах измерения исходных данных, определяет индексы тайлов, по которым они будут доступны. Согласно спецификации TMS начало отсчёта тайловой сетки может располагаться вне охвата карты. В этом случае тайл (0,0) может и не существовать, однако это достаточно экзотический случай. Наиболее распространённым является случай, когда начало отсчёта тайловой сетки совпадает с координатами левого нижнего угла охвата карты (minx, miny):

Zoom-level-2-ll.png

Другой часто встречающийся случай (не согласующийся со спецификацией TMS) - это когда положение начала отсчета тайловой сетки помещается в левую верхнюю точку охвата карты (minx, maxy):

Zoom-level-2-ul.png

Данный подход используется, например, в OpenStreetMap. Пример запроса тайла по адресу http://b.tile.openstreetmap.org/01/0/1.png:

[[1]]