[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