Construir um laço que modifique o conteúdo do meu contador

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
participantes (1)
-
Yury Duarte