Вызов GRASS GIS из скрипта на Python: различия между версиями
Строка 14: | Строка 14: | ||
=== Инициализация === | === Инициализация === | ||
==== Теория ==== | |||
Описание этапа инициализации рассматривается в [http://grasswiki.osgeo.org/wiki/GRASS_and_Python#Creating_Python_scripts_that_call_GRASS_functionality_from_outside Wiki проекта GRASS]. В этом подразделе приводится краткий перевод этой страницы. | Описание этапа инициализации рассматривается в [http://grasswiki.osgeo.org/wiki/GRASS_and_Python#Creating_Python_scripts_that_call_GRASS_functionality_from_outside Wiki проекта GRASS]. В этом подразделе приводится краткий перевод этой страницы. | ||
Строка 41: | Строка 42: | ||
export GISRC="$HOME/.grassrc6" | export GISRC="$HOME/.grassrc6" | ||
export PYTHONPATH="$PYTHONPATH:$GISBASE/etc/python" | export PYTHONPATH="$PYTHONPATH:$GISBASE/etc/python" | ||
==== Реализация ==== | |||
import os | |||
import sys | |||
gisbase = os.environ['GISBASE'] = "/usr/lib/grass64" | |||
gisdbase = os.path.join(os.environ['HOME'], "grassdata") | |||
location = "nc_spm_08" | |||
mapset = "user1" | |||
sys.path.append(os.path.join(os.environ['GISBASE'], "etc", "python")) | |||
import grass.script as grass | |||
import grass.script.setup as gsetup | |||
gsetup.init(gisbase, | |||
gisdbase, location, mapset) | |||
print grass.gisenv() | |||
grass.message('Raster maps:') | |||
for rast in grass.list_strings(type = 'rast'): | |||
print rast |
Версия от 09:10, 30 сентября 2013
Чаще всего работа с GRASS GIS происходит в интерактивном режиме, когда пользователь вводит команды в консоли или вызывает их через графический интерфейс пользователя. При необходимости автоматизировать свои действия пользователь может написать скрипт, который будет доступен для повторного использования. Пример создания такого скрипта описывается в статье Создание скрипта на Python для ГИС GRASS. После создания скрипта пользователь может запускать его из консоли, в которой запущена ГИС GRASS.
Однако, иногда может потребоваться полностью автономный скрипт, который может работать, даже если GRASS GIS не запущена, например, при вызове скрипта из какой-либо программы, для того, чтобы выполнить некоторый анализ. Это может быть также полезным при автоматической обработке, когда нужно по расписанию обновлять или генерировать данные и т.д. Возможно также создание таких скриптов, которые автоматически создают проект GRASS, выполняют определенную работу (импортируют данные, анализируют их), и по завершении обработки удаляют проекты. Методика создания подобных скриптов подробно описана в статье On scripting GRASS GIS: Building location-independent command line tools, в данной работе рассматривает лишь небольшая ее часть -- создание скрипта, способного использовать готовые проекты GRASS.
Пример подобного скрипта, написанного на shell, приводится в рецепте, данная статья описывает решение данной задачи для языка Python. Нужно отметить, что описываемый подход можно применить к любому языку программирования, а не только к shell или Python.
Этапы работы
Внешний по отношению к ГИС GRASS скрипт должен реализовать следующие основные этапы обработки:
- Задать значения переменным окружения, которые используются в GRASS GIS (PATH, GISRC и т.д.). Этот этап служит инициализацией и необходим для того, чтобы скрипт был в состоянии определить, где находятся файлы проекта и модули ГИС GRASS и, как следствие, мог их использовать в своей работе.
- Собственно сама обработка данных, состоящая из последовательности команд GRASS GIS. Это основная часть скрипта, в которой пользователь задает последовательность действий, необходимых для того, чтобы выполнить планируемую обработку данных.
- Очистка системы от временных файлов. После выполнения необходимого анализа или действий над исходными данными все вспомогательные файлы следует удалить, чтобы не "мусорить" в системе.
Данные этапы более подробно рассматриваются в последующих подразделах.
Инициализация
Теория
Описание этапа инициализации рассматривается в Wiki проекта GRASS. В этом подразделе приводится краткий перевод этой страницы.
Как было сказано выше, цель этапа инициализации -- установить переменные окружения так, чтобы скрипт мог получить информацию о том, где искать библиотеки GRASS и файлы проекта. Поэтому нужно задать следующие переменные:
- GISBASE путь к каталогу, в котором установлена ГИС GRASS. Узнать значение переменной можно, если запустить GRASS и в консоли выполнить команду:
echo $GISBASE
- PATH системная переменная окружения $PATH, в которой нужно прописать пути каталогам, в которых следует искать скрипты и команды GRASS.
- LD_LIBRARY_PATH переменная, в которой перечисляются все каталоги содержащие пользовательские динамические библиотеки.
- GISRC переменная, содержащая путь к файлу, в котором задаются путь к проекту, области и набору карт. Для ГИС GRASS 6.x этот файл обычно называется .grassrc6, но можно создать свой собственный и прописать туда необходимые сведения.
Если речь идет о скрипте на языке Python, то нужно задать еще переменные окружения, описывающие, где хранится интерпретатор языка:
- PYTHONLIB путь к интерпретатору Python.
- PYTHONPATH эта переменная должна указывать на %GISBASE%\etc\python.
Например, для системы Windows эти переменые могут быть такими (зависит от конкретных путей установки GRASS):
GISBASE= C:\GRASS-64 GISRC= C:\Documents and Settings\user\.grassrc6 LD_LIBRARY_PATH= C:\GRASS-64\lib PATH= C:\GRASS-64\etc;C:\GRASS-64\etc\python;C:\GRASS-64\lib;C:\GRASS-64\bin;C:\GRASS-64\extralib;C:\GRASS-64\msys\bin;C:\Python26; PYTHONLIB= C:\Python26 PYTHONPATH= C:\GRASS-64\etc\python GRASS_SH= C:\GRASS-64\msys\bin\sh.exe
Для Linux переменные могут быть:
export GISBASE="/usr/local/grass-6.4.svn/" export PATH="$PATH:$GISBASE/bin:$GISBASE/scripts" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$GISBASE/lib" export GISRC="$HOME/.grassrc6" export PYTHONPATH="$PYTHONPATH:$GISBASE/etc/python"
Реализация
import os import sys
gisbase = os.environ['GISBASE'] = "/usr/lib/grass64"
gisdbase = os.path.join(os.environ['HOME'], "grassdata") location = "nc_spm_08" mapset = "user1"
sys.path.append(os.path.join(os.environ['GISBASE'], "etc", "python")) import grass.script as grass import grass.script.setup as gsetup
gsetup.init(gisbase, gisdbase, location, mapset)
print grass.gisenv()
grass.message('Raster maps:') for rast in grass.list_strings(type = 'rast'): print rast