Daha çox

PyQGIS istifadə edərək təbəqənin təkrarlanması və filtrin tətbiq edilməsi?


Python-dan istifadə edərək QGIS-də bir təbəqəni bir tarlada olan bir dəyişənin tək təkrarlanması qədər təkrarlamaq və dəyişənin özünə əsasən təkrarlanan təbəqədə tətbiq olunan bir filtr ilə bir yol varmı?

Nümunə: Məndə var1, var2, var3 və s. Olan bir0 sahəsi olan qat0 var ki, qat0, qat1, qat2, qat3 və s. -Də çoxaldılmasını istərdim ki, qat1-də bir filtr olsun; sahə0 = var1, qat2 -də sahə var; = var2 və s.

Fikir LayersByField plagininə bənzəyir, lakin dəyişənin hər meydana gəlməsi üçün yeni bir qat yaratmaq əvəzinə "master" qatını təkrarlamaq istərdim (diskdəki lazımsız sənədlərin qarşısını almaq üçün)


Aşağıdakı Python skripti Windows 7-də QGIS 2.8.2 istifadə edərək Shape faylları, PostGIS təbəqələri və SpatiaLite ilə sınaqdan keçirildi. İlk kod sətrində süzmək istədiyiniz sahəni göstərin (dəyişdirin rtt).

# süzmək üçün sahəni göstərin field_name = 'rtt' # aktiv qat əldə edin layer = iface.activeLayer () # yuxarıda göstərilən sahəyə istinad alın fni = layer.fieldNameIndex (field_name) f = layer.dataProvider (). field () # get etibarlı SQL sətri qurmaq üçün lazım olan sahə növü is_string = False if f [fni] .type () in [7, 10]: is_string = True # unikal dəyərlərin siyahısını əldə etmək unique_values ​​= layer.uniqueValues ​​(fni) in unique_values: # xəritəyə qat əlavə edin lyr_copy = iface.addVectorLayer (layer.source (), layer.name () + '_' + str (i), layer.providerType ()) # SQL-də alt sətri sintaksis kimi qurun, əgər is_string: lyr_copy.setSubsetString ('"% s" = '% s  "% (field_name, i)) else: lyr_copy.setSubsetString ('"% s "=% d'% (field_name, int (i)))

ESRI faylı Geodatabase mənim üçün işləmədi, çünki bütün sahə indeksləri üçün layer.uniqueValues ​​(fni) ilk atributun unikal dəyərlərinin siyahısını qaytarır. Beləliklə, bir atributun bu dəyərlərə görə süzülməsi boş bir siyahı və ya səhv nəticə dəsti qaytarır. Bəlkə QGIS 2.8.2-nin bir problemi.


@Detlev cavabını bəzi kiçik dəyişikliklərlə işləmə skriptinə çevirmək üçün uyğunlaşdırdım:

## Dev_scripts = qrup ## Field_Filter = ad ## giriş = vektor ## field_name = qgis.core-dan idxal QgsExpressionContextUtils from qgis.utils from iface layer = processing.getObject (input) fields = layer.dataProvider () field. () field_name_index = layer.fieldNameIndex (field_name) # etibarlı SQL sətri qurmaq üçün lazım olan sahə növü is_string = False əgər sahələr [field_name_index] .type () in [7, 10]: is_string = True # unikal dəyərlərin siyahısını əldə edin = unique.values-də i üçün layer.uniqueValues ​​(field_name_index): # xəritəyə qat əlavə edin lyr_copy = iface.addVectorLayer (layer.source (), layer.name () + '_' + str (i), layer.providerType () ) is_string olduqda # sintaksis kimi SQL-də alt sətir qurun: lyr_copy.setSubsetString ('"% s" = '% s  "% (field_name, i)) else: lyr_copy.setSubsetString ('"% s "=% d' % (field_name, int (i)))


Videoya baxın: Add a new field to attribute table in QGIS. burdGIS (Oktyabr 2021).