أكثر

استخراج نسبة البكسل لفئات خطوط المسح الدقيقة في صورة نقطية أكثر خشونة

استخراج نسبة البكسل لفئات خطوط المسح الدقيقة في صورة نقطية أكثر خشونة


لدي نقطتان ، واحدة بدقة 1 كم. الآخر لديه دقة مكانية 30 م. هذا الأخير بكسل هو تصنيف. أرغب في تراكب خطوط المسح البالغ طولها كيلومترًا واحدًا على تصنيف البيانات النقطية واستخراج توزيع الفئات المطابقة لتصنيف 30 مترًا لكل 1 كيلومتر بكسل.

يشتمل تصنيف 30 م على 7 فئات لذا أود أن تنتج هذه العملية 7 طبقات جديدة على بعد 1 كم. واحد لكل فصل. كل بكسل من كيلومتر واحد سيقترن الآن بنسبة مقابلة من وجود كل فئة موجودة في تصنيف 30 مترًا. إذا قام أحدهم بعمل جدول حيث يكون كل صف به بكسل ، فسيكون لدى المرء جدول مثل التالي:

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

تعديل:

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


الخطوة 1

قم بعمل نقط نقطية لكل فئة من الفئات الفريدة. يمكن أن يكون هذا نطاقًا نقطيًا واحدًا لكل فئة ، أو نقطية فردية مع نطاق لكل فئة (على سبيل المثال ، GeoTIFF). إذا كنت تستخدم GTiff ، فيمكنك استخدام خيار الإنشاءNBITS = 1للحفاظ على الفضاء. قد ترغب أيضًا في التفكير في نقطتين نقطيتين لتخزين المنطق ثلاثي القيم حيث يكون الثالث (على سبيل المثال 2) هو NODATA ، الأمر الذي يتطلبNBITS = 2.

لكل نطاق / فئة ، ستكون وحدات البكسل 0 حيث لا توجد هذه الفئة ، أو 1 حيث توجد هذه الفئة.

استيراد numpy كـ np من osgeo import gdal gdal.UseExceptions () # الحصول على البيانات من البيانات النقطية مع التصنيفات ds = gdal.Open ('cropped_30m.tif') band = ds.GetRasterBand (1) class_ar = band.ReadAsArray () gt = ds .GetGeoTransform () pj = ds.GetProject () ds = band = None # close # حدد القيم النقطية لكل فئة ، لربطها بكل نطاق class_ids = (np.arange (31) + 1) .tolist () # Make نقطية بت جديدة drv = gdal.GetDriverByName ('GTiff') ds = drv.Create ('bit_raster.tif'، class_ar.shape [1]، class_ar.shape [0]، len (class_ids)، gdal.GDT_Byte، [ 'NBITS = 1'، 'COMPRESS = LZW'، 'INTERLEAVE = BAND']) ds.SetGeoTransform (gt) ds.SetProject (pj) لـ bidx في النطاق (ds.RasterCount): النطاق = ds.GetRasterBand (bidx + 1 ) # إنشاء اختيار منطقي = (class_ar == class_ids [bidx]) band.WriteArray (select.astype ('B')) ds = band = None # save ، close

على سبيل المثال بالنسبة إلى الأحمر = النطاق 10 ، والأخضر = النطاق 13 ، والأزرق = النطاق 27 ، يمكن تصور ذلك:

يشير اللون الأسود إلى أنها فئة / فرقة أخرى.

الخطوة 2

استخدم gdalwarp للحصول على ملف معدل قيم 0 و 1 من شبكة عينة أكثر خشونة. تتطلب هذه الطريقة جدال> = 1.10.0. الطريقة البسيطة للقيام بذلك هي تحديد الدقة المستهدفة في سطر الأوامر ، على سبيل المثال 1 كم:

$ gdalwarp -ot Float32 -tr 1000 1000 -r متوسط ​​bit_raster.tif_1km.tif

سيكون للنتيجة العديد من النطاقات مثل الفئات ، وسيصف كل نطاق كسر هذه الفئة لكل بكسل ، بين 0 و 1. إذا كنت تفضل النسبة المئوية ، فاضربها في 100 (على سبيل المثال انظر gdal_calc.py).

هناك أيضًا واجهة Python لـ gdalwarp (مثل هذه الإجابة) ، والتي يمكن أن تستخدم قالب نقطي للشكل وأين يجب استخدام NODATA. على سبيل المثال:

# افتح البيانات النقطية من الخطوة 1 src_ds = gdal.Open ('bit_raster.tif') # افتح قالبًا أو انسخ مجموعة ، للأبعاد وقناع NODATA cpy_ds = gdal.Open ('cropped_1000m.tif') band = cpy_ds.GetRasterBand (1 ) cpy_mask = (band.ReadAsArray () == band.GetNoDataValue ()) # نتيجة المسح ، بنفس الدقة والموضع مثل النسخة النقطية dst_ds = drv.Create ('average2_1km.tif'، cpy_ds.RasterXSize، cpy_ds.RasterYSize، len (class_ids)، gdal.GDT_Float32، ['INTERLEAVE = BAND']) dst_ds.SetGeoTransform (cpy_ds.GetGeoTransform ()) dst_ds.SetProject (cpy_ds.GetProject ()) # افعل نفس الشيء مثل gdalwarp -r average ؛ قد يستغرق هذا بعض الوقت لإنهاء gdal.ReprojectImage (src_ds، dst_ds، None، None، gdal.GRA_Average) # قم بتحويل جميع الكسور إلى نسبة مئوية ، وقم بتطبيق نفس قناع NODATA من النسخة النقطية NODATA = -9999 لـ Bidx في النطاق (dst_ds .RasterCount): band = dst_ds.GetRasterBand (bidx + 1) ar = band.ReadAsArray () * 100.0 ar [cpy_mask] = NODATA band.WriteArray (ar) band.SetNoDataValue (NODATA) # حفظ وإغلاق جميع البيانات النقطية src_ds = cpy_ds = dst_ds = الفرقة = لا شيء

على سبيل المثال يمكن تصور نفس النطاقات الثلاثة (الفئات) على أنها RGB:

أو اسحبه إلى QGIS ، واستخدم أداة تحديد الميزات لفحص الكسر لكل نطاق / تصنيف في مكان واحد:

تضيف هذه الأرقام ما يصل إلى 100٪ ، وهو فحص جيد.


شاهد الفيديو: فحص العيون - إذا تجاوزت المستوى 4 فأنت تملك عيون خارقة