Создание WMS сервера на базе GRASS GIS и Pyramid: различия между версиями
Строка 32: | Строка 32: | ||
# Добавляем путь модулям GRASS в системные пути | # Добавляем путь модулям GRASS в системные пути | ||
sys.path.append("%s/etc/python" % gisbase) | sys.path.append("%s/etc/python" % gisbase) | ||
# Импортируем библиотеки GRASS | # Импортируем библиотеки GRASS | ||
from grass.script import core as grass | from grass.script import core as grass | ||
from grass.script import setup as gsetup | from grass.script import setup as gsetup | ||
# Инициализируем GRASS | # Инициализируем GRASS | ||
gsetup.init(gisbase, gisdbase, | gsetup.init(gisbase, gisdbase, | ||
location, mapset) | location, mapset) | ||
vector_layers = grass.list_strings("vect") | vector_layers = grass.list_strings("vect") | ||
raster_layers = grass.list_strings("rast") | raster_layers = grass.list_strings("rast") | ||
grass.run_command("g.region", w=bbox[0], s=bbox[1], e=bbox[2], n=bbox[3]) | grass.run_command("g.region", w=bbox[0], s=bbox[1], e=bbox[2], n=bbox[3]) | ||
# Создание временного файла | # Создание временного файла | ||
tempfile = grass.tempfile() | tempfile = grass.tempfile() | ||
filename = "%s.png" % tempfile | filename = "%s.png" % tempfile | ||
grass.run_command("d.mon", | grass.run_command("d.mon", | ||
start="cairo", | start="cairo", | ||
Строка 60: | Строка 60: | ||
elif layer in vector_layers: | elif layer in vector_layers: | ||
grass.run_command("d.vect", map=layer, quiet=1, fcolor="0:0:255", color=None) | grass.run_command("d.vect", map=layer, quiet=1, fcolor="0:0:255", color=None) | ||
grass.run_command("d.mon", stop="cairo") | grass.run_command("d.mon", stop="cairo") | ||
return filename | return filename | ||
== Ограничения данной реализации == | == Ограничения данной реализации == |
Версия от 12:01, 4 мая 2014
В данной статье описывается простейший пример создания WMS сервера на базе геоинформационной системы GRASS. Доступ к данным организован при помощи фреймворка Pyramid.
Данная статья является расширенным переводом с английского языка статьи GRASS GIS Web Map Service with Pyramid.
Общие сведения
Статья расчитана на читателя, который на базовом уровне знаком с геоинформационной системой GRASS и языком программирования Python. В частности, читатель должен представлять, как происходит вызов команд GRASS на языке Python и быть знакомым с основами использования фреймворка Pyramid.
В статье испольуется GRASS версии 6.4 (тем не менее, изменения в приведенном коде для GRASS 7 должны быть минимальными).
Архитектура системы
В основе WMS сервера будет лежать модуль d.mon, отвечающий за отрисовку геоданных. При этом будет использоваться графический драйвер Cairo, который позволяет генерировать изображения в форматах PNG, BMP, PPM, PS, PDF и SVG.
Для реализации сервера потребуется создать подсистемы, служащие для:
- Настройки путей к GRASS.
- Получения и анализа параметров запроса WMS.
- Отрисовки слоев по запросу клиента и сохранения результата в графический файл.
- Возвращения результата обработки запроса клиенту.
Собственно к GRASS относятся первый и третий пункты, остальные --- обычные действия, которые реализуются при помощи Pyramid и с GRASS никак не связаны. Поэтому для простоты изложения и реализации объединим первый и третий пункты в виде одной функции.
Реализация
Настройка путей GRASS и обработка запроса клиента
def _grass_wms(layers=[], bbox=[], width=256, height=256): # Прописываем пути к GRASS. Исправить под свои нужды. gisdbase = "/home/username/GRASSDATA" location = "Moscow" mapset = "PERMANENT" gisbase = os.environ["GISBASE"] = "/usr/lib64/grass-6.4.3" # Добавляем путь модулям GRASS в системные пути sys.path.append("%s/etc/python" % gisbase) # Импортируем библиотеки GRASS from grass.script import core as grass from grass.script import setup as gsetup # Инициализируем GRASS gsetup.init(gisbase, gisdbase, location, mapset) vector_layers = grass.list_strings("vect") raster_layers = grass.list_strings("rast") grass.run_command("g.region", w=bbox[0], s=bbox[1], e=bbox[2], n=bbox[3]) # Создание временного файла tempfile = grass.tempfile() filename = "%s.png" % tempfile grass.run_command("d.mon", start="cairo", width=width, height=height, output=filename) for layer in layers: if layer in raster_layers: grass.run_command("d.rast", map=layer, quiet=1) elif layer in vector_layers: grass.run_command("d.vect", map=layer, quiet=1, fcolor="0:0:255", color=None) grass.run_command("d.mon", stop="cairo") return filename