Страница 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() где применять?