Страница 2 из 3
Re: Грабим WMS сервера с помощью GDAL
Добавлено: 17 апр 2015, 17:59
Landser
Денис, на скриншоте три попытки:

Первая - попытка получить в объединённый выходной растр целую строку из 32 шт 1024х1024 тайлов. Вторая - попытка получить полстроки (16 тайлов). И лишь третья попытка получилась удачной, в ней мы получили самый первый тайл из строки. Считаю, что проблема тут скорей всего не в GDAL, а на стороне WMS-сервера. Вероятно, он обрубает слишком частые запросы тайлов. И в связи с этим получать с данного сервера целые строки нужного участка карты, и вместе с тем упростить скрипт к сожалению не получается. С получением же отдельных тайлов один за другим никаких проблем не наблюдается.
Re: Грабим WMS сервера с помощью GDAL
Добавлено: 17 апр 2015, 19:41
Максим Дубинин
Re: Грабим WMS сервера с помощью GDAL
Добавлено: 17 апр 2015, 19:58
Landser
Максим,
GDAL 1.7.0b2, FWTools 2.4.7, released 2010/01/19.
Re: Грабим WMS сервера с помощью GDAL
Добавлено: 17 апр 2015, 20:14
Максим Дубинин
обновите GDAL, не используйте FWTools, используйте OSGeo4W
Re: Грабим WMS сервера с помощью GDAL
Добавлено: 17 апр 2015, 21:14
Landser
Максим, благодарю вас! Обновил сборку и получилось взять сразу целую строку из 32 тайлов в общий выходной растр:

Отлично, что скрипт упрощается. Алгоритм работы скрипта теперь видится таким:
Запускается счётчик цифрового имени выходного файла от 1 до максимального количества строк +1. Считываются начальные значения севера и юга для строки из ogc_wms.xml. Выполняется команда взятия строки с переменной в имени выходного файла. Вычисляются значения севера и юга для следующей строки, которые записываются в ogc_wms.xml. Переход к счётчику. Если счётчиком достигнуто максимальное количество строк +1, то происходит остановка. Теперь бы это реализовать, т.к. строк больше 30 (если не сдвигать, то ровно 30).

Re: Грабим WMS сервера с помощью GDAL
Добавлено: 18 апр 2015, 01:22
Denis Rykov
Может я чего-то не понял, зачем куда-то что-то сдвигать, почему бы не запросить сразу весь охват?
[ Сообщение с мобильного устройства ]
Re: Грабим WMS сервера с помощью GDAL
Добавлено: 18 апр 2015, 01:39
Landser
Денис, дело в том, что WMS-сервер в каждый отданный фрагмент (тайл) рисует свой ватермарк, местами заметно портящий карту. Сервер не может отдавать фрагменты больше 1024х1024. Соответственно, если брать весь охват целиком, то количество таких ватермарков на растре будет равно общему количеству этих фрагментов в общем растре. Т.к. ватермарк расположен постоянно в одном и том же месте отданного сервером фрагмента, и если каждую последующую строку взять с поправкой на позицию ватермарка, то при окончательной склейке фрагментов ватермарки в каждой строке будет скрыты последующей строкой. Останутся лишь ватермарки внизу самой последней строки, и их легко обрезать при окончательной склейке строк.
UPD: Максимальный размер отдаваемых сервером тайлов оказывается 2048х2048.
Re: Грабим WMS сервера с помощью GDAL
Добавлено: 18 апр 2015, 02:01
Denis Rykov
А можно адрес этого сервера, если это конечно не во внутренней сети?
[ Сообщение с мобильного устройства ]
Re: Грабим WMS сервера с помощью GDAL
Добавлено: 18 апр 2015, 02:19
Landser
Отправил в ЛС.
Re: Грабим WMS сервера с помощью GDAL
Добавлено: 18 апр 2015, 02:21
Denis Rykov
Посмотрю, как доберусь до нормального интернета.
[ Сообщение с мобильного устройства ]
Re: Грабим WMS сервера с помощью GDAL
Добавлено: 18 апр 2015, 02:31
Landser
Denis Rykov писал(а):Посмотрю, как доберусь до нормального интернета.
[ Сообщение с мобильного устройства ]
Да с сервером-то никаких проблем и нет. Кроме ватермарка в каждый отданный тайл. Что успешно решается введением поправки на последующую строку и проверено лично в ручном режиме правкой севера и юга в ogc_wms.xml. Получил несколько строчек, открыл полученные geotiff (Привязка идеальная, следовательно идеальный нахлёст строк друг на друга. Ватермарки всех строк кроме самой нижней скрыты нахлёстом. ) в Global Mapper, нижнюю подрезал и экспортнул в общий растр. Большие участки карты естественно руками не осилить.

Re: Грабим WMS сервера с помощью GDAL
Добавлено: 19 апр 2015, 09:23
Denis Rykov
То что вы называете тайл - это на самом деле фрагмент, запрашиваемый GDAL-ом, и то что он у вас получился 1024 - это потому что такие настройки идут по
дефолту, измените размер до 2048 и получите в два раза меньше watermark-ов, увеличить это значение до большего в вашем случае не удастся, так как сервер будет ругаться:
ERROR 1: GDALWMS: The server returned exception: msWMSLoadGetMapParams(): WMS server error. Image size out of range, WIDTH and HEIGHT must be between 1 and 2048 pixels
В общем случае ваша проблема может быть решена путём добавления в драйвер GDAL поддержки Meta Buffer по аналогии с тем, как это сделано в
MapProxy. В качестве решения вашей конкретной задачи можно попробовать собрать свой WMS на базе внешнего и уже его использовать для склейки.
Re: Грабим WMS сервера с помощью GDAL
Добавлено: 20 апр 2015, 22:57
Landser
Денис, благодарю, но проблема решается , имхо, несколько проще. Ведь утилита gdal_translate сама умеет запрашивать фрагменты с сервера с нужными координатами и разрешением. Задачи получить на выходе полностью объединённый растр нет. Поскольку его я легко и непринуждённо получаю с наглядным отображением в другой программе. Поэтому не вижу смысла вмешиваться в драйвер GDAL или поднимать локальный WMS для склейки. Мне нужен всего лишь скрипт, который может автоматически изменять параметры от заранее заданных значений для поочерёдного многократного запуска утилиты.
Эксперименты с разрешением фрагментов 2048х2048 и попытке взять строку из 12 в данном случае фрагментов иногда приводят к такой ошибке:
Код: Выделить всё
C:\OSGeo4W64>gdal_translate -srcwin 0 0 24576 2048 -of GTIFF ogc_wms.xml d:\temp
\29.tif
Input file size is 47104, 2048
0ERROR 1: GDALWMS: Unable to download block 4, 0.
URL: http://.................................
HTTP status code: 0, error: Failed connect to ........ :80; Connection
refused.
ERROR 1: ogc_wms.xml, band 1: IReadBlock failed at X offset 0, Y offset 0
ERROR 1: GetBlockRef failed at X block offset 0, Y block offset 0
Похоже на то, что возрастает количество HTTP запросов и серверу это не нравится. При запросе отдельных фрагментов 2048х2048 ошибок не наблюдается.
Re: Грабим WMS сервера с помощью GDAL
Добавлено: 21 апр 2015, 09:29
SergeyRyzhkov
Landser, сделайте "скрипт" в MS Excel

)))
посредством формулы, которую можно скопировать в другие строки (с авторасчетом), получите строки запросов. Потом в батник и вперед...
Re: Грабим WMS сервера с помощью GDAL
Добавлено: 21 апр 2015, 21:26
Landser
Сергей, алгоритм работы батника примерно такой:
Landser писал(а): Запускается счётчик цифрового имени выходного файла от 1 до максимального количества строк +1. Считываются начальные значения севера и юга для строки из ogc_wms.xml. Выполняется команда взятия строки с переменной в имени выходного файла. Вычисляются значения севера и юга для следующей строки, которые записываются в ogc_wms.xml. Переход к счётчику. Если счётчиком достигнуто максимальное количество строк +1, то происходит остановка.
Значение <UpperLeftY> считывать не нужно. Значение <LowerRightY> считывается из ogc_wms.xml.
Формулы простые:
Код: Выделить всё
<UpperLeftY>new=<LowerRightY>+200
<LowerRightY>new=<LowerRightY>+200-10240
Вычисленные значения <UpperLeftY> и <LowerRightY> записываются в ogc_wms.xml. 200 - это поправка на перекрытие ватермарка, 1024 - это высота строки в геометрах = разрешение фрагмента по Y (2048 пикселей) умноженное на масштабный коэффициент карты (5 метров на пиксель).
Проблема правильно написать нужный батник, т.к. последний раз программировал лет так 25 назад на Бейсике.
