Изменить значения в таблице атрибутов векторного слоя

Ответить
xen87
Активный участник
Сообщения: 168
Зарегистрирован: 08 апр 2009, 14:44
Проекты: 1
Репутация: 18
Откуда: Кострома

Изменить значения в таблице атрибутов векторного слоя

Сообщение xen87 » 23 мар 2014, 19:06

Здравствуйте, уважаемые ГРАССоведы!
Встала задача изменить значения в таблице атрибутов векторного слоя.
Сами значения берутся из заранее составленного списка (в смысле list, Питон).
Список выглядит как:

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

[категория, значение]
Попытался сделать как написано здесь: gis-lab.info/docs/grass/tutorial60/10r.html

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

echo UPDATE frpol_kostroma_region_z_38 SET area_rubki = <значения из списка> WHERE cat = <категория из списка> | db.execute
Получил следующий ответ:
ЋвЄ § ­® ў ¤®бвгЇҐ. = Отказано в доступе.
Что я делаю неправильно?
Заранее спасибо!
Последний раз редактировалось xen87 24 мар 2014, 18:15, всего редактировалось 1 раз.

gamm
Гуру
Сообщения: 2733
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 603
Ваше звание: программист
Откуда: Казань

Re: Изменить значения в таблице атрибутов векторного слоя

Сообщение gamm » 24 мар 2014, 05:32

xen87 писал(а):Что я делаю неправильно?
скорее всего, используете русские буквы в путях к файлам, именах файлов или именах полей. Лучше этого никогда не делать.

Александр Мурый
Гуру
Сообщения: 5171
Зарегистрирован: 26 сен 2009, 16:26
Статьи: 3
Проекты: 5/1
Репутация: 778
Ваше звание: званий не имею
Откуда: Москва

Re: Изменить значения в таблице атрибутов векторного слоя

Сообщение Александр Мурый » 24 мар 2014, 07:12

Действие происходит в питон-скрипте, запускаемом в "голой" виндовой консоли или в питон-консоли в wxGUI?
Можно увидеть примеры значений из питоновского списка?
Приведите вывод следующих команд:

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

db.connect -p
v.info -c frpol_kostroma_region_z_38
v.db.connect -p frpol_kostroma_region_z_38
Только сейчас заметил, что SQL-выражение не взято в кавычки (в данном случае надо двойные).
Редактор материалов, модератор форума

xen87
Активный участник
Сообщения: 168
Зарегистрирован: 08 апр 2009, 14:44
Проекты: 1
Репутация: 18
Откуда: Кострома

Re: Изменить значения в таблице атрибутов векторного слоя

Сообщение xen87 » 24 мар 2014, 10:01

скорее всего, используете русские буквы в путях к файлам, именах файлов или именах полей. Лучше этого никогда не делать.
- перепроверил пути, имена файлов и колонок - русских букв нет. А в ячейках табл. кириллица - присутствует в виде "����������� ���."
Действие происходит в питон-скрипте, запускаемом в "голой" виндовой консоли или в питон-консоли в wxGUI?
- сейчас все действия делаю в "Command console " интерфейса "wxGUI".

Со списком значений (Питон) - это я поторопился, прошу прощения (в будущем хотелось бы "обернуть код" в Питон, но пока не знаю как ((( ).

Изначально код выглядел так:

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

echo "UPDATE frpol_kostroma_region_z_38 SET area_rubki = 100 WHERE cat = 1" | db.execute
Появлялась ошибка:
ЋвЄ § ­® ў ¤®бвгЇҐ. = Отказано в доступе.
Теперь данной ошибки - нет.
Операция завершается, но результатов обновления в атриб. таблице нет (((

Для интереса попробовал занести данные в табл. атриб. вручную. Вызвал менеджер таблиц -> выбрал запись для редактирования -> внес данные -> ячейка не обновилась, но появилась ошибка:
Traceback (most recent call last):
File "C:\OSGeo4W\apps\grass\grass-6.4.3\etc\wxpython\dbmgr
\manager.py", line 1502, in OnDataItemEdit

values = dlg.GetValues() # string
File "C:\OSGeo4W\apps\grass\grass-6.4.3\etc\wxpython\dbmgr
\dialogs.py", line 693, in GetValues

value = str(self.FindWindowById(valueId).GetValue())
UnicodeEncodeError
:
'ascii' codec can't encode characters in position 0-10:
ordinal not in range(128)
Ошибка с кодировками.
Действительно в атриб. табл. есть две колонки с кириллицей (и крякозябрами), но я же с ними не работаю. Моя задача только обновить числовые значения в новой колонке.
Приведите вывод следующих команд:
db.connect -p
driver:dbf
database:$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/
schema:
group:
(Mon Mar 24 10:46:11 2014) Операция завершена (0 sec)
v.info -c frpol_kostroma_region_z_38
Отобразить типы/имена полей для связи БД со слоем 1:
INTEGER|cat
CHARACTER|OBL_NAME
INTEGER|ADM_CODE
CHARACTER|FR_NAME
CHARACTER|FR_CODE
CHARACTER|OIV_CODE
CHARACTER|CODE_FR
CHARACTER|UN_CODE_FR
CHARACTER|OIV_NAME
INTEGER|FR_YEAR
CHARACTER|NAME
DOUBLE PRECISION|AREA
DOUBLE PRECISION|PERIMETER
DOUBLE PRECISION|area_rubki
(Mon Mar 24 10:46:34 2014) Операция завершена (0 sec)
Traceback (most recent call last):
File "C:\OSGeo4W\apps\grass\grass-6.4.3\etc\wxpython\gui_c
ore\goutput.py", line 914, in OnCmdDone

display.GetWindow().UpdateMap(render = True)
File "C:\OSGeo4W\apps\grass\grass-6.4.3\etc\wxpython\mapdi
sp\mapwindow.py", line 575, in UpdateMap

windres = windres)
File "C:\OSGeo4W\apps\grass\grass-6.4.3\etc\wxpython\core\
render.py", line 875, in Render

os.environ["GRASS_REGION"] = self.SetRegion(windres)
File "C:\OSGeo4W\apps\grass\grass-6.4.3\etc\wxpython\core\
render.py", line 702, in SetRegion

region = self.AdjustRegion()
File "C:\OSGeo4W\apps\grass\grass-6.4.3\etc\wxpython\core\
render.py", line 488, in AdjustRegion

self.region["nsres"] = mapheight / self.height
ZeroDivisionError
:
float division by zero
v.db.connect -p frpol_kostroma_region_z_38
Векторный слой <frpol_kostroma_region_z_38@PERMANENT> присоединен к:
слой <1> таблица<frpol_kostroma_region_z_38> в базе данных <d:/grass\landsat8_pan\PERMANENT\dbf\> посредством драйвера <dbf> с ключем <cat>
(Mon Mar 24 10:47:15 2014) Операция завершена (0 sec)
Traceback (most recent call last):
File "C:\OSGeo4W\apps\grass\grass-6.4.3\etc\wxpython\gui_c
ore\goutput.py", line 914, in OnCmdDone

display.GetWindow().UpdateMap(render = True)
File "C:\OSGeo4W\apps\grass\grass-6.4.3\etc\wxpython\mapdi
sp\mapwindow.py", line 575, in UpdateMap

windres = windres)
File "C:\OSGeo4W\apps\grass\grass-6.4.3\etc\wxpython\core\
render.py", line 875, in Render

os.environ["GRASS_REGION"] = self.SetRegion(windres)
File "C:\OSGeo4W\apps\grass\grass-6.4.3\etc\wxpython\core\
render.py", line 702, in SetRegion

region = self.AdjustRegion()
File "C:\OSGeo4W\apps\grass\grass-6.4.3\etc\wxpython\core\
render.py", line 488, in AdjustRegion

self.region["nsres"] = mapheight / self.height
ZeroDivisionError
:
float division by zero

gamm
Гуру
Сообщения: 2733
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 603
Ваше звание: программист
Откуда: Казань

Re: Изменить значения в таблице атрибутов векторного слоя

Сообщение gamm » 24 мар 2014, 10:56

'ascii' codec can't encode characters in position 0-10:
ordinal not in range(128)
похоже, вы таки пытались скормить программе русские буквы, а она сказала, что кушает только английские ... и еще что-то не так и окном карты, там нулевая высота, прерывание от деления на 0
self.region["nsres"] = mapheight / self.height
ZeroDivisionError
:
float division by zero

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

Re: Изменить значения в таблице атрибутов векторного слоя

Сообщение KolesovDmitry » 24 мар 2014, 12:54

Странно, что у вас не обновляется колонка, точнее, странно, что все происходит молча, без сообщения об ошибке. Единственное подозрение -- нет у вас объекта с cat=1. Давайте проверим, скажите, что выводится при выполнении команд:

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

v.db.select  frpol_kostroma_region_z_38 where="cat=1"
echo "UPDATE frpol_kostroma_region_z_38 SET area_rubki = 300 WHERE cat = 1" | db.execute
v.db.select  frpol_kostroma_region_z_38 where="cat=1"
PS Как уже написал gamm, у вас какая-то проблема с настройкой региона. Хотя это на векторные операции не влияет, тем не менее, это источник потенциальных проблем в будущем. Лучше исправить сразу. Что у вас выводит команда

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

g.region -p

Александр Мурый
Гуру
Сообщения: 5171
Зарегистрирован: 26 сен 2009, 16:26
Статьи: 3
Проекты: 5/1
Репутация: 778
Ваше звание: званий не имею
Откуда: Москва

Re: Изменить значения в таблице атрибутов векторного слоя

Сообщение Александр Мурый » 24 мар 2014, 14:04

Вычислительный регион к обновлению атрибутов никакого отношения иметь не может. А вот ошибки wxGUI какие-то странные, я пока такого не видел.
Проверьте, как работает db.execute в голой консоли.

Попробуйте выставить "CP1251" или "Windows-1251" в качестве кодировки атрибутов в настройках wxGUI:
wxgui_attr_enc.png
wxgui_attr_enc.png (25.78 КБ) 4983 просмотра
Попробуйте ещё так:

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

v.db.update frpol_kostroma_region_z_38 column=area_rubki  value=100 where="cat = 1"
Редактор материалов, модератор форума

xen87
Активный участник
Сообщения: 168
Зарегистрирован: 08 апр 2009, 14:44
Проекты: 1
Репутация: 18
Откуда: Кострома

Re: Изменить значения в таблице атрибутов векторного слоя

Сообщение xen87 » 24 мар 2014, 15:44

Спасибо всем откликнувшимся!!!
Вроде заработало ))
ПРавда не знаю в чем заключалась проблема ...
В подтверждении что заработало, напишу результаты работы команд:

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

v.db.select frpol_kostroma_region_z_38 where=cat=1                              
cat|OBL_NAME|ADM_CODE|FR_NAME|FR_CODE|OIV_CODE|CODE_FR|UN_CODE_FR|OIV_NAME|FR_YEAR|NAME|AREA|PERIMETER|area_rubki
1|Костромская обл.|1134|Антроповское|0140101219|014|01|01219|Департамент лесного хозяйства Костромской области|2009||2728790989.417|327637.79|100

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

echo UPDATE frpol_kostroma_region_z_38 SET area_rubki = 300 WHERE cat = 1 | db.execute
dbmi: Protocol error
dbmi: Protocol error
dbmi: Invalid procedure 107
ERROR: Ошибка при выполнении: '"UPDATE frpol_kostroma_region_z_38 SET area_rubki = 300 WHERE cat = 1"
Вылезает ошибка, но данные обновляются )))

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

v.db.select frpol_kostroma_region_z_38 where=cat=1                              
cat|OBL_NAME|ADM_CODE|FR_NAME|FR_CODE|OIV_CODE|CODE_FR|UN_CODE_FR|OIV_NAME|FR_YEAR|NAME|AREA|PERIMETER|area_rubki
1|Костромская обл.|1134|Антроповское|0140101219|014|01|01219|Департамент лесного хозяйства Костромской области|2009||2728790989.417|327637.79|300
Ошибки типа

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

Traceback (most recent call last):
File "C:\OSGeo4W\apps\grass\grass-6.4.3\etc\wxpython\dbmgr
\manager.py", line 1502, in OnDataItemEdit ...
- победил назначением региона по обрабатываемому векторному слою (т.е. frpol_kostroma_region_z_38)

Вариант, предложенный Александром:

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

v.db.update frpol_kostroma_region_z_38 column=area_rubki  value=100 where="cat = 1"
- тоже замечательно работает, правда по моему субъективному мнению чуть медленнее ...

У меня крайний вопрос: подскажите пожалуйста как можно "обернуть" данную сроку в питон?

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

echo "UPDATE frpol_kostroma_region_z_38 SET area_rubki = 300 WHERE cat = 1" | db.execute

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

Re: Изменить значения в таблице атрибутов векторного слоя

Сообщение KolesovDmitry » 24 мар 2014, 16:24

xen87 писал(а): У меня крайний вопрос: подскажите пожалуйста как можно "обернуть" данную сроку в питон?

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

echo "UPDATE frpol_kostroma_region_z_38 SET area_rubki = 300 WHERE cat = 1" | db.execute
С каналами на питон все очень запущено :) Помню, каким для меня было шоком, когда я переписал bash-скрипт, занимавший около 10 строк, на Python: в итоге скрипт вышел более 100 строк длиной.

В вашем случае нужно делать так:

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

import grass.script as grass
p = grass.feed_command('db.execute')
sql = 'UPDATE frpol_kostroma_region_z_38 SET area_rubki = 300 WHERE cat = 1'
p.communicate(sql)
p.wait()
Последний раз редактировалось KolesovDmitry 24 мар 2014, 20:43, всего редактировалось 1 раз.

xen87
Активный участник
Сообщения: 168
Зарегистрирован: 08 апр 2009, 14:44
Проекты: 1
Репутация: 18
Откуда: Кострома

Re: Изменить значения в таблице атрибутов векторного слоя

Сообщение xen87 » 24 мар 2014, 18:15

Задумка получилась - это приятно )))
Еще раз большое СПАСИБО всем откликнувшимся!!! Ваша помощь оказалась для меня бесценной!!!

Александр Мурый
Гуру
Сообщения: 5171
Зарегистрирован: 26 сен 2009, 16:26
Статьи: 3
Проекты: 5/1
Репутация: 778
Ваше звание: званий не имею
Откуда: Москва

Re: Изменить значения в таблице атрибутов векторного слоя

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

xen87 писал(а): Вариант, предложенный Александром:

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

v.db.update frpol_kostroma_region_z_38 column=area_rubki  value=100 where="cat = 1"
- тоже замечательно работает, правда по моему субъективному мнению чуть медленнее ...
Правильно, действительно медленнее, т.к. модуль <v.db.update> — "более удобная" обёртка над модулем <db.execute>.
Редактор материалов, модератор форума

Ответить

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

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

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