أكثر

حساب المسافة بين حواف التصحيح النقطية بكفاءة

حساب المسافة بين حواف التصحيح النقطية بكفاءة


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

هذا ما لدي حتى الآن:

مكتبة (نقطية) مكتبة (igraph) (rgeos) # 10x10 UTM نقطية بدقة 1km utm10 <- crs ('+ proj = utm + zone = 10 + ellps = GRS80 + datum = NAD83 + وحدات = m + no_defs') r <- نقطية (المدى (ج (0 ، 10000 ، 0 ، 10000)) ، nrows = 10 ، ncols = 10 ، crs = utm10) patchCells <- c (1، 2، 35، 45، 62، 87، 88، 89 ، 98، 99، 100) r [patchCells] <- 1 # تصنيفها إلى رقع p <- تكتل (r ، اتجاهات = 8 ، فجوات = F) spplot (p) # rasterToPolygon طريقة rpoly <- rasterToPolygons (p ، إذابة = T ) d <- gDistance (rpoly ، byid = T)

المسافات:

1 2 3 4 1 0.000 2828.427 5000.000 8062.258 2 2828.427 0.000 2236.068 3162.278 3 5000.000 2236.068 0.000 4123.106 4 8062.258 3162.278 4123.106 0.000

تم التعديل لإضافة بعض المعلومات الإضافية: سيكون هذا بشكل مثالي جزءًا من تمرين التحسين باستخدام التلدين المحاكي. لذلك ، يجب حساب هذه المسافات عدة آلاف من المرات مع تقدم الخوارزمية. ومن هنا تأتي الحاجة إلى الكفاءة. آمل أن أبقي هذا داخل R ، ولكن إذا اتضح أنه لا يوجد نهج أكثر كفاءة مما لدي بالفعل ، فمن المحتمل أن أتطلع إلى استخدام أدوات أخرى ، مثل C.


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

يمكن استئناف عملية الهدف في:

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

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

ها هو الكود:

مكتبة (نقطية) مكتبة (sf) مكتبة (dplyr) (doParallel) shp <- st_read ("./ Layers / pol.gpkg") r <- نقطية ("./ طبقات / raster.tif") # --- -------------------------------------------------- -------------------------- system.time ({# ------------------ -------------------------------------------------- ----------- # إعداد البيانات # ----------------------------------- -------------------------------------------- shp $ id <- row .names (shp) # add id to shp # list of int value in raster vals <- unique (القيم (r)) [! is.na (unique (القيم (r)))] vals <- sort (vals) # -------------------------------------------------- ----------------------------- # حساب مسافة الراس المتوازية # --------------- -------------------------------------------------- -------------- # تسجيل متوازي cl <- المتوازي :: makeCluster (detectCores () - 1 ، type = "FORK") doParallel :: registerDoParallel (cl) rdlist <- foreach (i = vals)٪ dopar٪ {rx <- r # عزل بعض القيم النقطية rx [rx! = i] = NA # تغيير جميع القيم الأخرى إلى NA # mapview (rx) return (المسافة (rx)) #calculate rdistancie لقيمة i} # stop المتوازي stopCluster (cl) # ----------------------------- -------------------------------------------------- # إنشاء مكدس نقطي مع كل خطوط المسح للمسافات rstack <- stack (rdlist) # ------------------------------- ------------------------------------------------ # خلق مصفوفة المسافة عن طريق استخراج القيمة الدنيا التي تلامس كل من المضلعات dmatrix <- raster :: extract (rstack، shp، fun = min) # ------------------- -------------------------------------------------- ---------- # stop for sys.time}) # ------------------------------- ------------------------------------------------ # التحقق من REULTS dmatrix # بعض الأمثلة على mapview (rstack [1]] ، alpha = 0.5 ، zcol = "temp" ، at = seq (0 ، 10000 ، 1000)) + r

ها هي المصفوفة النهائية:

> طبقة دماتريكس 1 طبقة 2 طبقة 3 طبقة 4 طبقة 5 طبقة 6 طبقة 7 طبقة 8 [1] 0.0000 933.6791 1742.951 2176.5283 1698.5293 3014.6978 5675.093 5690.900 [2] 920.0934 0.0000 1292.166 866.5944 985.9346 1586.2994 4493.658 4714.124 [3] 1732.9741 1296.7955 0.000 1201.5022 2731.6607 2375.9132 5800.152 3481.757 [4] 2168،9618 863.7626 1202.043 0.0000 1859،1775 789.1739 4199.616 3540.644 [5] 1696،6454 985.9346 2734.867 1859،5479 0.0000 1848،9581 3600.012 5728.494 [6] 3011.7676 1580.7771 2387.291 790.0659 1846،6686 0.0000 2730.108 3508.944 [7 ،] 5680.0280 4504.4154 5815.739 4212.3344 3593.5737 2742.1777 0.000 5999.429 [8،] 5687.4051 4706.9927 3480.741 3538.9490 5730.2395 3518.9409 5990.652 0.000

... وهنا بعض التصور للمسافة النقطية المحسوبة للرقعة "1" ، حيث r هي نقطية التصحيح و rstack [1] هي النقطية الحلقية:

هنا لديك أيضًا دليل العمل إذا كنت تريد تجربة هذا المثال: https://drive.google.com/drive/folders/19A1cmGD1pWgmzxRqhZDj2FGTbOnKWm8K؟

هذا هو المعيار الخاص بي (ryzen 2600) لهذه الطبقات:

انقضى نظام المستخدم 69.086 21.309 16.342

شاهد الفيديو: 129- Survey Direct distances measurements 1 القياس المباشر للمسافات