2016-06-09 2 views
0

Я разрабатываю плагин для программного обеспечения ГИС, QGIS 2.14.3. Я также использую Qt Designer 4.8.5.Как распечатать накопленную геометрическую область при проверке нескольких QCheckBox?

У меня есть несколько флажков, которые при индивидуальной проверке выполняет свою соответствующую функцию. Это выбирает полигоны на карте ГИС и печатает сумму своей области:

Image

Там в 5 рангов в общей сложности около 5 флажков, функция для каждого из них практически одинаковы, но вот первые 2:

selectedLayerIndex = self.dockwidget.combo_box.currentText() 
sel_layer = QgsMapLayerRegistry.instance().mapLayersByName(str(selectedLayerIndex))[0] 
self.iface.setActiveLayer(sel_layer) 

def rank_0(): 
    expr = QgsExpression("\"Rank\"IS NULL") 
    it = sel_layer.getFeatures(QgsFeatureRequest(expr)) 
    ids = [i.id() for i in it] 
    if self.dockwidget.rank0_checkbox.isChecked(): 
     sel_layer.setSelectedFeatures(ids) 
     for f in sel_layer.selectedFeatures(): 
      sel_area = 0 
      sel_area += f.geometry().area() 
      self.dockwidget.lineEdit.setText("{:,.2f}".format(sel_area)) 
    else: 
     sel_layer.removeSelection() 

def rank_1(): 
    expr = QgsExpression("\"Rank\"= 1") 
    it = sel_layer.getFeatures(QgsFeatureRequest(expr)) 
    ids = [i.id() for i in it] 
    if self.dockwidget.rank1_checkbox.isChecked(): 
     sel_layer.setSelectedFeatures(ids) 
     for f in sel_layer.selectedFeatures(): 
      sel_area = 0 
      sel_area += f.geometry().area() 
      self.dockwidget.lineEdit.setText("{:,.2f}".format(sel_area)) 
    else: 
     sel_layer.removeSelection() 

Как я мог сделать это так, что, когда несколько флажков проверяются, напечатанная площадь равна сумма этих флажков?

Я предполагаю, что мне нужно будет определить другую функцию, чтобы вычислить сумму области и распечатать ее, но не уверен, как действовать.

+0

Я также называю 'sel_area = 0' в каждой функции флажка, которая, вероятно, сбрасывает область и затем печатает область вновь выбранных функций? – Joseph

ответ

2

Вместо функции setSelectedFeatures (ids) вы можете использовать функцию select (ids). В то время как setSelectedFeatures (ids) отменяет выбранные ранее функции и выбирает новые функции, функция select (ids) добавляет новые идентификаторы к выбранным идентификаторам.

sel_layer.select(ids) 

При вычислении общей площади выбранных функций вы получите желаемое значение.

sel_area = 0 
    for f in sel_layer.selectedFeatures(): 
     sel_area += f.geometry().area() 
    self.dockwidget.lineEdit.setText("{:,.2f}".format(sel_area)) 
+0

Спасибо за ваш ответ, я проверю это и отчитаю :) – Joseph

+0

К сожалению, общая площадь по-прежнему не накапливается при нажатии на несколько флажков. – Joseph

+0

Я думаю, что вы не расчитываете это правильно. Я просто понял, что вы устанавливаете свою общую площадь на ноль с каждой выбранной функцией вашего цикла. Позвольте мне отредактировать мой ответ. – okorkut