Страница 1 из 3

attributeMap()

Добавлено: 06 июн 2012, 09:47
Cathrin
Подскажите,пожалуйста.
я работаю с методом attributeMap().
нужно записать атрибуты выделенного объекта в файл,но у меня возникает куча ошибок либо ничего вообще не происходит :

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

f=open('/temp/op.txt', 'w')
feat = QgsFeature()
 attrs = feat.attributeMap()
for (attr) in attrs.iteritems():
            f.write(attr)
 f.close()
что я делаю не так?

Re: attributeMap()

Добавлено: 06 июн 2012, 10:15
Максим Дубинин
вы упорно не хотите указывать ПО, ни в названии темы, ни в тексте.

по вопросу, смотрите код модуля DumpLoadField, он делает ровно тоже самое

Re: attributeMap()

Добавлено: 06 июн 2012, 10:30
Cathrin
windows 7,prof
qgis v.1.8.0
это что-то меняет?

Re: attributeMap()

Добавлено: 06 июн 2012, 11:08
Александр Мурый
Cathrin писал(а):windows 7,prof
qgis v.1.8.0
это что-то меняет?
Это элементарная культура + как известно, в разных ОС и разных версиях ПО свои особенности.

Re: attributeMap()

Добавлено: 06 июн 2012, 11:12
Voltron
Cathrin писал(а):что я делаю не так?
Не читаете документацию на Python и не приводите текст сообщения об ошибке. Читать docs.python.org, особенно разделы 5.5 и 5.8 tutorial'a

Re: attributeMap()

Добавлено: 06 июн 2012, 11:15
Cathrin
модуль DumpLoadField выводит только один атрибут,а остальные нет.
у меня вообще задача выводить атрибуты выделенного объекта куда-нибудь наподобии в текст-бокс,просто для начала в файл записываю

нет модуля,похожего на эти действия?

Re: attributeMap()

Добавлено: 06 июн 2012, 11:16
Cathrin
а на данный код,который я выложила,ошибки не вылетает.просто ничего не происходит

Re: attributeMap()

Добавлено: 06 июн 2012, 11:27
Voltron
Cathrin писал(а):а на данный код,который я выложила,ошибки не вылетает.просто ничего не происходит
Естественно. Он же не рабочий, код ваш.

Делать все путем копирования существующего, не разбираясь в том, что и почему на самом деле происходит — путь в никуда. Рискну еще раз предложить ознакомиться с разделом 5 Python Tutorial, и разделом 5.8 описания стандартной библиотеки.

Re: attributeMap()

Добавлено: 06 июн 2012, 11:45
Cathrin
Voltron писал(а):Делать все путем копирования существующего, не разбираясь в том, что и почему на самом деле происходит
я как раз и пытаюсь разобраться,а не тупо откуда-то копирую.
Voltron писал(а):ознакомиться с разделом 5 Python Tutorial
я ознакомилась уже давно.Делу это не помогло.я до сих пор не могу разобраться с attributeMap()

просто если вы не знаете в чем тут конкретно может быть дело,и как правильно ,так бы и писали

Re: attributeMap()

Добавлено: 06 июн 2012, 14:28
Voltron
Cathrin писал(а):просто если вы не знаете в чем тут конкретно может быть дело,и как правильно ,так бы и писали
Видите ли... я как раз знаю.

Вы создали новый объект QgsFeature. Т.е. совсем новый: у него ничего нет, НИ-ЧЕ-ГО. Затем вы запрашиваете атрибуты этого объекта. Естественно, получаете пустой словарь и в файл записывать нечего.

Re: attributeMap()

Добавлено: 07 июн 2012, 08:26
Cathrin

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

f=open('/temp/op.txt', 'w')
feat = QgsFeature()
while provider.nextFeature(feat):
    attrs = feat.attributeMap()
for (k,attr) in attrs.iteritems():
    f.write("%d: %s" % (k,attr.toString())+" | ")
 f.close()
Вот таким образом идет запись,записывает атрибуты вообще всех объектов
Если он новый и у него ничего нет,почему тогда идет запись?
и кстати,вы случайно не знаете,как сделать чтобы он брал атрибуты именно выделенного объекта?
я убираю вайл ,но не фурычит....

Re: attributeMap()

Добавлено: 07 июн 2012, 09:50
Voltron
Cathrin писал(а):Вот таким образом идет запись,записывает атрибуты вообще всех объектов
Если он новый и у него ничего нет,почему тогда идет запись?
Встречный вопрос. А вы не видите различий между первым и вторым вариантом кода? Во втором варианте у вас идет обращение к объектам слоя, а в первом, вы обращаетесь к «пустому» объекту

Давайте я вам на пальцах попробую объяснить. Представьте, что у вас есть пустая коробочка. Это ваш объект QgsFeature. Что вы сейчас можете из этой коробочки достать? Правильно, ничего. Это то, что вы делаете в первом варианте кода. Но если сначала в коробочку положить что-то, например, конфету, то следующая попытка достать что-либо из коробочки будет успешной. Это второй вариант вашего кода.

Не обижайтесь, но мне кажется, у вас хромает теория. Не по PyQGIS (хотя и по ней тоже), а вообще по основам программирования.
Cathrin писал(а):и кстати,вы случайно не знаете,как сделать чтобы он брал атрибуты именно выделенного объекта?
Разумеется знаю. И вовсе не случайно :-). Нужно сначала получить выделенный объект, а потом вызвать метод attributeMap() у него. Как вы будете получать этот объект зависит от условий. Можно обратиться сразу по ID, можно найти перебором, можно запросом (пространственным или по атрибутам).
Cathrin писал(а):я убираю вайл ,но не фурычит....
Не распарсил.

Re: attributeMap()

Добавлено: 07 июн 2012, 10:11
Cathrin
Voltron писал(а):А вы не видите различий между первым и вторым вариантом кода?
вижу..просто я его реконструировала.
Спасибо за объяснение
Voltron писал(а):Можно обратиться сразу по ID
у меня у объектов этого слоя одинаковый ID,поэтому не подойдет наверное этот способ
Voltron писал(а):можно запросом
а как это сделать запросом?
каким-то образом использовать это : layer = self.iface.activeLayer() ?

Re: attributeMap()

Добавлено: 07 июн 2012, 11:00
Voltron
Cathrin писал(а):а как это сделать запросом?
Пространственным? Определить, какая операция лучше всего подходит: «intersects», «contains», «equals» или другая. Запустить цикл по объектам слоя и в цикле проверять геометрию каждого объекта

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

layer = self.iface.activeLayer()
ft = QgsFeature()
while layer.nextFeature(ft):
  geom = QgsGeometry(ft.geometry())
  if geom.equals(testGeometry):
    # этот объект отвечает условию, обрабатываем его

Re: attributeMap()

Добавлено: 07 июн 2012, 11:03
Cathrin
Спасибо большое!!!
а attributeMap() где применять?