أكثر

كيفية تحويل Float النقطية إلى متجه باستخدام Python GDAL


لدي خط نقطي عائم وأريد الآن تحويله إلى متجه. كيف يكون ذلك ممكنًا مع مكتبة Python GDAL؟

لقد حاولت معgdal_polygonize.pyمن أدوات GDAL على سطر الأوامر وعملت بشكل ممتاز. لكن هذه الأداة تعتمد علىGDALPolygonize ()مكتبة C ++ وأريد طريقة C ++مضلع ()لاستخدامها بدلاً من ذلك ، والتي تتعامل مع البيانات النقطية العائمة على حد علمي.


حاول استخدام rasterio ، الذي يستخدم GDALFPolygonize على مصفوفات عائمة.

استيراد numpy كـ np استيراد rasterio.features من Affine استيراد Affine من shapely.geometry import shape # triangle array ar = np.tri (5، dtype = "f") print (ar) for shp، val in rasterio.features.shapes ( ar ، تحويل = Affine (1 ، 0 ، 0 ، 0 ، -1 ، 5)): طباعة ('٪ s:٪ s'٪ (val، shape (shp)))

عروض:

[[1. 0. 0. 0. 0.] [1. 1. 0. 0. 0.] [1. 1. 1. 0. 0.] [1. 1. 1. 0.] [ 1. 1. 1. 1.]] 1.0: مضلع ((0 0 ، 0 5 ، 5 5 ، 5 4 ، 4 4 ، 4 3 ، 3 3 ، 3 2 ، 2 2 ، 2 1 ، 1 1 ، 1 0، 0 0)) 0.0: مضلع ((1 0، 1 1، 2 1، 2 2، 3 2، 3 3، 4 3، 4 4، 5 4، 5 0، 1 0))

أو تصور باللون الأزرق لـ1.0والأحمر لـ0.0:


لا يمكنك استخدامGDALFP المضلعباستخدام روابط GDAL python دون تعديل التعليمات البرمجية المصدر وإعادة التحويل البرمجي حيث لم يتم الكشف عنها في واجهة GDAL swig.

ملاحظة: حتى فبراير 2016 ،GDALFP المضلعهو مكشوف في مصدر صندوق GDAL SVN ، لكنه ليس في أي من الإصدارين الأحدث (1.11.4 / 2.0.2).

لتضخيم النقاط النقطية ، ستحتاج إلى التحويل من عدد عشري إلى عدد صحيح. إذا كنت تريد الاحتفاظ ببعض المنازل العشرية ، فاضرب البيانات النقطية بمقدار 10 ^ N حيث N هو عدد المنازل العشرية التي تريد الاحتفاظ بها. على سبيل المثال ، للاحتفاظ بـ 3 منازل عشرية ، اضرب في 10 ^ 3 = 1000.

# ضرب القيم النقطية بـ 1000 gdal_calc.py -A raster.tif --outfile = raster1000.tif --calc = "A * 1000" # تحويل إلى متجه gdal_polygonize.py raster1000.tif vector1000.shp

إذا كنت تريد تحويل سمات المضلع مرة أخرى إلى عائم ، فما عليك سوى القسمة على نفس القيمة.

# قسّم قيم المتجه على 1000 ogr2ogr vector.shp vector1000.shp -sql "حدد (cast (DN as float) * 0.001) كـ DN من vector1000"

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


متأخر قليلاً ، لكن أعلق إذا وجد أي شخص هذا مفيدًا. لنفترض أن لديك خط نقطي عائم (raster_path) وتريد تحويله إلى ملف شكل. يمكنك استخدام gdal FPolygonize داخل بيثون على النحو التالي:

source_raster = gdal.Open (raster_path) band = gdal.Open (raster_path) .GetRasterBand (1) driver = ogr.GetDriverByName ('ESRI Shapefile') out_data = driver.CreateDataSource (srefile_path. SpatialReference () srs.ImportFromWkt (source_raster.GetProjectRef ()) # إنشاء طبقة مع الإسقاط out_layer = out_data.CreateLayer (raster_path.split ('.') [0]، srs) new_field = ogr.FieldDefn ('field_name'، ogr.FieldDefn ('field_name'، ogr.FieldDefn ('field_name'، ogr.FieldDefn ('field_name'، ogr.FieldDefn ('field_name'، ogr.FieldDefn OFTReal) out_layer.CreateField (new_field) gdal.FPolygonize (band، band، out_layer، 0، []، callback = None) out_data.Destroy () source_raster = لا شيء


شاهد الفيديو: شرح 6: التحويل بين المتغيرات int-float-str-chr. Learn Python 3 (شهر اكتوبر 2021).