أكثر

Gdal / python: استخراج معلومات الإسقاط من ملف hdf

Gdal / python: استخراج معلومات الإسقاط من ملف hdf


أحاول أن أفعل شيئًا بسيطًا إلى حد ما. خذ مجموعتين من مجموعات البيانات الفرعية من ملف hdf ، واقرأهما كمصفوفة ، وقم ببعض العمليات الحسابية واكتب المصفوفة الجديدة مرة أخرى إلى تصنيف جغرافي ، باستخدام نفس الإسقاط مثل ملفات الإدخال.

نظرًا لأنني سأكرر هذه العملية للحصول على قائمة بملفات .hdf حيث يختلف العرض ، لا يمكنني ترميز سلسلة الإسقاط لمخرجاتي. بينما يختلف الإسقاط من ملف hdf إلى ملف ، فإنه هو نفسه بالنسبة لجميع مجموعات البيانات الفرعية في ملف hdf معين. لذلك أحتاج فقط إلى الحصول على المشروع من إحدى مجموعات البيانات الفرعية. اعتقدت أنه سيكون من السهل إلى حد ما تخزين معلومات الإسقاط في متغير ، لكن الإجراءات العادية التي أستخدمها لا تعمل على ملف hdf.

إليك بعض الأشياء المختلفة التي جربتها:

ds = open (hdfFile) sds_b3 = ds.GetSubDatasets () [4] [0] sds_b4 = ds.GetSubDatasets () [5] [0] # هذا يعطيني سلسلة فارغة: proj = ds.GetProject () # كلاهما هذه تعطيني "AttributeError: كائن 'str' ليس له سمة 'GetProject": proj = ds.GetSubDatasets () [4] [0] .GetProject () proj = ds.GetSubDatasets () [4] [1] .GetProject ( ) # هذا الأخير يعمل من حيث أنه يطبع معلومات الإسقاط الصحيحة ، بالإضافة إلى # مجموعة من البيانات الوصفية الأخرى ، لكني لا أعرف كيفية استخراج الإسقاط فقط وتخزينه في متغير: os.system (' gdalinfo٪ s '٪ sds_b3)

كيف يمكنني تخزين معلومات الإسقاط في متغير ، مثل "proj = dataset.GetProject ()" عادةً ، حتى أتمكن من استخدامها عند كتابة المصفوفة الجديدة في تصنيف جغرافي؟ بمعنى آخر:

الإخراج = gdal.GetDriverByName ("GTiff"). إنشاء (اسم الإخراج ، nlines ، nrows) الإخراج.

أحتاج إما إلى معرفة الطريقة الصحيحة لاستخدام GetProject () عند استخدام hdf أو كيفية عزل جزء الإسقاط من gdalinfo كمتغير.


يعد هذا أمرًا بسيطًا إلى حد ما إذا كنت تفكر في مجموعة بيانات HDF كحاوية ، حيث تكون كل مجموعة بيانات فرعية عبارة عن صورة نقطية بإسقاطها الخاص.

خطأك في عدم فتح مجموعة البيانات الفرعية ، مثلGetSubDatasetsتقوم فقط بإرجاع السلاسل التي تحتاجها للوصول إليها.

# افتح حاوية HDF hdf_ds = gdal.Open (hdfFile) # هذه مجرد سلسلة من اسم مجموعة البيانات الفرعية b3_string = hdf_ds.GetSubDatasets () [4] [0] # افتح مجموعة البيانات الفرعية sds_b3 = gdal.Open (hdf_ds. GetSubDatasets () [4] [0]) # الحصول على مشروع الإسقاط = sds_b3.GetProject ()

أظن أن مشكلتك تحدث في بداية النص ، ربما لا تصل إلى مجموعات البيانات بشكل صحيح هنا:

ds = open (hdfFile) sds_b3 = ds.GetSubDatasets () [4] [0] sds_b4 = ds.GetSubDatasets () [5] [0]

... لا يبدو أن هناك أي خطأ في فرض الضرائب الخاص بكproj = ds.GetProject ().

لقد قمت بتحويل GeoTiffs إلى مصفوفات numpy والعودة مرة أخرى ، وهذا يناسبني:

import os، numpy، gdal # افتح مدخلات البيانات النقطية واحصل على بعض المعلومات عنها ds = gdal.Open (inRast) b = ds.GetRasterBand (1) # بافتراض وجود نطاق واحد فقط xSize = b.XSize ySize = b.YSize # الحصول على معلومات التحويل الجغرافي والإسقاط ... geoTrans = ds.GetGeoTransform () wktProject = ds.GetProject () # نص معروف جيدًا. # القراءة إلى مصفوفة numpy… bArr = gdal.Band.ReadAsArray (b) # افعل أشياء مع المصفوفة الآن… # احفظ المصفوفة ذات الحجم والشكل نفسه (أو مصفوفة أخرى مماثلة) إلى GeoTiff dst_filename = os.path. انضم (r "c:  my  save  path"، "afilename.tif") driver = gdal.GetDriverByName ('GTiff') # بالنسبة لعدد صحيح 32 بت ، يمكن أيضًا التنسيقات الأخرى: dataset = driver.Create (dst_filename ، xSize، ySize، 1، gdal.GDT_Int32) # الآن قمنا بتعيين معلومات الإسقاط من الأعلى: مجموعة البيانات. .SetNoDataValue (NoDataVal) # في حالة رغبتك في تعيين oBand.WriteArray (bArr) del dataset # تنظيف الذاكرة ومسحها.

شاهد الفيديو: CSV File to Point Shapefile - Python GDALOGR