Tôi đã tính diện tích bề mặt của các phân bố loài (hợp nhất đa giác từ shapefile), nhưng vì khu vực này có thể bao gồm các đa giác khá xa, tôi muốn tính toán một số biện pháp phân tán. Những gì tôi đã làm cho đến nay là lấy ra các tâm của mỗi đa giác, tính khoảng cách giữa chúng và sử dụng chúng để tính hệ số biến đổi, như trong ví dụ giả dưới đây;
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
Âm mưu của ba đa giác và trọng tâm của họ
Tôi không chắc cách tiếp cận này có hữu ích hay không vì trong nhiều trường hợp, một số đa giác (như màu xanh trong ví dụ trên) khá lớn so với phần còn lại, do đó làm tăng khoảng cách hơn nữa. Ví dụ, trung tâm của Úc có khoảng cách gần như tương đương với nội trú phía tây so với Papau.
Những gì tôi muốn nhận được là một số đầu vào về phương pháp thay thế. Ví dụ, làm thế nào hoặc với chức năng nào tôi có thể tính khoảng cách giữa các đa giác?
Tôi đã thử nghiệm để chuyển đổi khung dữ liệu SpatialPolygon ở trên thành PointPotypes (ppp) {spatstat}
để có thể chạy nndist() {spatstat}
để tính khoảng cách giữa tất cả các điểm. Nhưng vì tôi đang xử lý các khu vực khá lớn (nhiều đa giác và lớn), ma trận trở nên rất lớn và tôi không biết làm thế nào để tiếp tục đạt được khoảng cách tối thiểu giữa các đa giác .
Tôi cũng đã xem xét chức năng gDistance {rgeos}
, nhưng tôi nghĩ rằng nó chỉ hoạt động trên dữ liệu dự kiến có thể là một vấn đề đối với tôi vì các khu vực của tôi có thể đi qua một số EPSG areas
. Vấn đề tương tự sẽ phát sinh cho chức năng crossdist {spatstat}
.
postgres
nhưng đã dừng lại khi tôi không biết (không nhìn) cách kết nối luồng công việc / geostats giữa cơ sở dữ liệu và R
...
postgres/postgis
ngoàiR
? Tôi đã sử dụng một quy trình công việc trong đó tôi thực hiện phần lớn công việc của mìnhR
, nhưng lưu trữ dữ liệu trong cơ sở dữ liệu mà tôi truy cập bằng cách sử dụngsqldf
. Điều này cho phép bạn sử dụng tất cả cácpostgis
chức năng (trong đó khoảng cách giữa các đa giác là đơn giản)