[R-br] Construir um laço que modifique o conteúdo do meu contador

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[R-br] Construir um laço que modifique o conteúdo do meu contador

R-br mailing list
Bom dia a todos!

Há algum tempo venho tentando encontrar uma lógica de laço aonde eu consiga eliminar determinadas posições de uma lista (que uso de contador), de acordo com uma condição, e seguir com laço.
Em suma, dentro de uma lista de polígonos, preciso identificar os polígonos que se sobrepõe (mesmo que apenas se encostem), uni-los num novo polígono (sobrescrevendo o primeiro?), eliminando o que restou da união e seguindo o fluxo do laço com o resultado da união.
Assim, um polígono que foi unido não mais seria considerado no laço.

Segue um código como exemplo, aonde testei algumas possibilidades para contornar a questão. Acredito que a leitura do código elucide melhor meu problema.
Caso alguém tenha uma ideia de logica/abordagem diferente, ficarei feliz em testar!

Desde já, agradeço o auxilio de todos! 

#############################################################################
rodar_bibliotecas = function(necessarias){
  
  if(necessarias){
    library(rgrass7)
    library(spatstat) 
    library(maptools) 
    library(shapefiles)
    library(foreign)
    library(magrittr)
    library(formattable)
    library(e1071)
    library(rlang)
    library(rgdal)
    library(rgeos)
    library(raster)
    library(sp)
    library(sf)
    library(RcppCNPy)
    library(deldir)
    library(dismo)
    library(dplyr)
    library(ggplot2)
    library(gstat)
    library(tidyverse)
    library(smoothr)
    library(viridisLite)
    library(gpclib)
  }
  return('Ok')
}

#############################################################################
rodar_bibliotecas(TRUE)

xpol = c(0,1,1,0,0)
ypol = c(0,0,1,1,0)
pol = SpatialPolygons(list(
  Polygons(list(Polygon(cbind(xpol-1.05,ypol))), ID="x1"),
  Polygons(list(Polygon(cbind(xpol,ypol))), ID="x2"),
  Polygons(list(Polygon(cbind(xpol,ypol - 1.0))), ID="x3"),
  Polygons(list(Polygon(cbind(xpol + 1.0, ypol))), ID="x4"),
  Polygons(list(Polygon(cbind(xpol+.4, ypol+.1))), ID="x5")))
plot(pol)

#############################################################################
#nao precisava ter feito isso, mas fiz para deixar o exemplo no mesmo formato com que meus dados estao vindo
areas = length(pol)
lista_vazia = list()

for (area in 1:length(areas)) {
  lista_vazia[area] = pol[area]
}

lista = lista_vazia
lista.1 = lista_vazia
#tentativa de loop para unir poligonos que se encostam
# for (i in 1:length(lista)) {
while (i < length(lista)) {
  if(i >= length(lista.1)){
    break()
  }else{
    j = 2
    while (j < length(lista.1)) {
      # for (j in 2:length(lista.1)) {
      if(!is.na((over(lista[[i]], lista.1[[j]], returnList = F) == 1))) {
        lista[[i]] = gUnion(lista.1[[i]], lista.1[[j]])
        lista.1[[i]] = gUnion(lista.1[[i]], lista.1[[j]])
        
        #lista[[j]] = NULL
        lista.1 = lista.1[-j]
        lista = lista[-j]
      }else{
        j = j+1
      }
    }
    i = i+1
  }
}

#############################################################################
fim = lista.1[[1]]
plot(fim)
for (x in 2:length(lista)){
  if(x==2){
    if(is.na((over(fim, lista[[x]], returnList = T) == 1))){
      fim = bind(fim, lista[[x]])
    }
  }else{
    a = is.na((over(fim, lista[[x]], returnList = T) == 1)) 
    
    if(a[length(a)] == TRUE){
      fim = bind(fim, lista[[x]])
    }
  }
}
#o objetivo final seria ter todas as areas da lista unidas num unico objeto
#dessa forma, o contorno do polt(pol) devera ser igual ao contorno do plot(fim)
plot(pol)
plot(fim)

Yury Duarte
Engenheiro Agrônomo - ESALQ/USP

_______________________________________________
R-br mailing list
[hidden email]
https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne�a c�digo m�nimo reproduz�vel.