Kiểm tra nếu các điểm nằm trong đa giác Shapefile


19

Zvel có một bộ shapefiles cho các khu phố khác nhau của các thành phố lớn của Hoa Kỳ. Tôi muốn kiểm tra xem một số tòa nhà có mặt ở một số khu phố nhất định bằng R:

library(rgeos)
library(sp)
library(rgdal)

df <- data.frame(Latitude =c(47.591351, 47.62212,47.595152),
                 Longitude = c(-122.332271,-122.353985,-122.331639),
                 names = c("Safeco Field", "Key Arena", "Century Link"))
coordinates(df) <- ~ Latitude + Longitude

wa.map <- readOGR("ZillowNeighborhoods-WA.shp", layer="ZillowNeighborhoods-WA")

sodo <- wa.map[wa.map$CITY == "Seattle"  & wa.map$NAME == "Industrial District", ]

Tôi có thể vẽ mà không có vấn đề gì

plot(sodo)
points(df$Latitude ~ df$Longitude, col = "red", cex = 1)

nhập mô tả hình ảnh ở đây

Tôi khớp proj4chuỗi từ shapefile với data.frame của tôi

CRSobj <- CRS("+proj=longlat +datum=NAD83 +no_defs +ellps=GRS80 +towgs84=0,0,0 ")
df@proj4string <- CRSobj

over(df, sodo)

Điều này chỉ cho tôi một loạt các NAgiá trị. Tôi đã thử câu trả lời này

spp <- SpatialPoints(df)
spp@proj4string <- CRSobj
over(spp, sodo)

nhưng vẫn chỉ nhận được NAgiá trị. Bất cứ ý tưởng nào khác tôi nên thử?

Câu trả lời:


20

Các không gian không data.frameđược hình thành chính xác. Điều này có thể làm việc:

library(rgeos)
library(sp)
library(rgdal)

wa.map <- readOGR("ZillowNeighborhoods-WA.shp", layer="ZillowNeighborhoods-WA")

sodo <- wa.map[wa.map$CITY == "Seattle"  & wa.map$NAME == "Industrial District", ]

# Don't use df as name, it is an R function
# Better to set longitudes as the first column and latitudes as the second
dat <- data.frame(Longitude = c(-122.332271,-122.353985,-122.331639),
                  Latitude =c(47.591351, 47.62212,47.595152),
                  names = c("Safeco Field", "Key Arena", "Century Link"))
# Assignment modified according
coordinates(dat) <- ~ Longitude + Latitude
# Set the projection of the SpatialPointsDataFrame using the projection of the shapefile
proj4string(dat) <- proj4string(sodo)

over(dat, sodo)
#  STATE COUNTY    CITY                NAME REGIONID
#1    WA   King Seattle Industrial District   271892
#2  <NA>   <NA>    <NA>                <NA>       NA
#3  <NA>   <NA>    <NA>                <NA>       NA

over(sodo, dat)
#           names
#122 Safeco Field

7

Tôi vừa mới làm điều tương tự. Câu trả lời của Pascal gần như bao trùm nó nhưng bạn có thể cần thêm hai bước như dưới đây.

#After you create your list of latlongs you must set the proj4string to longlat
proj4string(dat) <- CRS("+proj=longlat")

#Before you re-set the proj4string to the one from sodo you must actually convert #your coordinates to the new projection
dat <- spTransform(dat, proj4string(sodo))

Tôi không rõ ràng trong trường hợp nào các bước bổ sung này là cần thiết. Đối với tôi, giải pháp trả lời của user32309 là đủ tốt.
djhurio

3
Nó phụ thuộc vào định dạng dữ liệu của bạn. Nếu nó nằm trong phép chiếu A và bạn chỉ muốn tuyên bố rằng bạn sử dụng proj4 chuỗi và bạn sẽ ổn. Nhưng nếu nó nằm trong phép chiếu B và bạn cần thực hiện một chuyển đổi thành phép chiếu A, bạn cần sử dụng spTransform.
John Curry

2

Tôi đã sử dụng một cách tiếp cận tương tự với câu trả lời được chấp nhận trong bài đăng này nhưng không bao giờ thực sự hài lòng với nó vì vậy tôi đã xem xét các lựa chọn thay thế và tìm thấy thư viện sf .

Và sử dụng thư viện này, bạn có thể viết mã như thế này:

library(sf)
# Shapefile from ABS: 
# https://www.abs.gov.au/AUSSTATS/abs@.nsf/DetailsPage/1270.0.55.004July%202016?OpenDocument
map = read_sf("data/ABS/shapes/SUA_2016_AUST.shp")

pnts_sf <- st_as_sf(pnts, coords = c('y', 'x'), crs = st_crs(map))

pnts <- pnts_sf %>% mutate(
  intersection = as.integer(st_intersects(geometry, map))
  , area = if_else(is.na(intersection), '', map$SUA_NAME16[intersection])
) 

pnts

Đầu ra:

         geometry intersection area    
*     <POINT [°]>        <int> <chr>   
1 (138.62 -34.92)           79 Adelaide
2 (138.58 -34.93)           79 Adelaide
3 (138.52 -34.95)           79 Adelaide
4 (152.71 -27.63)           60 Brisbane
5 (153.01 -27.57)           60 Brisbane
6  (150.73 -33.9)           31 Sydney  
7 (150.99 -33.92)           31 Sydney 

Tôi đã đăng mã này lên một bài đăng khác, một câu hỏi tương tự, ở đây: Xác định đa giác chứa điểm với gói R sf

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.