Страница 1 из 1
Задать location программно
Добавлено: 27 фев 2013, 09:27
bolotoved
Был у меня скрипт на Python для GRASS 6.4.2, но в 6.4.3RC2 он не работает:
Код: Выделить всё
env = grass.gisenv()
grass.create_location(dbase = env["GISDBASE"], location = tile, proj4 = grassparam.proj4, datum='wgs84')
Первая строка в связи с изменением синтаксиса в 6.4.3RC2 будет выглядеть так:
А вот как изменить вторую строку так и не понял. В ответ на команду env["GISDBASE"] GRASS выдает:
Код: Выделить всё
TypeError: 'function' object is not subscriptable
Re: Задать location программно
Добавлено: 27 фев 2013, 10:40
KolesovDmitry
Скорее всего строка
делает не то, что ты ожидал. Тут просто создается ссылка на функцию grass.gisenv, которую теперь можно вызывать по новому имени env:
А по существу вопроса ответить не могу -- у меня старая версия GRASS. А что выводят строки:
Re: Задать location программно
Добавлено: 27 фев 2013, 11:04
bolotoved
Код: Выделить всё
>>> print grass.gisenv
<function gisenv at 0x00C42830>
Код: Выделить всё
>>> print grass.gisenv()
"g.gisenv" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
{}
>>>
Re: Задать location программно
Добавлено: 27 фев 2013, 12:41
KolesovDmitry
Почему-то мне кажется, что дело не в том, что поменялся синтаксис вызова функции, а в том, что она просто отрабатывает с ошибкой. Где-то внутри ее вызывается команда
g.gisenv, которую грасс не может найти. Можешь заглянуть в исходники функции
grass.gisenv(), чтобы проверить эту мысль? Второй вариант, как можно проверить, это вместо
Код: Выделить всё
grass.create_location(dbase = env["GISDBASE"], location = tile, proj4 = grassparam.proj4, datum='wgs84')
прописать руками пути к БД грасс и области, задать проекцию руками и тп., и посмотреть, что получится:
Код: Выделить всё
grass.create_location(dbase = ..., location = ..., proj4 = ..., datum='wgs84')
Re: Задать location программно
Добавлено: 27 фев 2013, 13:11
Александр Мурый
bolotoved писал(а):
Первая строка в связи с изменением синтаксиса в 6.4.3RC2 будет выглядеть так:
Откуда информация про смену синтаксиса? У меня в 6.4.3svn (обновлена сегодня) с питоном версии 2.7.3 конструкция "env = grass.gisenv()" работает. Скобки в любом случае здесь нужны для того, чтобы получить вывод функции (т.е. то, что она возвращает).
Замечание: все имена лучше таки брать в скобки (location = 'tile')
bolotoved писал(а):Код: Выделить всё
grass.create_location(dbase = env["GISDBASE"], location = tile, proj4 = grassparam.proj4, datum='wgs84')
Что представляет собой "grassparam.proj4"? Если это переменная, как она была задана?
bolotoved писал(а):
А вот как изменить вторую строку так и не понял. В ответ на команду env["GISDBASE"] GRASS выдает:
Код: Выделить всё
TypeError: 'function' object is not subscriptable
Подозреваю, что это может быть как раз из-за "grassparam.proj4".
Кстати, какая версия питона используется?
Re: Задать location программно
Добавлено: 27 фев 2013, 13:56
Александр Мурый
Ещё, на всякий случай. Выяснил новую для себя вещь. Строку с СК/проекцией текущей области в формате PROJ.4 можно получить на питоне так:
Код: Выделить всё
proj = grass.read_command('g.proj', flags = 'j' + 'f').strip()
Re: Задать location программно
Добавлено: 27 фев 2013, 18:43
bolotoved
Проблема решилась после переустановки GRASS: заработал исходный код, приведенный в самом начале.
Александр Мурый писал(а):все имена лучше таки брать в скобки (location = 'tile')
это переменная
Александр Мурый писал(а):Что представляет собой "grassparam.proj4"?
тоже переменная: , там все -- переменные

KolesovDmitry писал(а):
Кстати, какая версия питона используется?
- та, что идет в поставке qgis-dev - 2.7.2
В общем, если выкинуть все переменные, работающий код таков:
Код: Выделить всё
import grass.script as grass
grass.create_location(dbase = 'E:\Exp\DBGRASS', location='test', proj4='+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs', datum='wgs84')
команда gisenv действительно должна быть со скобками: