Daha çox

Python QGIS istifadə edərək bir qovluqdakı bir şəkil faylının adını necə əvəz etmək olar?

Python QGIS istifadə edərək bir qovluqdakı bir şəkil faylının adını necə əvəz etmək olar?


Python QGIS -dən istifadə edərək ad dəyişdirmək və ya .shp faylını qovluqdan necə silmək olar?

id id emal emal girişi = "//input.shp" output = "//output_100.shp" interval = 100 processing.runalg ("qgis: densifygeometriesgivenaninterval", giriş, interval, çıxış) yollar = (os.path.join ( kök, fayl adı) kök üçün, _, fayl adları os.walk ("C:/" + os.getenv ('KULLANICI') + "/SHP_Path") fayl adları üçün) yollardakı yollar üçün: newname = path.replace ('_100', ") əgər yeni ad! = Yol: os.rename (yol, yeni ad)

Nəticə:

WindowsError: [Hata 183] Mövcud fayl yaradıla bilməz.

Çıxış.shp -ni input.shp olaraq adlandırmadan əvvəl input.shp faylını silməli olduğumu düşünürəm. Ancaq bu faylları (.shp, .dbf, .shx) kodu ilə silməyə çalışsam:

fayl adı = "C:/" + os.getenv ('USERNAME') + "/SHP_Path" + "//input.shp" əgər os.path.exists (fayl adı): os.remove (fayl adı)

Nəticə aldım:

WindowsError: [Hata 32] Başqa bir proses tərəfindən istifadə edildiyindən proses fayla giriş əldə edə bilmir:

Düşünürəm ki, problemi həll edə biləcək 2 üsul var:


  • Yaddaş qatını giriş olaraq istifadə edin

Giriş qatınızın surətini a olaraq yaradın yaddaş qat, bu şəkildə orijinal girişinizlə eyni məlumatları istifadə etməyə davam edə bilərsiniz, eyni zamanda şəkil faylını kilidlənməkdən 'azad edir'. Yaddaş qatını da əlavə etmək lazımdırQgsMapLayerRegistryemal alqoritmində istifadə olunmazdan əvvəl.

idxal glob, os, emal girişi = "//input.shp" output = "//output_100.shp" qat = QgsVectorLayer (giriş, "hər hansı bir_ad", "ogr") feats = [feat in layer.getFeatures () üçün feat ] temp = QgsVectorLayer ("LineString? crs = epsg: 4326", "result", "memory") # 'temp', yeni qat yaddaşdır # Qatınızdan asılı olaraq 'LineString' 'Point' və ya 'Polygon' və s. temp_data = temp.dataProvider () attr = layer.dataProvider (). sahələri (). toList () temp_data.addAttributes (attr) temp.updateFields () temp_data.addFeatures (feats) QgsMapLayerRegistry.instance (). tempMapLayer () # Bütün kopyalanan atributları olan yaddaş qatını ToC intervalına əlavə edir = 100 processing.runalg ("qgis: densifygeometriesgivenaninterval", temp, interval, çıxış) # Qenerasiya alqoritmi yaddaş qatını giriş parametri olaraq istifadə edir QgsMapLayerRegistry.instance (). RemoveMapLayer (temp.id ( )) del qat # ToC -dən silinir, glob.glob ("inpu t*"): os.remove (input_file) # Cari qovluğu istədiyiniz qovluğa təyin edir və os.listdir (". ") -də output_file üçün" giriş "fayllarını silir: os.rename (output_file, output_file.replace (" output_100 ", "input")) # # "output_100" fayllarının adını "input" olaraq dəyişir

(Bu yazıda çox faydalı cavablar verdikləri üçün @Detlev və @xunilk -ə təşəkkürlər.)


  • Skript bölün / QGIS -i yenidən başladın

Skriptinizi iki hissəyə bölmək olar. Alqoritmi yerinə yetirmək üçün birinci hissəni işə salın və çıxış saxlanıldıqdan sonra QGIS -i yenidən başladın və skriptin ikinci hissəsini işə salın. Bu şəkildə, giriş faylları artıq istifadə edilməməli və etibarlı şəkildə silinə bilər.

Beləliklə, ilk skriptiniz belə görünə bilər:

idxal emal girişi = "//input.shp" output = "//output_100.shp" interval = 100 processing.runalg ("qgis: densifygeometriesgivenaninterval", giriş, interval, çıxış)

QGIS -i yenidən başladın və sonra işə salın:

import os, glob os.chdir ("C:/" + os.getenv ('USERNAME') + "/SHP_Path //") glob.glob -da input_file ("input*"): os.remove (input_file) # Os.listdir (".") -Də output_file üçün "giriş" ilə başlayan bütün faylları (məsələn. İnput.dbf, input.prj və s.) Silir: os.rename (output_file, output_file.replace ("output_100", "input") )

Videoya baxın: QGIS Python PyQGIS - Create a Custom Processing Script for QGIS in the Processing Toolbox