أكثر

أداء حزام الفرقة في مجموعة numpy


أود أن أجري تحسبًا للفرقة في بعض النطاقات النقطية. ما أحاول القيام به هو استيراد البيانات النقطية (تنسيق ENVI) مثل المصفوفة باستخدام gdal ، ثم أقوم بإجراء الحساب ولكن عندما أحاول حفظ البيانات النقطية ، أحصل على خطأ:

كائن 'NoneType' ليس له سمة 'SetMetadata'

هذا هو الكود الخاص بي الذي أخذته من http://geoexamples.blogspot.com.es/2012/12/raster-calculations-with-gdal-and-numpy.html

من osgeo import gdal من osgeo.gdalnumeric import * من osgeo.gdalconst import * import numpy as np slope = 1.35 intercept = -26.82 fileName = r'mypath  b1.img 'outFile = r'mypath  b1_out.img' #Open the dataset ds1 = gdal.Open (fileName، GA_ReadOnly) band1 = ds1.GetRasterBand (1) data1 = BandReadAsArray (band1) #The الفعلي account dataOut = data1 * slope + intercept #Write the file driver = gdal.GetDriverByName ("ENVI" ) dsOut = driver.Create (outFile، ds1.RasterXSize، ds1.RasterYSize، 1، band1.DataType) CopyDatasetInfo (ds1، dsOut) bandOut = dsOut.GetRasterBand (1) BandWriteArray (bandOut، dataOut)

شك Antoher الكبير هو أن البيانات الأصلية هي بايت (0-255) ولكن عندما أقوم بإجراء الحساب أحصل على قيم بيانات كبيرة وأقل من 0 و 255. لذا فأنا لست متأكدًا مما إذا كان بإمكاني حفظ النتيجة مثل بايت هل يجب علي احفظه بتنسيقه ثم قم بتشغيل gdal_translate؟


من المفترض أن تكون إحدى معلمات CopyDatasetInfo هي None ، لذا تحقق من أن dsOut ليس بلا.

يمكنك حفظ نتائجك كـ Float32 ، أو يمكنك تقليصها إلى 0-255 لحفظها كـ Byte ، أو تغييرها إلى نطاق عدد صحيح آخر. يعتمد ذلك على ما تريد القيام به بالنتيجة ، ومقدار المعلومات التي يمكنك تحمل خسارتها.


Eventuall أستخدم هذا الرمز من أمثلة rasterio:

import numpy كـ np import rasterio import subprocess # تسجيل برامج تشغيل تنسيق GDAL وخيارات التكوين مع مدير سياق #. مع rasterio.drivers (): # قراءة النطاقات النقطية مباشرة إلى مصفوفات Numpy. # مع rasterio.open (r'mypath  band1.img ') كـ src: rs = src.read () NoData_rs = np.ma.masked_where (rs == 255، rs) المجموع = NoData_rs * المنحدر + التقاطع min_msk = ( إجمالي <0) max_msk = (إجمالي> 255) إجمالي [min_msk] = 0 إجمالي [max_msk] = 254 ملف شخصي = src.profile profile.update (type = rasterio.uint8، NoData = 255) مع rasterio.open (r'my_path  ex_nd.img '،' w '، ** profile) مثل dst: dst.write (total.astype (rasterio.uint8))

أجد هذا غريبًا نوعًا ما ، لأنني اعتقدت أنه يجب علي استخدام "gdal_translate" للحصول على البيانات النقطية بالبايت مرة أخرى. عندما أقوم بإجراء الحساب ، أحصل على قيم أعلى وأسفل من 0 و 255 ، وإذا قمت بتشغيل هذا البرنامج النصي بدون أقنعة الحد الأدنى والحد الأقصى ، فسيتم إرسال هذه القيم إلى NoData (255) وهو أمر غير صحيح. على أي حال ، الآن مع هذه البرامج النصية وأقنعة min / max ، أحصل على نفس القيم التي أقوم بها عند تنفيذ خطوة gdal_translate وتلك التي قمت بتشغيلها في عملية التطبيع في الإدريسي (وهو هدفي هنا ، أن أفعل الشيء نفسه الذي قام به الإدريسي بيثون). لذلك أعتقد أنني انتهيت من هذا!

شكرا لإجابتك


شاهد الفيديو: Python NumPy For Your Grandma - einsum (شهر اكتوبر 2021).