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

Yury Duarte yurynepomuceno em gmail.com
Sex Jan 18 11:11:44 -02 2019


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
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20190118/81c661e9/attachment.html>


Mais detalhes sobre a lista de discussão R-br