<div dir="ltr"><div dir="ltr"><div>Bom dia a todos!</div><div><br></div><div>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.</div><div>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.</div><div>Assim, um polígono que foi unido não mais seria considerado no laço.</div><div><br></div><div>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.</div><div>Caso alguém tenha uma ideia de logica/abordagem diferente, ficarei feliz em testar!</div><div><br></div><div>Desde já, agradeço o auxilio de todos! </div><div><br></div><div><div>#############################################################################</div><div>rodar_bibliotecas = function(necessarias){</div><div>  </div><div>  if(necessarias){</div><div>    library(rgrass7)</div><div>    library(spatstat) </div><div>    library(maptools) </div><div>    library(shapefiles)</div><div>    library(foreign)</div><div>    library(magrittr)</div><div>    library(formattable)</div><div>    library(e1071)</div><div>    library(rlang)</div><div>    library(rgdal)</div><div>    library(rgeos)</div><div>    library(raster)</div><div>    library(sp)</div><div>    library(sf)</div><div>    library(RcppCNPy)</div><div>    library(deldir)</div><div>    library(dismo)</div><div>    library(dplyr)</div><div>    library(ggplot2)</div><div>    library(gstat)</div><div>    library(tidyverse)</div><div>    library(smoothr)</div><div>    library(viridisLite)</div><div>    library(gpclib)</div><div>  }</div><div>  return('Ok')</div><div>}</div><div><br></div><div>#############################################################################</div><div>rodar_bibliotecas(TRUE)</div><div><br></div><div>xpol = c(0,1,1,0,0)</div><div>ypol = c(0,0,1,1,0)</div><div>pol = SpatialPolygons(list(</div><div>  Polygons(list(Polygon(cbind(xpol-1.05,ypol))), ID="x1"),</div><div>  Polygons(list(Polygon(cbind(xpol,ypol))), ID="x2"),</div><div>  Polygons(list(Polygon(cbind(xpol,ypol - 1.0))), ID="x3"),</div><div>  Polygons(list(Polygon(cbind(xpol + 1.0, ypol))), ID="x4"),</div><div>  Polygons(list(Polygon(cbind(xpol+.4, ypol+.1))), ID="x5")))</div><div>plot(pol)</div><div><br></div><div>#############################################################################</div><div>#nao precisava ter feito isso, mas fiz para deixar o exemplo no mesmo formato com que meus dados estao vindo</div><div>areas = length(pol)</div><div>lista_vazia = list()</div><div><br></div><div>for (area in 1:length(areas)) {</div><div>  lista_vazia[area] = pol[area]</div><div>}</div><div><br></div><div>lista = lista_vazia</div><div>lista.1 = lista_vazia</div><div>#tentativa de loop para unir poligonos que se encostam</div><div># for (i in 1:length(lista)) {</div><div>while (i < length(lista)) {</div><div>  if(i >= length(lista.1)){</div><div>    break()</div><div>  }else{</div><div>    j = 2</div><div>    while (j < length(lista.1)) {</div><div>      # for (j in 2:length(lista.1)) {</div><div>      if(!<a href="http://is.na">is.na</a>((over(lista[[i]], lista.1[[j]], returnList = F) == 1))) {</div><div>        lista[[i]] = gUnion(lista.1[[i]], lista.1[[j]])</div><div>        lista.1[[i]] = gUnion(lista.1[[i]], lista.1[[j]])</div><div>        </div><div>        #lista[[j]] = NULL</div><div>        lista.1 = lista.1[-j]</div><div>        lista = lista[-j]</div><div>      }else{</div><div>        j = j+1</div><div>      }</div><div>    }</div><div>    i = i+1</div><div>  }</div><div>}</div><div><br></div><div>#############################################################################</div><div>fim = lista.1[[1]]</div><div>plot(fim)</div><div>for (x in 2:length(lista)){</div><div>  if(x==2){</div><div>    if(<a href="http://is.na">is.na</a>((over(fim, lista[[x]], returnList = T) == 1))){</div><div>      fim = bind(fim, lista[[x]])</div><div>    }</div><div>  }else{</div><div>    a = <a href="http://is.na">is.na</a>((over(fim, lista[[x]], returnList = T) == 1)) </div><div>    </div><div>    if(a[length(a)] == TRUE){</div><div>      fim = bind(fim, lista[[x]])</div><div>    }</div><div>  }</div><div>}</div><div>#o objetivo final seria ter todas as areas da lista unidas num unico objeto</div><div>#dessa forma, o contorno do polt(pol) devera ser igual ao contorno do plot(fim)</div><div>plot(pol)</div><div>plot(fim)</div></div><br clear="all"><div><div dir="ltr" class="gmail_signature"><div dir="ltr"><div>Yury Duarte<br></div>Engenheiro Agrônomo - ESALQ/USP<br></div></div></div></div></div>