Задать location программно

Ответить
bolotoved
Гуру
Сообщения: 920
Зарегистрирован: 30 дек 2008, 14:11
Репутация: 236
Откуда: Ханты-Мансийск
Контактная информация:

Задать location программно

Сообщение bolotoved » 27 фев 2013, 09:27

Был у меня скрипт на 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 = grass.gisenv
А вот как изменить вторую строку так и не понял. В ответ на команду env["GISDBASE"] GRASS выдает:

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

TypeError: 'function' object is not subscriptable
Последний раз редактировалось bolotoved 27 фев 2013, 18:45, всего редактировалось 1 раз.

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

Re: Задать location программно

Сообщение KolesovDmitry » 27 фев 2013, 10:40

Скорее всего строка

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

env = grass.gisenv
делает не то, что ты ожидал. Тут просто создается ссылка на функцию grass.gisenv, которую теперь можно вызывать по новому имени env: А по существу вопроса ответить не могу -- у меня старая версия GRASS. А что выводят строки:

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

print grass.gisenv
print grass.gisenv()

bolotoved
Гуру
Сообщения: 920
Зарегистрирован: 30 дек 2008, 14:11
Репутация: 236
Откуда: Ханты-Мансийск
Контактная информация:

Re: Задать location программно

Сообщение bolotoved » 27 фев 2013, 11:04

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

>>> print grass.gisenv
<function gisenv at 0x00C42830>

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

>>> print grass.gisenv()
"g.gisenv" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
{}
>>>

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

Re: Задать location программно

Сообщение KolesovDmitry » 27 фев 2013, 12:41

Почему-то мне кажется, что дело не в том, что поменялся синтаксис вызова функции, а в том, что она просто отрабатывает с ошибкой. Где-то внутри ее вызывается команда 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')

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

Re: Задать location программно

Сообщение Александр Мурый » 27 фев 2013, 13:11

bolotoved писал(а): Первая строка в связи с изменением синтаксиса в 6.4.3RC2 будет выглядеть так:

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

env = grass.gisenv
Откуда информация про смену синтаксиса? У меня в 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".

Кстати, какая версия питона используется?
Редактор материалов, модератор форума

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

Re: Задать location программно

Сообщение Александр Мурый » 27 фев 2013, 13:56

Ещё, на всякий случай. Выяснил новую для себя вещь. Строку с СК/проекцией текущей области в формате PROJ.4 можно получить на питоне так:

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

proj = grass.read_command('g.proj', flags = 'j' + 'f').strip()
Редактор материалов, модератор форума

bolotoved
Гуру
Сообщения: 920
Зарегистрирован: 30 дек 2008, 14:11
Репутация: 236
Откуда: Ханты-Мансийск
Контактная информация:

Re: Задать location программно

Сообщение bolotoved » 27 фев 2013, 18:43

Проблема решилась после переустановки GRASS: заработал исходный код, приведенный в самом начале.
Александр Мурый писал(а):все имена лучше таки брать в скобки (location = 'tile')
это переменная
Александр Мурый писал(а):Что представляет собой "grassparam.proj4"?
тоже переменная: , там все -- переменные 8)
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 действительно должна быть со скобками:

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

env = grass.gisenv()

Ответить

Вернуться в «GRASS»

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

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