Tham gia dữ liệu điểm không gian đến đa giác trong R


21

Tôi đang cố gắng thực hiện một liên kết không gian giữa dữ liệu điểm và dữ liệu đa giác.

Tôi có dữ liệu chỉ ra tọa độ không gian của một sự kiện trong tệp csv A của tôi và có một tệp khác, shapefile B, chứa ranh giới của một khu vực dưới dạng đa giác.

head(A)
  month   longitude latitude lsoa_code                   crime_type
1 2014-09 -1.550626 53.59740 E01007359        Anti-social behaviour
2 2014-09 -1.550626 53.59740 E01007359                 Public order
3 2014-09 -1.865236 53.93678 E01010646        Anti-social behaviour

head(B@data)
  code      name                                  altname
0 E05004934 Longfield, New Barn and Southfleet    <NA>
1 E05000448                   Lewisham Central    <NA>
2 E05003149                            Hawcoat    <NA>

Tôi muốn tham gia dữ liệu tội phạm A vào shapefile B của mình để ánh xạ các sự kiện tội phạm xảy ra trong khu vực của tôi A. Thật không may, tôi không thể thực hiện tham gia thuộc tính dựa trên codemã trong A đề cập đến các đơn vị khác với mã trong B.

Tôi đã đọc một số hướng dẫn và bài viết nhưng không thể tìm thấy câu trả lời. Tôi đã thử:

joined = over(A, B)

overlay, nhưng không thực hiện được những gì tôi muốn.

Có cách nào để thực hiện việc này tham gia trực tiếp hay sẽ cần một chuyển đổi trung gian từ A sang định dạng khác?

Về mặt khái niệm tôi muốn chọn những điểm của A rơi vào các codekhu vực của B (tương tự như "tham gia dựa trên vị trí không gian trong ArcGIS").

Có ai có vấn đề này và giải quyết nó?


Bạn đã xem xét point.in.polygon()trong gói sp?

@ arvi1000 Tôi đã và sẽ thử lại lần nữa. Suy nghĩ của tôi point.in.polygonlà liệu điều này sẽ bảo tồn các biến monthcrime_type. Bạn có biết về điều đó?
ben_aaron

Tôi đã thử thêm một chút với point.in.polyvà cuối cùng đã chọn những điểm rơi vào đa giác có liên quan. Cảm ơn.
ben_aaron

Sau đó, có lẽ bạn nên trả lời câu hỏi của riêng bạn với giải pháp của bạn. Hãy nhớ rằng, câu trả lời tốt là những gì trang web này là tất cả về.
SlowLearner 4/03/2015

Câu trả lời:


8

Hàm point.in.poly trong gói spatialEco trả về một đối tượng SpatialPointsDataFrame của các điểm giao nhau với một đối tượng đa giác sp và tùy ý thêm các thuộc tính đa giác.

Đầu tiên cho phép thêm các gói yêu cầu và tạo một số dữ liệu ví dụ.

require(spatialEco)
require(sp)
data(meuse)
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')
sr=SpatialPolygons(list(sr1,sr2,sr3,sr4))
srdf=SpatialPolygonsDataFrame(sr, data.frame(row.names=c('1','2','3','4'), PIDS=1:4, y=runif(4)))

Bây giờ, hãy xem nhanh dữ liệu và vẽ nó.

head(srdf@data)  # polygons
head(meuse@data) # points
plot(srdf)
points(meuse, pch=20)

Cuối cùng, chúng ta có thể cắt các điểm với đa giác. Kết quả sẽ là một đối tượng SpatialPointsDataFrame với, trong trường hợp này, hai thuộc tính bổ sung (PIDS, y) được chứa trong dữ liệu đa giác srdf.

  pts.poly <- point.in.poly(meuse, srdf)
    head(pts.poly@data)

Nếu không có cột nhận dạng duy nhất trong dữ liệu đa giác, bạn có thể dễ dàng thêm một cột.

srdf@data$poly.ids <- 1:nrow(srdf) 

Khi chúng ta có các điểm và đa giác được giao nhau, chúng ta có thể tổng hợp các điểm bằng cách sử dụng ID đa giác duy nhất là một thuộc tính trong dữ liệu đa giác.

# Number of points in each polygon
tapply(pts.poly@data$lead, pts.poly@data$PIDS, FUN=length)

# Mean lead in each polygon
tapply(pts.poly@data$lead, pts.poly@data$PIDS, FUN=mean)

@ arvi1000, có nhưng sp :: point.in.polygon tạo ra logic. SpatialEco: point.in.poly là một trình bao bọc cho hơn nhưng trả về một sp SpatialPointsDataFrame và các phím tắt một số bước liên quan đến các thuộc tính đa giác, giống như raster: giao nhau cho rgeos :: gIntersect.
Jeffrey Evans

sp::point.in.polygonthực sự trả về một giá trị số (0 = điểm nằm ngoài, 1 = bên trong, 2 = trên cạnh, 3 = trên đỉnh). Có thể là điều đúng cho một số trường hợp. Nghĩ rằng nó hữu ích để lưu ý ở đây, vì đây là kết quả hàng đầu của google cho các điều khoản liên quan
arvi1000

27

over()từ gói spcó thể hơi khó hiểu nhưng hoạt động tốt. Tôi cho rằng bạn đã thực hiện "A" không gian với coordinates(A) <- ~longitude+latitude:

# Overlay points and extract just the code column: 
a.data <- over(A, B[,"code"])

Thay vì một đối tượng không gian điểm, điều này chỉ đơn giản cung cấp cho bạn một khung dữ liệu, không có cùng. các hàng là A và một "mã" biến duy nhất từ ​​mỗi đa giác giao nhau từ B.

# Add that data back to A:
A$bcode <- a.data$code

Tôi đã tìm thấy over()có vấn đề với các điểm ở các đỉnh của đa giác, mặc dù tôi nghĩ rằng đây là giải pháp đơn giản nhất mà tôi đã tìm thấy cho đến nay.
JMT2080AD

Những vấn đề bạn đã có?
Simbamangu

Loại trừ. Tôi cần khám phá thêm. Tôi sẽ gửi cho bạn một số dữ liệu sau hôm nay và chúng tôi có thể xem xét nó cùng nhau nếu bạn quan tâm. Tôi có thể sai, nhưng tôi khá chắc chắn rằng có một số suy thoái trong thuật toán cần được quan tâm, ít nhất là đối với dữ liệu của tôi.
JMT2080AD

Đừng bận tâm. Nó phải là một cái gì đó với dữ liệu của tôi. Bộ thí nghiệm này hoạt động tốt. r-fiddle.org/#/fiddle?id=m5sTjE4N&version=1
JMT2080AD

1
Đây là một cách tiếp cận đơn giản hơn nhiều so với câu trả lời được chấp nhận và không yêu cầu cài đặt các gói bổ sung khác ngoài rgdal.
Bryce Frank

0

Đây là một giải pháp như dplyr:

library(spdplyr)

ukcounties <- geojsonio::geojson_read("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson",
                                      what = "sp")
pop <- read_excel("data/SAPE20DT7-mid-2017-parlicon-syoa-estimates-unformatted.xls",sheet = "data")
pop <- janitor::clean_names(pop)

ukcounties_pop <- ukcounties %>% inner_join(pop, by = c("pcon18nm" = "pcon11nm"))

Dữ liệu dân số đến từ: https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates/datasets/par Nghịaryconstituencymidyearpopulationestimates

Tôi đã phải chuyển đổi các tệp hình dạng được tải xuống từ GeoJson: https://geoportal.statistic.gov.uk/datasets/westminster-parferencesary-constituencies-december-2018-uk-bgc/data?page=1

Bạn có thể làm như vậy bằng cách:

uk_constituencies <- readOGR("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC.shp")
uk_constituencies # this is in tmerc format. we need to convert it to WGS84 required by geoJson format.

# First Convert to Longitude / Latitude with WGS84 Coordinate System
wgs84 = '+proj=longlat +datum=WGS84'
uk_constituencies_trans <- spTransform(uk_constituencies, CRS(wgs84))

# Convert from Spatial Dataframe to GeoJSON
uk_constituencies_json <- geojson_json(uk_constituencies_trans)

# Save as GeoJSON file on the file system.
geojson_write(uk_constituencies_json, file = "data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson")

#read back in:
ukcounties <- geojsonio::geojson_read("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson",
                                      what = "sp")
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.