점이 다각형 쉐이프 파일 내에 있는지 확인


19

Zillow는 미국 주요 도시의 다른 지역을위한 일련의 shapefile 을 가지고 있습니다. 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", ]

나는 아무 문제없이 줄 수 있습니다

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

여기에 이미지 설명을 입력하십시오

proj4shapefile 의 문자열을 내 데이터 와 일치시킵니다.

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

over(df, sodo)

이것은 단지 많은 NA가치를 제공 합니다. 나는이 대답 을 시도했다

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

그러나 여전히 NA가치 만 얻습니다 . 내가 시도해야 할 다른 아이디어가 있습니까?

답변:


20

공간 data.frame이 올바르게 형성되지 않았습니다. 이것은 작동 할 수 있습니다 :

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

방금 똑같은 일을하고 있습니다. 파스칼의 대답은 거의 그것을 다루지 만 아래 두 단계가 더 필요할 수 있습니다.

#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))

어떤 경우에 이러한 추가 단계가 필요한지는 분명하지 않습니다. 나에게 user32309의 대답 솔루션은 충분했습니다.
djhurio

3
데이터의 형식에 따라 다릅니다. 프로젝션 A에 있고 proj4string을 사용한다고 선언하고 싶다면 좋을 것입니다. 그러나 투영 B에 있고 투영 A로 실제로 변환 해야하는 경우 spTransform을 사용해야합니다.
John Curry

2

이 게시물에서 허용 된 답변에 대해 비슷한 접근 방식을 사용했지만 실제로는 결코 만족하지 않았으므로 대안을 조사하고 sf 라이브러리를 찾았습니다 .

이 라이브러리를 사용하면 다음과 같은 코드를 작성할 수 있습니다.

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

산출:

         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 

비슷한 코드 인 다른 게시물 에이 코드를 게시했습니다. R sf 패키지로 점을 포함하는 다각형 식별

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.