Создание WMS сервера на базе GRASS GIS и Pyramid: различия между версиями

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Строка 21: Строка 21:


== Реализация ==
== Реализация ==
=== Настройка путей 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


== Ограничения данной реализации ==
== Ограничения данной реализации ==

Версия от 12:00, 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.

Для реализации сервера потребуется создать подсистемы, служащие для:

  1. Настройки путей к GRASS.
  2. Получения и анализа параметров запроса WMS.
  3. Отрисовки слоев по запросу клиента и сохранения результата в графический файл.
  4. Возвращения результата обработки запроса клиенту.

Собственно к 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

Ограничения данной реализации