Страница 1 из 2
Вызов GRASS GIS из скрипта на Python
Добавлено: 04 ноя 2013, 09:13
KolesovDmitry
Написал небольшую статью-заметку
http://gis-lab.info/qa/grass-external-scripting.html
Прошу просмотреть и высказать советы и замечания
Re: Вызов GRASS GIS из скрипта на Python
Добавлено: 04 ноя 2013, 09:33
Александр Мурый
Во-первых, спасибо, Дмитрий
Вот замечания:
- Shebang для Питона в линуксах рекомендуется использовать всё-таки такой:
- Я бы сказал в тексте, что пример скрипта на базе стандартного набора данных NC по Сев. Каролине. А ещё лучше бы сделать по нашему Геосэмплу, наверное. Чтоб юзеру можно было быстро скачать (NC весит прилично) и быстро попробовать, не создавая при этом область/набор.
Re: Вызов GRASS GIS из скрипта на Python
Добавлено: 04 ноя 2013, 11:30
KolesovDmitry
Спасибо за замечания, исправил скрипт. Прописал в тексте, что используется наш геосемпл.
Re: Вызов GRASS GIS из скрипта на Python
Добавлено: 17 дек 2014, 19:35
kate_lpsv
Спасибо за статью. Я повторила все действия по созданию автономного скрипта и всё получилось.
Но у меня вот такой вопрос.
Я бы хотела вызвать из автономного скрипта под 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?
Re: Вызов GRASS GIS из скрипта на Python
Добавлено: 21 дек 2014, 19:46
KolesovDmitry
Под линуксом запускается, под win попробовать не могу.
А запускается ли у вас вообще этот g.gui без всякого скрипта, а просто из командной строки (может ошибка не в скрипте вообще)?
Re: Вызов GRASS GIS из скрипта на Python
Добавлено: 17 мар 2015, 23:05
Sasfeat
Дмитрий, благодарю за статью!
Есть вопрос:
Запускаю следующий скрипт
Код: Выделить всё
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 *
Есть мысли, в чем может быть проблема?
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.* должно быть примерно то же самое.
Re: Вызов GRASS GIS из скрипта на Python
Добавлено: 18 мар 2015, 16:43
Sasfeat
Александр, спасибо за ответ!
и как сразу не подумал, что python 34 тут не подойдет...
Re: Вызов GRASS GIS из скрипта на Python
Добавлено: 18 мар 2015, 23:02
Sasfeat
В дополнение к вышезаданному вопросу.
Нужно задать параметры 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 проводится запуск скрипта?
Re: Вызов GRASS GIS из скрипта на Python
Добавлено: 18 мар 2015, 23:23
Александр Мурый
У вас пробелы в путях к интерпретатору, поэтому ошибка. По умолчанию питоновский инсталлятор предлагает ставить в корень диска C, что и рекомендуется обычно.
Sasfeat писал(а):
Нужно задать параметры location и mapset , основу по созданию брал из этой статьи
У меня же в примере уже было задано? Или я что-то не так понял?
P.S. понял - у вас создаётся _новая_ область.
Sasfeat писал(а):
ps Да, важно через какой интерпретатор python проводится запуск скрипта?
Интересный вопрос, надо попробовать опытным путём разные варианты.
Re: Вызов GRASS GIS из скрипта на Python
Добавлено: 18 мар 2015, 23:37
Sasfeat
У вас пробелы в путях к интерпретатору, поэтому ошибка. По умолчанию питоновский инсталлятор предлагает ставить в корень диска C, что и рекомендуется обычно.
Да вроде как в корне интерпретатор то..
Новая область, прошу прощения)
На счет пробелов до директории с grass: без части кода где создается область - все работает.
Re: Вызов GRASS GIS из скрипта на Python
Добавлено: 18 мар 2015, 23:44
Александр Мурый
А если просто переустановить GRASS в директорию без пробелов? Или, может, как-то заэкранировать (кавычками?) пробелы в путях?
Re: Вызов GRASS GIS из скрипта на Python
Добавлено: 19 мар 2015, 00:10
Sasfeat
А если просто переустановить GRASS в директорию без пробелов? Или, может, как-то заэкранировать (кавычками?) пробелы в путях?
Экранирование спасло, спасибо!
Re: Вызов GRASS GIS из скрипта на Python
Добавлено: 19 мар 2015, 00:25
Александр Мурый
Покажите, как именно вы сделали, пож-та.
Re: Вызов GRASS GIS из скрипта на Python
Добавлено: 19 мар 2015, 01:06
Sasfeat
Код: Выделить всё
grass7bin = "\"C:/Program Files/GRASS GIS 7.0.0/grass70.bat\""