أكثر

قم بإنشاء نقطية بقيم خلايا الشبكة بناءً على المنطقة التي تغطيها المضلعات

قم بإنشاء نقطية بقيم خلايا الشبكة بناءً على المنطقة التي تغطيها المضلعات


لدي بيانات مضلع بمساحة تغطيها الغابات (البيانات هنا - https://www.dropbox.com/s/zgckliydalljw6a/sp_data.zip؟dl=0). أريد تحويل المضلعات إلى نقطية. يجب أن تستند قيمة كل خلية شبكية إلى المنطقة التي يغطيها المضلع. على سبيل المثال ، إذا كان حجم خلية الشبكة 100 م × 100 م (10000 م 2) وكانت المضلعات تغطي 5000 م 2 من هذه الخلية - يجب أن تكون القيمة 50 (أو 0.5). أدناه ، يمكنك العثور على الحل المقترح:

مسودة بيانات:

مكتبة ('rgdal') مكتبة ('نقطية') مكتبة ('rgeos') مكتبة ('maptools') sp_data <- readOGR ("."، "sp_data") spplot (sp_data)

لقد قمت بإنشاء خطوط نقطية جديدة بدقة 100 متر ومدى يساوي المربع المحيط بالمضلع:

r <- النقطية () bb <- المدى (290000 ، 300000 ، 500000 ، 510000) المدى (r) <- bb res (r) <- 100

لقد قمت أيضًا بإنشاء مضلع خلفية - مع قيم المساحات التي لا تحتوي على مجموعة تفرعات تساوي 0. بعد ذلك ، قمت بدمج بيانات المضلعين هاتين:

sp_back <- as (مدى (r) ، "SpatialPolygons") proj4string (sp_back) <- proj4string (sp_data) sp_back <- gDifference (sp_back، sp_data) مؤامرة (sp_back، col = "red") مؤامرة (sp_data، col = " green ") sp_back <- SpatialPolygonsDataFrame (sp_back، data = data.frame (value = rep (0، length (sp_back))، row.names = row.names (sp_back))) sp_back <- spChFIDs (sp_back،" new_id " ) sp_bind <- spRbind (sp_data ، sp_back) spplot (sp_bind)

بالإضافة إلى ذلك ، لقد قمت بإنشاء خطوط نقطية جديدة بدقة منخفضة (500 متر):

r2 <- ص الدقة (r2) <- 500

لقد قمت بتنقيط بيانات المضلع إلى أول خطوط المسح:

sp_raster <- تنقيط (sp_bind، r، field = "value"، fun = max) spplot (sp_raster، side = "iso")

في النهاية ، قمت بإعادة تشكيل القيم النقطية الأولى في البيانات النقطية الثانية:

sp_raster2 <- resample (sp_raster، r2، method = "bilinear") spplot (sp_raster2 ، الجانب = "iso")

بناءً على النتائج ، لدي بعض الأسئلة:

  1. بادئ ذي بدء - هل الحل والنتيجة صحيحة؟
  2. التحويل بين المتجه والنقطية يبسط بياناتي بطريقة ما (على سبيل المثال ، فقدان المضلعات الصغيرة) وربما يضيف بعض الأخطاء. نتيجة إعادة التشكيل تتأثر بهذا التبسيط. هل هناك أي حل بديل لحساب حصة مساحة المضلع في خلية الشبكة؟

نرحب بالإجابات التي تستخدم R أو Grass أو SAGA.


نظرًا لأنك وضعت GRASS في العلامات ، فإليك حلًا يعتمد على GRASS:

أولاً ، عليك أن تعرف بالضبط ما هو النظام الإحداثي الذي توجد فيه البيانات الأصلية (كما هو الحال دائمًا مع GRASS). أرى أن ملف * .prj يحتوي على "TRANSVERSE MERCATOR" ولكنه ليس أحد مناطق UTM القياسية. نظرًا لأنك لم تذكر رمز EPSG لهذه البيانات ، فإليك سلسلة proj4 لإنشاء موقع GRASS مطابق جديد:

+ المشروع = tmerc + lat_0 = 0 + lon_0 = 19 + k = 0.9993 + x_0 = 500000 + y_0 = -5300000 + ellps = WGS84 + الوحدات = m + no_defs

ابدأ الآن GRASS ، وأنشئ موقعًا (بناءً على ما سبق) وخريطة.

والآن قم باستيراد ملف الشكل إلى GRASS عن طريق تشغيل:

v.in.ogr input = "sp_data.shp" الإخراج = sp_data

أضف عمودًا لمنطقة كل معلم ، واحسب مساحته:

v.db.addcolumn map = أعمدة sp_data = "area_sqm INT" v.to.db خيار sp_data = عمود المنطقة = area_sqm unit = متر

الآن قم بالتحويل إلى خطوط المسح ، باستخدام العمود area_sqm كقيمة نقطية. لكن اولا تعيين منطقة حساب GRASS:

ز - متجه p = sp_data res = 100

الآن قم بإنشاء شبكة متجهة من المضلعات بدقة خطوط المسح:

خريطة v.mkgrid = الشبكة

تتقاطع مع مضلعات الغابة ، واحسب مساحات هذه المضلعات المتقاطعة: تتقاطع مع مضلعات الغابة ، قم بحل المضلعات داخل نفس خلية الشبكة ، وحساب مناطق هذه المضلعات المتقاطعة ، وانقل قيمة المساحة إلى خلايا الشبكة:

v.overlay ain = network bin = sp_data عامل = وإخراج = forest_grid_intersect v.dissolve --overwrite input = forest_grid_intersect @ jn column = a_cat output = forest_grid_intersect_dissolve v.db.addtable map = forest_grid_intersect_dissolve column = "area_sqm.intersect_dissolve column =" area_sqm. db forest_grid_intersect_dissolve option = area column = area_sqm unit = meter v.db.join map = network @ jn column = cat other_table = forest_grid_intersect_dissolve other_column = cat

v.db.addcolumn map = forest_grid_intersect عمود = "area_sqm INT" v.to.db forest_grid_intersect الخيار = عمود المنطقة = area_sqm unit = متر

وتحويل إلى نقطية ، باستخدام سمة المنطقة كقيمة نقطية:

v.to.rast المدخلات = نوع الشبكة = إخراج المنطقة = استخدام sp_data_rast = سمة سمة_السيرة الذاتية = area_sqm

إنتهيت. آمل أن يكون هذا صحيحًا هذه المرة :-).


كنت أحاول فقط معرفة كيفية القيام بنفس الشيء في r. هذا هو النهج الذي توصلت إليه:

-إنشاء خطوط نقطية لها الأبعاد وحجم الخلية الذي تريده

-استخدم وظيفة "تنقيط" من الحزمة النقطية ، باستخدام خيار "getCover"

مكتبة (نقطية) الأراضي الرطبة <- readShapePoly ("data / wetlands.shp"، proj4string = CRS ("+ init = EPSG: 26907)) r <- نقطية (ncols = 200، nrows = 200، Resolution = 5، crs = CRS ("+ init = EPSG: 26907)) الأراضي الرطبة AREA <- تنقيط (الأراضي الرطبة ، r ، getCover = TRUE)

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


شاهد الفيديو: regelmatige veelhoeken