Vairāk

Cilpa, lai pārbaudītu vairāku daudzstūru pārklāšanos r


Man ir daudzstūru komplekts (pieejams šeit: http://ulozto.cz/x39ELbFt/polygons-zip), kas izveidots programmā QGis un apstrādāts R. Es gribētu zināt ja tie pārklājas vai nē, un ja jā, kur ir pārklāšanās zona (un starp kuriem daudzstūriem)? Es zinu, ka, lai to noskaidrotu, es varu izmantot rīkus:

  • virs {sp} - atdod data.frame nevis telpisku objektu!
  • krustojas {raster}
  • gKrustojums {rgeos}

Es varu atrast krustojumu, salīdzinot daudzstūri 1 pret 1 katrā laika posmā. Tomēr, tā kā mani reālie dati ir milzīgi, es gribētu izveidot cilpu un iekļaut daudzstūru atkārtojumu:

  • krustojas (p1, p2)
  • krustojas (p1, p3)
  • krustojas (p1, p4)
  • krustojas (p2, p3)
  • utt…

Šobrīd es izveidoju tikai cilpu vienam daudzstūrim, kas krustojas ar citu 3. No iegūtā daudzstūru pārklāšanās saraksta es tomēr nevaru pateikt, kuri daudzstūri ir pārklāti. Un, ja tie nav (p1 un p4), šī NULL vērtība nav iekļauta manā iegūtajā sarakstā!

bibliotēka (sp) bibliotēka (rastrs) bibliotēka (rgeos) bibliotēka (spatstat) bibliotēka (rgdal) setwd ("D:/…") p1 <- readOGR (dsn = getwd (), layer = "p1") p2 <- readOGR (dsn = getwd (), layer = "p2") p3 <- readOGR (dsn = getwd (), layer = "p3") p4 <- readOGR (dsn = getwd (), layer = "p4") ab <- saraksts (p2, p3, p4) # mana cilpa tikai 1 daudzstūrim, nevis daudzstūru kombinācijām ar divām krustošanās metodēm # krustojums pēc gIntersection {rgeos} int1 <-list () for (i in 1: length (ab)) { int11 <-gIntersection (p1, ab [[i]], byid = FALSE) int1 [[i]] <-int11} # krustojums pa krustojumu {rastrs} rst.int <-list () for (i in 1: length (ab)) {rst.int1 <-intersect (p1, ab [[i]]) rst.int [[i]] <-rst.int1}


Spēlēju arpiešķirt (),ls (), unmget ()lai paveiktu kaut ko, kas, manuprāt, uzlabos jūsu darbplūsmu. Vispirms lietojuls ()lai iegūtu sarakstu ar visiem vides mainīgajiem, kas sākas ar "p":

names_poly <- ls (modelis = '^p.')

ES izmantojuķemme ()lai atrastu visas unikālās daudzstūru kombinācijas

combos <- combn (names_poly, 2)

Es apgriezoskombinācijasizmantojotgūt()lai paņemtu daudzstūrusiunjnosauktskombinācijas. Es arī izmantojupiešķirt ()lai izveidotu jaunu objektu, kura nosaukums ir ielīmēts kopā (piem.int_p1_p2)

for (k in seq_along (combos [1,])) {i <- combos [1, k] j <- combos [2, k] print (paste ("krustojas", i, j)) piešķirt (paste (" int ", i, j, sep =" _ "), gIntersection (get (i), get (j), byid = FALSE))}

Šis solis jums, iespējams, nav vajadzīgs, jo jums ir viss jaunaisint_pi_pjSpatialPolygons kā atsevišķi objekti, bet, ja vēlaties tos iekļaut sarakstā:

int <- mget (ls (modelis = '^int_.')) rm (saraksts = ls (modelis = '^int_.') #tīrīšana

Pēc tam jūs varat piekļūt sava saraksta vienumiem, izmantojot$:

sižets (int $ int_p1_p2)

EDIT: Iepriekš, ja pārklāšanās nav, mainīgais būs NULL. Ja nevēlaties pat redzēt kombinācijas, kurās nav pārklāšanās, varat to pievienotjapaziņojums tam pašampriekšcilpa:

for (k in seq_along (combos [1,])) {i <- combos [1, k] j <- combos [2, k] print (paste ("krustojas", i, j)) if (gIntersects (get (i), get (j), byid = FALSE)) {assign (paste ("int", i, j, sep = "_"), gIntersection (get (i), get (j), byid = FALSE) )}}


Skatīties video: Perimetras (Oktobris 2021).