Приветствую!
Попробовал в ручном режиме получить с WMS-сервера некоторое количество привязанных тайлов, полученным результатом доволен. Стыковка тайлов в объединённом растре получается идеальная, что позволяет полностью избавиться от надоедливого ватермарка, добавляемого сервером в каждый отданный тайл.
Методика следующая:
1. Определяем западную и северную границы нужного участка карты в метрах согласно используемой сервером EPSG. Эти цифры берём за основу. Восточную границу надо взять чуть больше нужного участка, чтобы в строке получилось целое число тайлов. Точное значение получается так: западная граница в метрах + (количество тайлов в строке х разрешение по горизонтали одного тайла в пикселях х масштабный коэффициент карты в метрах на пиксель). Вычисляем южную границу для первой строки тайлов (подразумевается, что для нужного нам участка у нас будет несколько строк тайлов). Северная граница - (разрешение по вертикали одного тайла в пикселях х масштабный коэффициент). Прописываем координаты углов и общее разрешение в пикселях для первой строки в ogc_wms.xml с учётом заранее прописанных параметров WMS-сервера.
Код: Выделить всё
<DataWindow>
<UpperLeftX>5485000</UpperLeftX>
<UpperLeftY>5333000</UpperLeftY>
<LowerRightX>5517768</LowerRightX>
<LowerRightY>5328904</LowerRightY>
<SizeX>8192</SizeX>
<SizeY>1024</SizeY>
</DataWindow>
В данном примере используюся тайлы разрешением 1024х1024, для уменьшения временных затрат разрешение тайлов выбирается по максимуму из поддерживаемых WMS. Масштабный коэффициент карты - 4 метра на пиксель.
2. Поочерёдно получаем 8 тайлов первой строки:
Код: Выделить всё
gdal_translate -srcwin 0 0 1024 1024 -of GTIFF ogc_wms.xml d:\temp\1.tif
gdal_translate -srcwin 1024 0 1024 1024 -of GTIFF ogc_wms.xml d:\temp\2.tif
..................
gdal_translate -srcwin 7168 0 1024 1024 -of GTIFF ogc_wms.xml d:\temp\8.tif
Как видно, каждый последующий раз меняется значение xoff с 0 до 7168, оно определяет положение каждого тайла в строке по горизонтали (х). Также изменяется имя у выходного файла. Можно попытаться и за один раз взять всю строку тайлов в один выходной файл:
Код: Выделить всё
gdal_translate -srcwin 0 0 8192 1024 -of GTIFF ogc_wms.xml d:\temp\1.tif
Такой вариант проверялся, тоже работает, но не стабильно, gdal_translate часто вылетает без указания ошибки, а выходной файл получается залит чёрным цветом. Иногда по нескольку раз нужно повторять команду, чтобы сработало нормально. Для работы по скрипту не вариант.
Итак, у нас есть 8 привязанных тайлов первой строки. На каждом из них внизу по центру находится надоедливый, и местами просто уродующий карту, ватермарк от WMS-сервера. Решение проблемы:
3.Вторую строку тайлов будем брать не чётко по южной границе первой строки, а с небольшой поправкой на север, дабы затем, при склейке получившийся перехлёст позволил бы закрыть все ватермарки в тайлах предыдущей строки. Опытным путём установлено, что ватермарк занимает на тайле чуть меньше 200 метров с южного края тайла к северу. Запад и восток для всех строк остаются постоянными, определяем север и юг второй строки с учётом поправки в 200 метров. Север второй строки равен югу первой +200. Юг второй строки равен (юг первой строки +200) - (разрешение по вертикали одного тайла в пикселях х масштабный коэффициент). Сохраняем изменённые значения в файл ogc_wms.xml
Код: Выделить всё
<DataWindow>
<UpperLeftX>5485000</UpperLeftX>
<UpperLeftY>5329104</UpperLeftY>
<LowerRightX>5517768</LowerRightX>
<LowerRightY>5325008</LowerRightY>
<SizeX>8192</SizeX>
<SizeY>1024</SizeY>
</DataWindow>
4. Получаем 8 тайлов второй строки аналогично получению тайлов первой строки. Нумерацию выходных файлов продолжаем 9.tiff - 16tiff.
5. Аналогично определяется север и юг у третьей (с поправкой 200 метров от второй) и последующих строк. Разность между севером и югом у всех строк одинаковая. Последнюю строку берём такой, чтобы ватермарки не попадали в нужный нам участок карты, и их при окончательной склейке можно было бы легко отрезать.
Вот такая логика работы. Повторюсь, что в ручном режиме всё получается на ура. Но очень долго по времени. Хотелось бы автоматизировать процесс получения тайловых строк. Но абсолютно не силён в программировании, помогите пожалуйста со скриптом. И ещё есть вопрос - как заставить gdal_translate работать через прокси (использовать системные настройки прокси-сервера)?