При переезде на новый физический сервер возникла потребность заново создать огромное число слоёв в geoserver, типа coverage.
Дополнительная сложность заключается в том, что каждый слой представлен geotiff-ом в файловой системе, а не в БД.
Для того, чтобы автоматизировать процесс, с помощью REST API и питона напишем скрипт.
1. Установка pycurl
curl - свободная, кроссплатформенная служебная программа командной строки для копирования файлов по различным протоколам с синтаксисом URL. (http://en.wikipedia.org/wiki/CURL)
Для того, чтобы использовать её функции в питоне, существует библиотека pycurl, инсталлируемая отдельно. (http://pycurl.sourceforge.net/)
Используем python 2.7
Устанавливаем pycurl, взяв пакет установки отсюда http://www.lfd.uci.edu/~gohlke/pythonlibs/
Теперь его легко использовать, без дополнительных действий:
2. На примере карты июльского климата добавим и опубликуем слой скриптом, не заходя в интерфейс геосервера вообще:
# Подключаем pycurl
import pycurl
# Инициализируем его в переменную
c = pycurl.Curl()
# Работаем с уже существующим workspace-ом geoportal-nevsky
c.setopt (c.URL, 'http://195.70.211.245:8080/geoserver/rest/workspaces/geoportal-nevsky/coveragestores?configure=all')
# Указываем данные авторизации
c.setopt (c.USERPWD, '<user>:<password>')
# Указываем, в чем вещаем
c.setopt (c.HTTPHEADER, ["Content-type: text/xml"])
# Собственно добавляем в нащ workspace новый store с именем July_Climat_1, источник данных - файловая система и geotiff.
c.setopt (c.POSTFIELDS, '<coverageStore><name>July_Climat_1</name><enabled>true</enabled><type>GeoTIFF</type><url>file://S:\Geoportal DATA\Raster DATA\Thematic Maps\Climatology\July_Climat_1.tif</url></coverageStore>')
# Выполняем запрос - мы создали store
c.perform()
# Теперь нужно опубликовать из него слой. Сначала переходим к URL-у нашего store
c.setopt (c.URL, 'http://195.70.211.245:8080/geoserver/rest/workspaces/geoportal-nevsky/coveragestores/July_Climat_1/coverages')
# Теперь делаем запрос, в котором все параметры публикации
c.setopt (c.POSTFIELDS, '<coverage><name>July_Climat_1</name><title>July_Climat_1</title><srs>EPSG:900913</srs><projectionPolicy>FORCE_DECLARED</projectionPolicy><parameters><entry><string>InputTransparentColor</string><string>#00FF00</string></entry><entry><string>SUGGESTED_TILE_SIZE</string><string>512,512</string></entry></parameters></coverage>')
# стоит обратить внимание, что родные проекция и СК не указываются - так он будет брать их из geotiff-а, но указываем srs публикации и велим принудительно её использовать. Также здесь мы задаем цвет прозрачности и предпочтительный размер тайла.
# Выполняем
c.perform()
Чудесным образом слой со всеми необходимыми параметрами добавляется в geoserver. Не заходя туда я добавляю его по WMS в геопортал и всё работает:
Теперь не составит труда расширить скрипт, чтобы он прошелся по всем нужным растрам и добавил кучу слоёв.
Для того, чтобы посмотреть в полном виде рестовское описание слоя, можно открыть в браузере вот что:
http://195.70.211.245:8080/geoserver/rest/workspaces/geoportal-nevsky/coveragestores/July_Climat_1/coverages/July_Climat_1.xml
Можно добавить и настроить слой с помощью интерфейса geoserver, потом таким образом посмотреть его xml представление и понять, как обращаться к REST API.