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

Re: attributeMap()

Добавлено: 07 июн 2012, 11:08
Voltron
Видимо, там, где обработка объекта, отвечающего условию. Т.е. внутри if

Re: attributeMap()

Добавлено: 07 июн 2012, 11:18
Cathrin

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

 attrs = ft.attributeMap()
for (k,attr) in attrs.iteritems():
                    f.write("%d: %s" % (k,attr.toString())+" | ")
это я пишу после If.
ничего не записывает..видимо я делаю что-то не так?(

Re: attributeMap()

Добавлено: 07 июн 2012, 11:24
Voltron
А вы вообще в if попадаете? Чему у вас равна testGeometry? В слое есть объекты с геометрией равной testGeometry?

Re: attributeMap()

Добавлено: 07 июн 2012, 11:34
Cathrin
Дело в том,что я программирую в PyScripter.
и напрямую его не запускаю,так как сразу вылетает море ошибок,решать которые уже нет сил.
а если выполнять через Qgis,ввиде модуля,то работает всё отлично

Поэтому пошагово программу мне и не запустить.
а самая первая ошибка вылетает "ImportError:No module named PyQt4.QtCore"
Хотя по идее он есть.

и да,наверное,testGeometry получается пустая.

Re: attributeMap()

Добавлено: 07 июн 2012, 11:44
Voltron
Cathrin писал(а):и да,наверное,testGeometry получается пустая.
Вот и ответ на ваш вопрос. Если вы сравниваете с пустой геометрией, то естественно, ни один объект не удовлетворяет условию, и внутрь if'а вы не попадаете.

Re: attributeMap()

Добавлено: 07 июн 2012, 11:48
Cathrin
а почему она пустая?
как мне сделать что бы она не была пустой?

Re: attributeMap()

Добавлено: 07 июн 2012, 12:19
Voltron
Cathrin писал(а):а почему она пустая?
Потому что, вероятно, вы ее не инициализировали
Cathrin писал(а):как мне сделать что бы она не была пустой?
Инициализировать ее. Допустим, вам надо сравнить объекты слоя с полигоном, тогда у вас будет что-то вроде

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

testGeometry = QgsGeometry.fromPolygon(<тут_описание_полигона>)

Re: attributeMap()

Добавлено: 07 июн 2012, 12:26
Cathrin
А что в описании писать?
С каким полигоном мне сравнивать?

Re: attributeMap()

Добавлено: 07 июн 2012, 13:26
Voltron
Cathrin писал(а):А что в описании писать? С каким полигоном мне сравнивать?
В описании у вас должен быть список, состоящий из объектов QgsPolyline (см. описание QgsPolygon)

А вообще это был пример. Я не знаю, может вам и не с полигоном надо сравнивать, может, вам вообще ничего сравнивать не надо.

Re: attributeMap()

Добавлено: 08 июн 2012, 07:49
Cathrin
а я не понимаю зачем сравнивать((
и если я не сравню ни с чем,то и работать не будет?
можно инициализировать её,ни с чем не сравнив?

Re: attributeMap()

Добавлено: 08 июн 2012, 08:32
Cathrin
вот я нашла как его можно примерно заполнить

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

testGeometry = QgsGeometry.fromPolygon( [ [ QgsPoint(1,1), QgsPoint(2,2), QgsPoint(2,1) ] ] )
но не поняла,точки мне оставить такими же?

Re: attributeMap()

Добавлено: 08 июн 2012, 08:41
Denis Rykov
Сравнение вам предлагается в качестве способа выбора нужных объектов. Объект можно выбрать либо пространственным запросом (например, выбрать все объекты, находящиеся внутри заданного полигона), либо атрибутивным (например, выбрать все объекты, у которых значение поля "X" равно "Y"). В самом первом сообщении топика я читаю "нужно записать атрибуты выделенного объекта в файл", в этом случае "выделенность" своего рода аттрибутивный признак и из консоли QGIS получить список всех выделенных объектов можно с помощью метода векторного слоя selectedFeatures. Таким образом, записать в файл аттрибуты выделенных объектов, работая в консоли QGIS, можно следующим образом:

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

f=open('c:/personal/gislab/attr.txt', 'wt')
layer = qgis.utils.iface.activeLayer()
feats = layer.selectedFeatures()
for feat in feats:
    attrs = feat.attributeMap()
    for (k,attr) in attrs.iteritems():
        f.write("%d: %s\n" % (k, attr.toString()))
f.close()

Re: attributeMap()

Добавлено: 08 июн 2012, 08:51
Cathrin
Всё работает!
Спасибо огромное!

ещё вопросик небольшой
выводом этих атрибутов можно управлять?
ну допустим если выводит лишние,или если нужно только 3,а выводит 4

Re: attributeMap()

Добавлено: 08 июн 2012, 08:59
Denis Rykov
Конечно можно, просто добавьте условие проверки индекса атрибутивного поля:

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

for (k,attr) in attrs.iteritems():
    if k in [0,1,2]:    
        f.write("%d: %s\n" % (k, attr.toString()))

Re: attributeMap()

Добавлено: 08 июн 2012, 09:03
Cathrin
да,замечательно,ещё раз спасибо)
а ещё такой нюанс..
у меня есть атрибут "площадь"
и при выводе он к ней добавляет в конец цифру 2
тоесть если на самом деле площадь 181,он выводит 1812
и так со всеми объектами
странно так...
не знаете почему он может так выводить?