Tham gia dữ liệu điểm không gian với nhiều dữ liệu đa giác bằng R


8

Tôi muốn tham gia không gian với SpatialPolygonsDataFrame và SpatialPointsDataFrame.

chỉ nhận được một dữ liệu điểm trong nhiều đa giác, theo mã.

sp::over(meuse, srdf)

Một số điểm dữ liệu thành nhiều Đa giác. Tôi muốn lấy dữ liệu điểm giữ tất cả dữ liệu đa giác.

ví dụ: điểm A trong đa giác a và b.

bây giờ có thể nhận được:

| point | polygon |
-------------------
| A     | a       |

Tôi nhận được như thế này:

| point | polygon |
-------------------
| A     | a       |
| A     | b       |

Sử dụng dữ liệu:

    coordinates(meuse) = ~x+y
    sr1=Polygons(list(Polygon(cbind(c(180114, 180553, 181127, 181477, 181294, 181007, 180409,
                                      180162, 180114), c(332349, 332057, 332342, 333250, 333558, 333676,
                                                         332618, 332413, 332349)))),'1')
    sr2=Polygons(list(Polygon(cbind(c(180042, 180545, 180553, 180314, 179955, 179142, 179437,
                                      179524, 179979, 180042), c(332373, 332026, 331426, 330889, 330683,
                                                                 331133, 331623, 332152, 332357, 332373)))),'2')
    sr3=Polygons(list(Polygon(cbind(c(179110, 179907, 180433, 180712, 180752, 180329, 179875,
                                      179668, 179572, 179269, 178879, 178600, 178544, 179046, 179110),
                                    c(331086, 330620, 330494, 330265, 330075, 330233, 330336, 330004,
                                      329783, 329665, 329720, 329933, 330478, 331062, 331086)))),'3')
    sr4=Polygons(list(Polygon(cbind(c(180304, 180403,179632,179420,180304),
                                    c(332791, 333204, 333635, 333058, 332791)))),'4')
    sr5=Polygons(list(Polygon(cbind(c(179500, 180000, 180000, 179500),
                                    c(331000, 331000, 331500, 331500)))), '5')
    sr=SpatialPolygons(list(sr1,sr2,sr3,sr4, sr5))
    srdf=SpatialPolygonsDataFrame(sr, data.frame(row.names=c('1','2','3','4', '5'), PIDS=1:5, y=runif(5)))

Câu trả lời:


5

Các st_joinchức năng trong sfgói ( phiên bản phát triển ) cung cấp một giải pháp đơn giản và trực quan. Nó trả về phép nối không gian dưới dạng a data.framevà bạn có thể dễ dàng chuyển đổi trở lại Spatial*.

# Convert to sf-objects
srdf.sf <- st_as_sf(srdf)
meuse.sf <- st_as_sf(meuse)

# Keep all "meuse.sf", sort by row.names(meuse.sf). Default overlay is "intersects".
meuse_srdf <- st_join(meuse.sf, srdf.sf) 

# Keeps all "srdf.sf", sort by row.names(srdf.sf)
srdf_meuse <- st_join(srdf.sf, meuse.sf)

# Convert back to Spatial*
meuse_srdf <- as(meuse_srdf, "Spatial")
srdf_meuse <- as(srdf_meuse, "Spatial")

BIÊN TẬP:

st_joinhiện đang ở phiên bản CRANsf , như được chỉ ra trước đây bởi SymbolixAU.


1
st_joinhiện đang ở phiên bản CRAN được phát hành
SymbolixAU

4

Sử dụng over(meuse, srdf, returnList=TRUE)

 if ‘returnList’ is TRUE, a list of length
 ‘length(x), with list element ‘i’ the vector of all indices of
 the geometries in ‘y’ that correspond to the $i$-th geometry in
 ‘x’.

Điểm đầu tiên chồng lên một đa giác, điểm thứ 135 chồng lên hai:

> rr = over(meuse,srdf,returnList=TRUE)
> rr[[1]]
  PIDS         y
1    1 0.2069365
> rr[[135]]
  PIDS          y
2    2 0.34809708
5    5 0.08942346

Lưu ý nếu bạn chỉ muốn các chỉ mục đa giác được phủ và không phải tất cả các thuộc tính, chỉ cần chuyển đổi đa giác thành SpatialPolygons và bạn nhận lại danh sách các số chỉ mục thay vì khung dữ liệu với tất cả các thuộc tính trong:

> rr = over(meuse,as(srdf,"SpatialPolygons"),returnList=TRUE)
> rr[[1]]
[1] 1
> rr[[135]]
[1] 2 5

0

Tôi có thể lấy data.frame theo mã:

library(tidyverse)
sp::over(meuse, srdf, returnList=TRUE) %>%
plyr::ldply(., data.frame) -> tmp

Đó là .idcột tự động thêm .
Nếu được lọc hoặc chỉnh sửa dữ liệu meuse, hãy thực hiện theo mã.

use_id <- 
  tmp %>% select(`.id`) %>% unlist(., use.names = F)
rownames(meuse) %in% use_id
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.