Ho calcolato la superficie delle distribuzioni delle specie (unendo i poligoni dai shapefile), ma poiché quest'area può essere composta da poligoni abbastanza distanziati, vorrei calcolare una certa misura della dispersione. Quello che ho fatto finora è stato recuperare i centroidi di ciascun poligono, calcolare la distanza tra questi e usarli per calcolare il coefficiente di variazione, come nell'esempio fittizio di seguito;
require(sp)
require(ggplot2)
require(mapdata)
require(gridExtra)
require(scales)
require(rgeos)
require(spatstat)
# Create the coordinates for 3 squares
ls.coords <- list()
ls.coords <- list()
ls.coords[[1]] <- c(15.7, 42.3, # a list of coordinates
16.7, 42.3,
16.7, 41.6,
15.7, 41.6,
15.7, 42.3)
ls.coords[[2]] <- ls.coords[[1]]+0.5 # use simple offset
ls.coords[[3]] <- c(13.8, 45.4, # a list of coordinates
15.6, 45.4,
15.6, 43.7,
13.8, 43.7,
13.8, 45.4)
# Prepare lists to receive the sp objects and data frames
ls.polys <- list()
ls.sp.polys <- list()
for (ii in seq_along(ls.coords)) {
crs.args <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
my.rows <- length(ls.coords[[ii]])/2
# create matrix of pairs
my.coords <- matrix(ls.coords[[ii]],nrow = my.rows,ncol = 2,byrow = TRUE)
# now build sp objects from scratch...
poly = Polygon(my.coords)
# layer by layer...
polys = Polygons(list(poly),1)
spolys = SpatialPolygons(list(polys))
# projection is important
proj4string(spolys) <- crs.args
# Now save sp objects for later use
ls.sp.polys[[ii]] <- spolys
# Then create data frames for ggplot()
poly.df <- fortify(spolys)
poly.df$id <- ii
ls.polys[[ii]] <- poly.df
}
# Convert the list of polygons to a list of owins
w <- lapply(ls.sp.polys, as.owin)
# Calculate the centroids and get the output to a matrix
centroid <- lapply(w, centroid.owin)
centroid <- lapply(centroid, rbind)
centroid <- lapply(centroid, function(x) rbind(unlist(x)))
centroid <- do.call('rbind', centroid)
# Create a new df and use fortify for ggplot
centroid_df <- fortify(as.data.frame(centroid))
# Add a group column
centroid_df$V3 <- rownames(centroid_df)
ggplot(data = italy, aes(x = long, y = lat, group = group)) +
geom_polygon(fill = "grey50") +
# Constrain the scale to 'zoom in'
coord_cartesian(xlim = c(13, 19), ylim = c(41, 46)) +
geom_polygon(data = ls.polys[[1]], aes(x = long, y = lat, group = group), fill = alpha("red", 0.3)) +
geom_polygon(data = ls.polys[[2]], aes(x = long, y = lat, group = group), fill = alpha("green", 0.3)) +
geom_polygon(data = ls.polys[[3]], aes(x = long, y = lat, group = group), fill = alpha("lightblue", 0.8)) +
coord_equal() +
# Plot the centroids
geom_point(data=centroid_points, aes(x = V1, y = V2, group = V3))
# Calculate the centroid distances using spDists {sp}
centroid_dists <- spDists(x=centroid, y=centroid, longlat=TRUE)
centroid_dists
[,1] [,2] [,3]
[1,] 0.00000 69.16756 313.2383
[2,] 69.16756 0.00000 283.7120
[3,] 313.23834 283.71202 0.0000
# Calculate the coefficient of variation as a measure of polygon dispersion
cv <- sd(centroid_dist)/mean(centroid_dist)
[1] 0.9835782
Trama dei tre poligoni e dei loro centroidi
Non sono sicuro che questo approccio sia molto utile poiché in molti casi, alcuni dei poligoni (come quello blu nell'esempio sopra) sono piuttosto grandi rispetto al resto, aumentando così ulteriormente la distanza. Ad esempio, il centroide dell'Australia ha quasi la stessa distanza dai suoi confini occidentali rispetto a Papau.
Quello che vorrei ottenere è un input su approcci alternativi. Ad esempio, come o con quale funzione posso calcolare la distanza tra i poligoni?
Ho provato a convertire il frame di dati SpatialPolygon sopra in PointPatterns (ppp) {spatstat}
per poter correre nndist() {spatstat}
per calcolare la distanza tra tutti i punti. Ma dal momento che ho a che fare con aree abbastanza grandi (molti poligoni e grandi), la matrice diventa enorme e non sono sicuro di come continuare a raggiungere la distanza minima tra i poligoni .
Ho anche esaminato la funzione gDistance {rgeos}
, ma penso che funzioni solo sui dati proiettati, il che può essere un problema per me poiché le mie aree possono attraversarne diverse EPSG areas
. Lo stesso problema sorgerebbe per la funzione crossdist {spatstat}
.
postgres
ma mi sono fermato quando non sapevo (non guardavo) come collegare il flusso di lavoro / geostati tra il database e R
...
postgres/postgis
oltre aR
? Ho utilizzato un flusso di lavoro in cui eseguo la maggior parte del mio lavoroR
, ma memorizzo i dati in un database a cui accedo utilizzandosqldf
. Ciò consente di utilizzare tutte lepostgis
funzioni (la cui distanza tra i poligoni è diretta)