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