gdal_translate: привязанный растр из тайлового источника
Добавлено: 18 мар 2013, 22:10
Потребовалось на основе тайловых данных сервиса openstreetmap.org подготовить набор геопривязанных растров, представляющих собой территории определённых городов, отрендеренные на нужном масштабном уровне. Решил попробовать выполнить данную задачу при помощи консольных утилит GDAL. В списке форматов, поддерживаемых GDAL-ом, находим OGC Web Map Service и чуть ниже на этой же страницы видим описание мини-драйвера TMS, отвечающего за поддержку тайловых источников данных. Как им пользоваться смотрим в разделе Examples. Нас интересует пример OpenStreetMap TMS Service Example:
Как видно из представленного примера, вначале мы должны представить описание нашего тайлового сервиса в виде XML-файла и затем скормить его утилите gdal_translate. Создаём файл osm.xml и помещаем в него следующий код:
Теперь попробуем получить растр на территорию села Фершампенуаз, имеющего охват 6656381.223504174, 7076012.868322925, 6662582.175551272, 7082935.574421264 в проекции тайлов 900913:
Получили растр. Но не понятно на основе тайлов какого уровня он построен?? Предполагаю, что GDAL должен сначала по указанному bbox-у и размеру выходного изображения рассчитать разрешение входного растра и определить к разрешению какого масштабного уровня оно более близко, то есть вычислить координату тайлов z, после этого запросить нужные тайлы, вырезать кусок и вместить в квадрат указанного размера (512px), но не уверен. В любом случае при таком способе (явном указании размера выходного изображения в пикселах) на выходе мы будем почти всегда иметь деформированный по одной из осей растр. Попробуем задать размер выходного растра в процентах:
Получившийся растр имеет нужные пропорции. Но возникает 2 вопроса. Первый - что за проценты? Второй - какой масштабный уровень при этом используется?
P.S. Что касается привязки, то для этого достаточно указать -of GTiff вместо -of PNG.
P.P.S Файл osm.xml можно открыть в QGIS как растровый слой.
Код: Выделить всё
gdal_translate -of PNG -outsize 512 512 frmt_wms_openstreetmap_tms.xml openstreetmap.png
Код: Выделить всё
<GDAL_WMS>
<Service name="TMS">
<ServerUrl>http://tile.openstreetmap.org/${z}/${x}/${y}.png</ServerUrl>
</Service>
<DataWindow>
<UpperLeftX>-20037508.34</UpperLeftX>
<UpperLeftY>20037508.34</UpperLeftY>
<LowerRightX>20037508.34</LowerRightX>
<LowerRightY>-20037508.34</LowerRightY>
<TileLevel>18</TileLevel>
<TileCountX>1</TileCountX>
<TileCountY>1</TileCountY>
<YOrigin>top</YOrigin>
</DataWindow>
<Projection>EPSG:900913</Projection>
<BlockSizeX>256</BlockSizeX>
<BlockSizeY>256</BlockSizeY>
<BandsCount>3</BandsCount>
<Cache />
</GDAL_WMS>
Код: Выделить всё
gdal_translate -of PNG -projwin 6656381.223504174 7082935.574421264 6662582.175551272 7076012.868322925 -outsize 512 512 osm.xml fershampenuaz512.png
Код: Выделить всё
gdal_translate -of PNG -projwin 6656381.223504174 7082935.574421264 6662582.175551272 7076012.868322925 -outsize 10% 10% osm.xml fershampenuaz10pct.png
P.S. Что касается привязки, то для этого достаточно указать -of GTiff вместо -of PNG.
P.P.S Файл osm.xml можно открыть в QGIS как растровый слой.