Suite

Boucle de réécriture QGIS efficacement, attribuer un numéro à chaque ligne d'une colonne,

Boucle de réécriture QGIS efficacement, attribuer un numéro à chaque ligne d'une colonne,


J'ai une colonne intitulée CompanyNam et je dois extraire les informations de propriété. Par exemple, si CEZ est la première entreprise, je lui attribue le numéro 1, alors Sokolovska est le numéro suivant, etc. Si CEZ apparaît à nouveau dans une autre ligne, elle obtiendra le numéro 1. Il est important de noter que si je avoir NULL dans la colonne J'attribue un numéro différent à chaque entrée de ligne NULL. J'ai besoin des numéros correspondant à la sortie CompanyNam. J'ai le code suivant:

EmptyArray = [] d = {} newlist = [] pour gFeat dans GeneratorLayer.getFeatures() : Owner = gFeat.attributes()[gProvider.fieldNameIndex('CompanyNam')].toString() A = ([str(i) for i in Owner]) #convertir de PyQt4.QtCore.QString en chaîne normale B =".join(A) EmptyArray.append(B) for m, n in enumerate(EmptyArray): si n pas dans d: d[n ] = [m+1] newlist.append({n: d[n]}) if n ==": d[n] = [m+1] newlist.append({n: d[n]}) # Chaque NULL obtient un nouveau numéro pour les noms dans la nouvelle liste : pour o, p dans names.iteritems() : if o ==" : a2 = str('{},NULL'.format(p)) elif o !=" : a2 = str('{},{}'.format(p,o)

J'utilise ensuite a2 dans les étapes suivantes. Le code fonctionne bien pour une colonne de 60 à 100 lignes, mais pour les colonnes plus grandes, les temps de calcul sont vraiment élevés. Pouvez-vous suggérer une façon dont je peux réécrire ce code, en gardant la logique ? La sortie ressemble à ceci :

[1],CEZ [1],CEZ [1],CEZ [1],CEZ [1],CEZ [1],CEZ [1],CEZ [1],CEZ [9],Sokolovska [10],International [11],ENERGOTRANS, [12],Alpiq [13],Mittal Steel [14],United [1],CEZ [1],CEZ [17],Dalkia…

Ce serait encore mieux d'avoir la numérotation [1 ], [2], [3] et non [1 ], [9], [10], mais je n'ai pas trouvé comment faire cela.


Je ne suis pas un connaisseur de qgis python, mais logiquement, je peux suivre votre script. Le principal problème est que pendant que vous itérez des fonctionnalités, vous itérez également l'autre liste et le dictionnaire, de sorte que le temps écoulé augmente de manière exponentielle. Vous avez créé une boucle à l'intérieur d'une boucle et vous en voyez le coût.

C'est comme ça que je m'y prendrais, même si c'est encore un peu lourd (je comprends de votre code que NULL dans la table attributaire =="dans le script):

counter = 1 ref_dict = {} newlist = [] pour gFeat dans GeneratorLayer.getFeatures() : Owner = gFeat.attributes()[gProvider.fieldNameIndex('CompanyNam')].toString() A = ([str(i) pour i in Owner]) #convertir de PyQt4.QtCore.QString en chaîne normale name =".join(A) if name ==": name = 'NULL' newlist.append((counter, name)) a2 = "[{ 0}], {1}".format(counter, name) counter += 1 elif not name in ref_dict.keys(): ref_dict[name] = counter newlist.append((counter, name)) a2 = "[{ 0}], {1}".format(counter, name) counter += 1 else : newlist.append((ref_dict[name], name)) a2 = "[{0}], {1}".format( ref_dict[nom], nom)

Cela devrait produire une liste de tuples qui ressemble à ceci :

[(1,CEZ),(1,CEZ),… ,(2,Sokolovska),(3,International),(4,ENERGOTRANS), etc.]

Cela vous laissera également avec la variable a2 que vous pourrez utiliser pour une autre opération sur la même fonctionnalité. Le ref_dict est juste utilisé pour les sociétés dont le nom n'est pas NULL.


Voir la vidéo: GIS Lesson 11: WMS. WMTS. WFS in QGIS