Вызов GRASS GIS из скрипта на Python

Обсуждение материалов сайта: вопросы, замечания, предложения
KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Вызов GRASS GIS из скрипта на Python

Сообщение KolesovDmitry » 04 ноя 2013, 09:13

Написал небольшую статью-заметку http://gis-lab.info/qa/grass-external-scripting.html
Прошу просмотреть и высказать советы и замечания

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Вызов GRASS GIS из скрипта на Python

Сообщение Александр Мурый » 04 ноя 2013, 09:33

Во-первых, спасибо, Дмитрий :)
Вот замечания:
- Shebang для Питона в линуксах рекомендуется использовать всё-таки такой:

Код: Выделить всё

#!/usr/bin/env python 
- Я бы сказал в тексте, что пример скрипта на базе стандартного набора данных NC по Сев. Каролине. А ещё лучше бы сделать по нашему Геосэмплу, наверное. Чтоб юзеру можно было быстро скачать (NC весит прилично) и быстро попробовать, не создавая при этом область/набор.
Редактор материалов, модератор форума

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Re: Вызов GRASS GIS из скрипта на Python

Сообщение KolesovDmitry » 04 ноя 2013, 11:30

Спасибо за замечания, исправил скрипт. Прописал в тексте, что используется наш геосемпл.

kate_lpsv
Новоприбывший
Сообщения: 1
Зарегистрирован: 17 дек 2013, 11:42
Репутация: 0

Re: Вызов GRASS GIS из скрипта на Python

Сообщение kate_lpsv » 17 дек 2014, 19:35

Спасибо за статью. Я повторила все действия по созданию автономного скрипта и всё получилось.

Но у меня вот такой вопрос.

Я бы хотела вызвать из автономного скрипта под Windows g.gui, чтобы запустить GRASS6
Делаю следующим образом:
Создала переменные окружения, далее
import os
import sys
gisbase = os.environ['GISBASE']
gisdbase = "d:\\grassdata"
location = "XYLocation"
mapset="PERMANENT"
import grass.script as grass
import grass.script.setup as qsetup
gsetup.init(gisbase, gisdbase, location, mapset)
print grass.gisenv()
grass.run_command("g.gui")

В командной строке пишет : Launching 'wxpython' GUI in the background, please wait....
a затем появляется окошко g.gui.exe c сообщением : g.gui.exe - обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобство.


Можно ли как-то вызвать g.gui GRASS из Python?

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Re: Вызов GRASS GIS из скрипта на Python

Сообщение KolesovDmitry » 21 дек 2014, 19:46

Под линуксом запускается, под win попробовать не могу.

А запускается ли у вас вообще этот g.gui без всякого скрипта, а просто из командной строки (может ошибка не в скрипте вообще)?

Аватара пользователя
Sasfeat
Интересующийся
Сообщения: 36
Зарегистрирован: 20 фев 2013, 18:18
Репутация: 13
Откуда: Ухань
Контактная информация:

Re: Вызов GRASS GIS из скрипта на Python

Сообщение Sasfeat » 17 мар 2015, 23:05

Дмитрий, благодарю за статью!
Есть вопрос:
Запускаю следующий скрипт

Код: Выделить всё

import os,sys
gisbase=os.environ['GISBASE']="C:\\OSGeo4W\\apps\\grass\\grass-6.4.4"
gisdbase=os.path.join('C:/temp',"grassdata")
location="geosample"
mapset="PERMANENT"
sys.path.append(os.path.join(gisbase,"etc","python"))
import grass.script as grass
import grass.script.setup as gsetup
gsetup.init(gisbase,gisdbse,location,mapset)
print( grass.gisenv())
выдает ошибку(скрин во вложении)

указывал в переменную gisbase путь как до standalone версии grass , так и до установленной в osgeo

файл в котором прописаны модули для импорта имеет следующее содержание

Код: Выделить всё

"""Python interface to launch GRASS GIS modules in scripts
"""

from core   import *
from db     import *
from raster import *
from raster3d import *
from vector import *
from utils import *
Есть мысли, в чем может быть проблема?
Вложения
grass_exec_1.png
grass_exec_1.png (6.95 КБ) 23897 просмотров

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Вызов GRASS GIS из скрипта на Python

Сообщение Александр Мурый » 18 мар 2015, 02:29

Главная проблема в том, что у вас работает Python 3.4, а для GRASS нужен версии 2.*
На свежем Python 2.7 в Win работает вот такой скрипт (взято отсюда и подрихтовано):

Код: Выделить всё


import os
import sys
import subprocess

grass7bin = r'C:\GRASS_GIS_7.0.0\grass70.bat'

# Set GISBASE environment variable
gisbase = os.environ['GISBASE'] = r'C:\GRASS_GIS_7.0.0'
os.environ['PATH'] += os.pathsep + os.path.join(gisbase, 'extrabin')

# Set GISDBASE environment variable
gisdb = os.environ['GISDBASE'] = os.path.join('E:/', 'grassdata')
location = 'demolocation'
mapset = 'PERMANENT'

# define GRASS-Python environment
gpydir = os.path.join(gisbase, 'etc', 'python')
sys.path.append(gpydir)

# import GRASS Python bindings
import grass.script as gscript
import grass.script.setup as gsetup

# query GRASS 7 itself for its GISBASE
startcmd = [grass7bin, '--config', 'path']

p = subprocess.Popen(startcmd, shell=False,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
if p.returncode != 0:
print >>sys.stderr, "ERROR: Cannot find GRASS GIS 7 start script (%s)" % startcmd
sys.exit(-1)

###########
# launch session
gsetup.init(gisbase,
gisdb, location, mapset)

gscript.message('Current GRASS GIS 7 environment:')
print gscript.gisenv()

gscript.message('Available raster maps:')
for rast in gscript.list_strings(type = 'rast'):
print rast

gscript.message('Available vector maps:')
for vect in gscript.list_strings(type = 'vect'):
print vect


Для GRASS 6.4.* должно быть примерно то же самое.
Редактор материалов, модератор форума

Аватара пользователя
Sasfeat
Интересующийся
Сообщения: 36
Зарегистрирован: 20 фев 2013, 18:18
Репутация: 13
Откуда: Ухань
Контактная информация:

Re: Вызов GRASS GIS из скрипта на Python

Сообщение Sasfeat » 18 мар 2015, 16:43

Александр, спасибо за ответ!
и как сразу не подумал, что python 34 тут не подойдет...

Аватара пользователя
Sasfeat
Интересующийся
Сообщения: 36
Зарегистрирован: 20 фев 2013, 18:18
Репутация: 13
Откуда: Ухань
Контактная информация:

Re: Вызов GRASS GIS из скрипта на Python

Сообщение Sasfeat » 18 мар 2015, 23:02

В дополнение к вышезаданному вопросу.
Нужно задать параметры location и mapset , основу по созданию брал из этой статьи

grasswiki.osgeo.org/wiki/Working_with_GRASS_without_starting_it_explicitly

Код: Выделить всё

import os
import sys
import subprocess
import shutil
import binascii
import tempfile

grass7bin = r'C:\Program Files\GRASS GIS 7.0.0\grass70.bat'
myepsg = '32637'
myfile = r'C:\temp\service_tests\layers\b9.tif'

# Set GISBASE environment variable
gisbase = os.environ['GISBASE'] = 'C:\\Program Files\\GRASS GIS 7.0.0'
os.environ['PATH'] += os.pathsep + os.path.join(gisbase, 'extrabin')

# Set GISDBASE environment variable
gisdb = os.environ['GISDBASE'] = os.path.join(r'C:\Users\Alex\Documents', 'grassdata')
location = 'demolocation2'
mapset = 'PERMANENT'

# define GRASS-Python environment
gpydir = os.path.join(gisbase, 'etc', 'python')
sys.path.append(gpydir)

# import GRASS Python bindings
import grass.script as gscript
import grass.script.setup as gsetup

# query GRASS 7 itself for its GISBASE
startcmd = [grass7bin, '--config', 'path']
 
p = subprocess.Popen(startcmd, shell=False,
                     stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
if p.returncode != 0:
        print >>sys.stderr, "ERROR: Cannot find GRASS GIS 7 start script (%s)" % startcmd
        sys.exit(-1)

###########
# launch session
gsetup.init(gisbase,
            gisdb, location, mapset)
 
gscript.message('Current GRASS GIS 7 environment:')
print gscript.gisenv()

# location/mapset: use random names for batch jobs
string_length = 16
location = binascii.hexlify(os.urandom(string_length))
mapset   = 'PERMANENT'
location_path = os.path.join(gisdb, location)

# Create new location (we assume that grass7bin is in the PATH)
#  from EPSG code:
startcmd = grass7bin + ' -c epsg:' + myepsg + ' -e ' + location_path
#  from SHAPE or GeoTIFF file
#startcmd = grass7bin + ' -c ' + myfile + ' -e ' + location_path
 
print startcmd
p = subprocess.Popen(startcmd, shell=True, 
                     stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
if p.returncode != 0:
    print >>sys.stderr, 'ERROR: %s' % err
    print >>sys.stderr, 'ERROR: Cannot generate location (%s)' % startcmd
    sys.exit(-1)
else:
    print 'Created location %s' % location_path
 
# Now the location with PERMANENT mapset exists.

gscript.run_command('r.in.gdal',input='C:\temp\service_tests\layers\b9.tif',output='test')
Александр, скрипт, который вы прикрепили работает. Добавил к нему немного кода и ...
Буду благодарен, если поможете разобраться.

ps Да, важно через какой интерпретатор python проводится запуск скрипта?
Вложения
grass_exec_2.png
grass_exec_2.png (12.48 КБ) 23794 просмотра

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Вызов GRASS GIS из скрипта на Python

Сообщение Александр Мурый » 18 мар 2015, 23:23

У вас пробелы в путях к интерпретатору, поэтому ошибка. По умолчанию питоновский инсталлятор предлагает ставить в корень диска C, что и рекомендуется обычно.
Sasfeat писал(а): Нужно задать параметры location и mapset , основу по созданию брал из этой статьи
У меня же в примере уже было задано? Или я что-то не так понял?
P.S. понял - у вас создаётся _новая_ область.
Sasfeat писал(а): ps Да, важно через какой интерпретатор python проводится запуск скрипта?
Интересный вопрос, надо попробовать опытным путём разные варианты.
Редактор материалов, модератор форума

Аватара пользователя
Sasfeat
Интересующийся
Сообщения: 36
Зарегистрирован: 20 фев 2013, 18:18
Репутация: 13
Откуда: Ухань
Контактная информация:

Re: Вызов GRASS GIS из скрипта на Python

Сообщение Sasfeat » 18 мар 2015, 23:37

У вас пробелы в путях к интерпретатору, поэтому ошибка. По умолчанию питоновский инсталлятор предлагает ставить в корень диска C, что и рекомендуется обычно.
Да вроде как в корне интерпретатор то..
Новая область, прошу прощения)
На счет пробелов до директории с grass: без части кода где создается область - все работает.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Вызов GRASS GIS из скрипта на Python

Сообщение Александр Мурый » 18 мар 2015, 23:44

А если просто переустановить GRASS в директорию без пробелов? Или, может, как-то заэкранировать (кавычками?) пробелы в путях?
Редактор материалов, модератор форума

Аватара пользователя
Sasfeat
Интересующийся
Сообщения: 36
Зарегистрирован: 20 фев 2013, 18:18
Репутация: 13
Откуда: Ухань
Контактная информация:

Re: Вызов GRASS GIS из скрипта на Python

Сообщение Sasfeat » 19 мар 2015, 00:10

А если просто переустановить GRASS в директорию без пробелов? Или, может, как-то заэкранировать (кавычками?) пробелы в путях?
Экранирование спасло, спасибо!

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Вызов GRASS GIS из скрипта на Python

Сообщение Александр Мурый » 19 мар 2015, 00:25

Покажите, как именно вы сделали, пож-та.
Редактор материалов, модератор форума

Аватара пользователя
Sasfeat
Интересующийся
Сообщения: 36
Зарегистрирован: 20 фев 2013, 18:18
Репутация: 13
Откуда: Ухань
Контактная информация:

Re: Вызов GRASS GIS из скрипта на Python

Сообщение Sasfeat » 19 мар 2015, 01:06

Код: Выделить всё

grass7bin = "\"C:/Program Files/GRASS GIS 7.0.0/grass70.bat\""

Ответить

Вернуться в «Материалы сайта»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 17 гостей