Daha çox

Piton funksiyadan geri qaytarılan gdal band obyektiylə çökür


Bu iki funksiyanı NetCDF və ya HDF sənədlərindəki bandı oxumaq və bandı funksiyadan kənarda qaytarmaq istədikdə yazdım. Hər HDF və NetCDF-də bir çox alt məlumat var. Bir NetCDF sənədindəki hər bir alt sənəddə 365 zolaq, HDF alt sənəddə yalnız bir zolaq var. ReadFile1-i çalıştırdığımda heç bir problem yoxdur. Bununla birlikdə, readFile2-i çalıştırdığımda və bandı qaytardığımda, tərcüməçidə və ya başqa bir funksiyada python çökür. (Və ya ona əlavə edilmiş digər funksiyalar) yazın. GetNoDataValue () ReadFile1 funksiyasında, out.GetNoDataValue (), zolağın məlumat dəyərini uğurla verməz. Qrupu readFile2-də olduğu kimi geri qaytardığınızda, onunla heç bir şey edə bilməzsiniz. Etdiyiniz zaman piton çökür.

mənim gdal versiyam '1100000' (gdal.VersionInfo ()) Əməliyyat sistemim us ubuntu 12.04 LTS

Düşünürəm ki, bu gdal-da bir səhv ola bilər, buna əmin deyiləm.

osgeo import gdal def readFile1 (inputFile, dəyişənNo, bandNo): filereadtemp = gdal.Open (inputFile) fileread = gdal.Open (filereadtemp.GetSubDatasets () [variableNo] [0]) out = fileread.GetRasterBand (bandNo) nod out.GetNoDataValue () return nodatavalue def readFile2 (inputFile, variableNo, bandNo): filereadtemp = gdal.Open (inputFile) fileread = gdal.Open (filereadtemp.GetSubDatasets () [variableNo] [0]) out = fileread ) qayıt

İşinizdən yalnız zolağı qaytardığınızda verilənlər bazası ayrılır.

Çözüm verilənlər bazasını funksiyanızdan geri qaytarmaqdır.

GDAL Python Gotchas səhifəsindən:

Python, əlaqəsi olan bir obyekti sildikdən sonra bir obyekt istifadə etsəniz qəzaya uğrayır

Bu nümunəni nəzərdən keçirin:

osgeo import gdal verilənlər bazası = gdal.Open ('C:  RandomData.img') band = veri.GetRasterBand (1) print band.Checksum () 31212

Bu misalda, bandın işləyə bilməsi üçün verilənlər bazasının ayrılmış qalmasını tələb edən verilənlər bazası ilə əlaqəsi var. Dəsti sildikdən sonra bandı istifadə etməyə çalışsaq, Python qəzaya uğrayacaq:

osgeo import gdal verilənlər bazası = gdal.Open ('C:  RandomData.img') band = veri kümesi.GetRasterBand (1) del verilənlər bazası # Bu, Python zibil toplayıcısının verilənlər bazasını ayırmasına səbəb olacaq.GetChecksum () # Bu, indi olacaq qrupun verilənlər bazası getdiyinə görə Python qəzası 

Bu problem özünü incə yollarla göstərə bilər. Məsələn, bir kod satırında müvəqqəti verilənlər dəsti nümunəsini yaratmağa çalışsanız baş verə bilər:

osgeo import gdal print gdal.Open ('C:  RandomData.img'). GetRasterBand (1) .Checksum () 

Bu nümunədə, GetRasterBand () çağırışından sonra verilənlər dəsti nümunəsinə artıq ehtiyac qalmadı, buna görə Python Checksum () çağırmadan əvvəl onu ayırdı.

Bu problem, GDAL və OGR obyektlərinin C ++ dilində tətbiq edildiyi və aralarındakı əlaqələrin göstəricilərdən istifadə edərək C ++ dilində saxlandığı üçün baş verir. Python-da verilənlər dəsti sildikdə arxasındakı C ++ obyektinin ayrılmasına səbəb olur. Lakin band nümunəsinin arxasındakı C ++ obyekti bunun baş verdiyini bilmir, ona görə də artıq mövcud olmayan C ++ verilənlər bazası obyektinə işarə edir. Qrup mövcud olmayan obyektə girməyə çalışdıqda, proses çökür.

GDAL komandası bu dizaynın Python proqramçılarının gözlədiyi kimi olmadığını bilir. Təəssüf ki, dizaynı düzəltmək çətindir, ona görə də bir müddət qalacaq.