1 votos

Uso de R para puntos en la unión de polígonos

Estoy tratando de poner círculos concéntricos alrededor de una ubicación xy y dividirlos en segmentos para el análisis de "anillos y sectores". He conseguido que funcione, he reiniciado el entorno, he vuelto a ejecutar el código y no ha funcionado. Estoy atascado en el

#joining points to polys
join <- over (rings,points)
rings@data <- left_join(rings@data, points, by = c("id" = "id"), copy = TRUE)

Dice:

"Error en left_join(rings@data, points, by = c(id = "id"), copy = TRUE) : no hay ranura de nombre "datos" para este objeto de clase "SpatialPolygons""

Y sí @data no existe, aquí hay una imagen del resultado cuando lo tenía funcionando. ¿En qué me he equivocado? Y sí, voy a simplificar el código con bucles for cuando funcione.

[![Análisis de anillos y sectores][1]]

#variables
xcoord <- 50
ycoord <- 50
wd <- 5 #width of rings
rn <-3 #number of rings

#point dataset

#dummy data
set.seed(1)
a <- rnorm(100, mean=50, sd=5)
b <- rnorm(100, mean=50, sd=5)
coords <- cbind(a,b)
points <- SpatialPoints(coords)

#libraries
library(sp)
library(raster)
library(rgdal)
library(rgeos)
library(maptools)

library(dplyr)
library(GISTools)

#create central location
par(mfrow=c(1,1))
xy <- cbind(xcoord,ycoord)
xy <- SpatialPoints(xy)

#make circles
c1 <- gBuffer(xy, width=wd, quadsegs = 10)
c2 <- gBuffer(xy, width=wd*2, quadsegs = 10)
c3 <- gBuffer(xy, width=wd*3, quadsegs = 10)

#make rings
r1 <- c1
r2 <- gDifference(c2,c1)
r3 <- gDifference(c3,c2)

r <- raster::union(r1,r2)
r <- raster::union(r,r3)

#define segments
p1 <- cbind(c(xcoord,xcoord,xcoord+wd*rn,xcoord),
            c(ycoord,ycoord+wd*rn,ycoord+wd*rn,ycoord))
p2 <- cbind(c(xcoord,xcoord+wd*rn,xcoord+wd*rn,xcoord),
            c(ycoord,ycoord+wd*rn,ycoord,ycoord))
p3 <- cbind(c(xcoord,xcoord+wd*rn,xcoord+wd*rn,xcoord),
            c(ycoord,ycoord,ycoord-wd*rn,ycoord))
p4 <- cbind(c(xcoord,xcoord+wd*rn,xcoord,xcoord),
            c(ycoord,ycoord-wd*rn,ycoord-wd*rn,ycoord))
p5 <- cbind(c(xcoord,xcoord,xcoord-wd*rn,xcoord),
            c(ycoord,ycoord-wd*rn,ycoord-wd*rn,ycoord))
p6 <- cbind(c(xcoord,xcoord-wd*rn,xcoord-wd*rn,xcoord),
            c(ycoord,ycoord-wd*rn,ycoord,ycoord))
p7 <- cbind(c(xcoord,xcoord-wd*rn,xcoord-wd*rn,xcoord),
            c(ycoord,ycoord,ycoord+wd*rn,ycoord))
p8 <- cbind(c(xcoord,xcoord-wd*rn,xcoord,xcoord),
            c(ycoord,ycoord+wd*rn,ycoord+wd*rn,ycoord))

p1 <- Polygon(p1)
p2 <- Polygon(p2)
p3 <- Polygon(p3)
p4 <- Polygon(p4)
p5 <- Polygon(p5)
p6 <- Polygon(p6)
p7 <- Polygon(p7)
p8 <- Polygon(p8)

p1 <- Polygons(list(p1),1)
p2 <- Polygons(list(p2),2)
p3 <- Polygons(list(p3),3)
p4 <- Polygons(list(p4),4)
p5 <- Polygons(list(p5),5)
p6 <- Polygons(list(p6),6)
p7 <- Polygons(list(p7),7)
p8 <- Polygons(list(p8),8)

p <- SpatialPolygons(list(p1,p2,p3,p4,p5,p6,p7,p8))

#plot(p[1:6], xlim=c(35,65),ylim=c(35,65))

#plot(r[1], xlim=c(35,65), ylim=c(35,65))
#plot(p[1], add=TRUE)
#plot(r1s1)

#make segments
#ring1
r1s1 <- rgeos::gIntersection(p[1],r[1])
r1s2 <- rgeos::gIntersection(p[2],r[1])
r1s3 <- rgeos::gIntersection(p[3],r[1])
r1s4 <- rgeos::gIntersection(p[4],r[1])
r1s5 <- rgeos::gIntersection(p[5],r[1])
r1s6 <- rgeos::gIntersection(p[6],r[1])
r1s7 <- rgeos::gIntersection(p[7],r[1])
r1s8 <- rgeos::gIntersection(p[8],r[1])

#ring2
r2s1 <- rgeos::gIntersection(p[1],r[2])
r2s2 <- rgeos::gIntersection(p[2],r[2])
r2s3 <- rgeos::gIntersection(p[3],r[2])
r2s4 <- rgeos::gIntersection(p[4],r[2])
r2s5 <- rgeos::gIntersection(p[5],r[2])
r2s6 <- rgeos::gIntersection(p[6],r[2])
r2s7 <- rgeos::gIntersection(p[7],r[2])
r2s8 <- rgeos::gIntersection(p[8],r[2])

#ring3
r3s1 <- rgeos::gIntersection(p[1],r[3])
r3s2 <- rgeos::gIntersection(p[2],r[3])
r3s3 <- rgeos::gIntersection(p[3],r[3])
r3s4 <- rgeos::gIntersection(p[4],r[3])
r3s5 <- rgeos::gIntersection(p[5],r[3])
r3s6 <- rgeos::gIntersection(p[6],r[3])
r3s7 <- rgeos::gIntersection(p[7],r[3])
r3s8 <- rgeos::gIntersection(p[8],r[3])

#plot(r[1:3], xlim=c(35,65), ylim=c(35,65))

#inner ring
s <- r1s1
s <- raster::union(s,r1s2)
s <- raster::union(s,r1s3)
s <- raster::union(s,r1s4)
s <- raster::union(s,r1s5)
s <- raster::union(s,r1s6)
s <- raster::union(s,r1s7)
s <- raster::union(s,r1s8)

#middle ring
s <- raster::union(s,r2s1)
s <- raster::union(s,r2s2)
s <- raster::union(s,r2s3)
s <- raster::union(s,r2s4)
s <- raster::union(s,r2s5)
s <- raster::union(s,r2s6)
s <- raster::union(s,r2s7)
s <- raster::union(s,r2s8)

#outer ring
s <- raster::union(s,r3s1)
s <- raster::union(s,r3s2)
s <- raster::union(s,r3s3)
s <- raster::union(s,r3s4)
s <- raster::union(s,r3s5)
s <- raster::union(s,r3s6)
s <- raster::union(s,r3s7)
s <- raster::union(s,r3s8)

#you can see that the first 8 form in the correct order, 9+ are behaving strangely
plot(s[1:24], xlim=c(35,65), ylim=c(35,65))

plot(p)
plot(s)

rings <- s 

#joining points to polys
join <- over (rings,points)
rings@data <- left_join(rings@data, points, by = c("id" = "id"), copy = TRUE)

plot(rings)
plot(points, add = TRUE)
counts = poly.counts(points,rings)

counts[counts == 0] <- NA

par(mfrow=c(1,2))

shades = auto.shading(counts,cols=brewer.pal(5,'Blues'))
choropleth(rings, counts, shades, xlim=c(35,65),ylim=c(35,65), main="Ring and Sectors")
plot(points, add = TRUE)

1voto

elmigranto Puntos 171

Hay que arreglar algunas cosas y debería funcionar:

En primer lugar, mueva sus bibliotecas a la parte superior de su script o points <- SpatialPoints(coords) errores:

points <- SpatialPoints(coords)
# Error: could not find function "SpatialPoints"

A continuación, su script tal y como está produce rings pero esto es un spatialPolygons y no un spatialPolygonsDataFrame (es decir, no hay ...DataFrame ) por lo que no hay @data ranura para unirse.

En su lugar, puede crear un spatialPolygonsDataFrame objeto utilizando sp::SpatialPolygonsDataFrame :

#joining points to polys
join <- over(rings, points)
rings <- sp::SpatialPolygonsDataFrame(rings, as.data.frame(join), match.ID = FALSE)

Porque join es un vector, no un marco de datos, debemos forzar a R a tratarlo como un marco de datos de una columna con as.data.frame() . Además, esto vinculará los registros en join y rings en orden no por coincidir con un ID, así que asegúrese de que el orden es correcto (o irrelevante).

rings ahora parece:

plot of 'rings' object

Por último, pero sin relación con este tema, shades errores:

shades = auto.shading(counts,cols=brewer.pal(5,'Blues'))
# Error in quantile.default(x, probs) : 
#  missing values and NaN's not allowed if 'na.rm' is FALSE

así que choropleth() no funciona tal cual.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X