Вызов GRASS GIS из скрипта на Python
-
- Гуру
- Репутация: 123
- Откуда: Казань
Вызов GRASS GIS из скрипта на Python
Написал небольшую статью-заметку http://gis-lab.info/qa/grass-external-scripting.html
Прошу просмотреть и высказать советы и замечания
Прошу просмотреть и высказать советы и замечания
-
- Гуру
- Репутация: 793
- Ваше звание: званий не имею
- Откуда: Москва
Re: Вызов GRASS GIS из скрипта на Python
Во-первых, спасибо, Дмитрий 
Вот замечания:
- Shebang для Питона в линуксах рекомендуется использовать всё-таки такой:
- Я бы сказал в тексте, что пример скрипта на базе стандартного набора данных NC по Сев. Каролине. А ещё лучше бы сделать по нашему Геосэмплу, наверное. Чтоб юзеру можно было быстро скачать (NC весит прилично) и быстро попробовать, не создавая при этом область/набор.

Вот замечания:
- Shebang для Питона в линуксах рекомендуется использовать всё-таки такой:
Код: Выделить всё
#!/usr/bin/env python
Редактор материалов, модератор форума
-
- Гуру
- Репутация: 123
- Откуда: Казань
Re: Вызов GRASS GIS из скрипта на Python
Спасибо за замечания, исправил скрипт. Прописал в тексте, что используется наш геосемпл.
-
- Новоприбывший
- Сообщения: 1
- Зарегистрирован: 17 дек 2013, 11:42
- Репутация: 0
Re: Вызов GRASS GIS из скрипта на Python
Спасибо за статью. Я повторила все действия по созданию автономного скрипта и всё получилось.
Но у меня вот такой вопрос.
Я бы хотела вызвать из автономного скрипта под 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?
Но у меня вот такой вопрос.
Я бы хотела вызвать из автономного скрипта под 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?
-
- Гуру
- Репутация: 123
- Откуда: Казань
Re: Вызов GRASS GIS из скрипта на Python
Под линуксом запускается, под win попробовать не могу.
А запускается ли у вас вообще этот g.gui без всякого скрипта, а просто из командной строки (может ошибка не в скрипте вообще)?
А запускается ли у вас вообще этот g.gui без всякого скрипта, а просто из командной строки (может ошибка не в скрипте вообще)?
- Sasfeat
- Интересующийся
- Репутация: 13
- Откуда: Ухань
- Контактная информация:
Re: Вызов GRASS GIS из скрипта на Python
Дмитрий, благодарю за статью!
Есть вопрос:
Запускаю следующий скрипт
выдает ошибку(скрин во вложении)
указывал в переменную gisbase путь как до standalone версии grass , так и до установленной в osgeo
файл в котором прописаны модули для импорта имеет следующее содержание
Есть мысли, в чем может быть проблема?
Есть вопрос:
Запускаю следующий скрипт
Код: Выделить всё
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 (6.95 КБ) 22094 просмотра
-
- Гуру
- Репутация: 793
- Ваше звание: званий не имею
- Откуда: Москва
Re: Вызов GRASS GIS из скрипта на Python
Главная проблема в том, что у вас работает Python 3.4, а для GRASS нужен версии 2.*
На свежем Python 2.7 в Win работает вот такой скрипт (взято отсюда и подрихтовано):
Для GRASS 6.4.* должно быть примерно то же самое.
На свежем 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
- Интересующийся
- Репутация: 13
- Откуда: Ухань
- Контактная информация:
Re: Вызов GRASS GIS из скрипта на Python
Александр, спасибо за ответ!
и как сразу не подумал, что python 34 тут не подойдет...
и как сразу не подумал, что python 34 тут не подойдет...
- Sasfeat
- Интересующийся
- Репутация: 13
- Откуда: Ухань
- Контактная информация:
Re: Вызов GRASS GIS из скрипта на Python
В дополнение к вышезаданному вопросу.
Нужно задать параметры location и mapset , основу по созданию брал из этой статьи
grasswiki.osgeo.org/wiki/Working_with_GRASS_without_starting_it_explicitly
Александр, скрипт, который вы прикрепили работает. Добавил к нему немного кода и ...
Буду благодарен, если поможете разобраться.
ps Да, важно через какой интерпретатор python проводится запуск скрипта?
Нужно задать параметры 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 (12.48 КБ) 21991 просмотр
-
- Гуру
- Репутация: 793
- Ваше звание: званий не имею
- Откуда: Москва
Re: Вызов GRASS GIS из скрипта на Python
У вас пробелы в путях к интерпретатору, поэтому ошибка. По умолчанию питоновский инсталлятор предлагает ставить в корень диска C, что и рекомендуется обычно.
P.S. понял - у вас создаётся _новая_ область.
У меня же в примере уже было задано? Или я что-то не так понял?Sasfeat писал(а): Нужно задать параметры location и mapset , основу по созданию брал из этой статьи
P.S. понял - у вас создаётся _новая_ область.
Интересный вопрос, надо попробовать опытным путём разные варианты.Sasfeat писал(а): ps Да, важно через какой интерпретатор python проводится запуск скрипта?
Редактор материалов, модератор форума
- Sasfeat
- Интересующийся
- Репутация: 13
- Откуда: Ухань
- Контактная информация:
Re: Вызов GRASS GIS из скрипта на Python
Да вроде как в корне интерпретатор то..У вас пробелы в путях к интерпретатору, поэтому ошибка. По умолчанию питоновский инсталлятор предлагает ставить в корень диска C, что и рекомендуется обычно.
Новая область, прошу прощения)
На счет пробелов до директории с grass: без части кода где создается область - все работает.
-
- Гуру
- Репутация: 793
- Ваше звание: званий не имею
- Откуда: Москва
Re: Вызов GRASS GIS из скрипта на Python
А если просто переустановить GRASS в директорию без пробелов? Или, может, как-то заэкранировать (кавычками?) пробелы в путях?
Редактор материалов, модератор форума
- Sasfeat
- Интересующийся
- Репутация: 13
- Откуда: Ухань
- Контактная информация:
Re: Вызов GRASS GIS из скрипта на Python
Экранирование спасло, спасибо!А если просто переустановить GRASS в директорию без пробелов? Или, может, как-то заэкранировать (кавычками?) пробелы в путях?
-
- Гуру
- Репутация: 793
- Ваше звание: званий не имею
- Откуда: Москва
Re: Вызов GRASS GIS из скрипта на Python
Покажите, как именно вы сделали, пож-та.
Редактор материалов, модератор форума
- Sasfeat
- Интересующийся
- Репутация: 13
- Откуда: Ухань
- Контактная информация:
Re: Вызов GRASS GIS из скрипта на Python
Код: Выделить всё
grass7bin = "\"C:/Program Files/GRASS GIS 7.0.0/grass70.bat\""
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость