그리드를 사용하여 공간 폴리곤 오버레이 및 R을 사용하여 그리드 요소 별 좌표의 위치 확인 [닫기]


32

어떻게 R사용 하여

  1. shapefile을 200m2 정사각형 / 하위 다각형으로 분할
  2. 아래의 원래지도 위에이 격자 (각 사각형의 ID 번호 포함)를 그리고
  3. 어떤 제곱 특정 지리 좌표가 있는지 평가하십시오 .

나는 GIS의 초보자이며 아마도 기본적인 질문 일지 모르지만 R에서이를 수행하는 방법에 대한 자습서를 찾지 못했습니다.

내가 지금까지 한 일은 NYC의 shapefile을로드하고 예시적인 지리적 좌표를 플로팅하는 것입니다.

아래 데이터를 사용하여 예제 (R 코드)를 찾고 있습니다.

# Load packages 
library(maptools)

# Download shapefile for NYC
# OLD URL (no longer working)
# shpurl <- "http://www.nyc.gov/html/dcp/download/bytes/nybb_13a.zip"
shpurl <- "https://www1.nyc.gov/assets/planning/download/zip/data-maps/open-data/nybb_13a.zip"

tmp    <- tempfile(fileext=".zip")
download.file(shpurl, destfile=tmp)
files <- unzip(tmp, exdir=getwd())

# Load & plot shapefile
shp <- readShapePoly(files[grep(".shp$", files)])
plot(shp)

# Define coordinates 
points_of_interest <- data.frame(y=c(919500, 959500, 1019500, 1049500, 1029500, 989500), 
                 x =c(130600, 150600, 180600, 198000, 248000, 218000),
                 id  =c("A"), stringsAsFactors=F)

# Plot coordinates
points(points_of_interest$y, points_of_interest$x, pch=19, col="red")

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


답변:


36

다음은 SpatialGrid객체 를 사용하는 예입니다 .

### read shapefile
library("rgdal")
shp <- readOGR("nybb_13a", "nybb")

proj4string(shp)  # units us-ft
# [1] "+proj=lcc +lat_1=40.66666666666666 +lat_2=41.03333333333333 
# +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +datum=NAD83
# +units=us-ft +no_defs +ellps=GRS80 +towgs84=0,0,0"

### define coordinates and convert to SpatialPointsDataFrame
poi <- data.frame(x=c(919500, 959500, 1019500, 1049500, 1029500, 989500),
                  y=c(130600, 150600, 180600, 198000, 248000, 218000),
                  id="A", stringsAsFactors=F)
coordinates(poi) <- ~ x + y
proj4string(poi) <- proj4string(shp)

### define SpatialGrid object
bb <- bbox(shp)
cs <- c(3.28084, 3.28084)*6000  # cell size 6km x 6km (for illustration)
                                # 1 ft = 3.28084 m
cc <- bb[, 1] + (cs/2)  # cell offset
cd <- ceiling(diff(t(bb))/cs)  # number of cells per direction
grd <- GridTopology(cellcentre.offset=cc, cellsize=cs, cells.dim=cd)
grd
# cellcentre.offset 923018 129964
# cellsize           19685  19685
# cells.dim              8      8

sp_grd <- SpatialGridDataFrame(grd,
                               data=data.frame(id=1:prod(cd)),
                               proj4string=CRS(proj4string(shp)))
summary(sp_grd)
# Object of class SpatialGridDataFrame
# Coordinates:
#      min     max
# x 913175 1070655
# y 120122  277602
# Is projected: TRUE
# ...

이제 구현 된 over-method를 사용하여 셀 ID를 얻을 수 있습니다 .

over(poi, sp_grd)
#   id
# 1 57
# 2 51
# 3 38
# 4 39
# 5 14
# 6 28

셀 ID를 사용하여 모양 파일과 그리드를 플로팅하려면 :

library("lattice")
spplot(sp_grd, "id",
       panel = function(...) {
         panel.gridplot(..., border="black")
         sp.polygons(shp)
         sp.points(poi, cex=1.5)
         panel.text(...)
       })

spplot1

또는 컬러 / 컬러 키가없는 경우 :

library("lattice")
spplot(sp_grd, "id", colorkey=FALSE,
       panel = function(...) {
         panel.gridplot(..., border="black", col.regions="white")
         sp.polygons(shp)
         sp.points(poi, cex=1.5)
         panel.text(..., col="red")
       })

spplot2


이것은 나에게 답처럼 보이지만 다른 것을 찾고있는 경우에 대비합니다. stackoverflow에서 r 태그 사용해보기 stackoverflow.com/search?q=R+tag
Brad Nesom

@rcs이 코드는 내가하려고하는 것처럼 보이지만 shapefile이 다른 투영에 있습니다. proj4string (DK_reg1) [1] "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" 이 투영 의이 shapefile을 동일한 크기의 격자 셀로 1000 개 나누는 방법에 대한 제안이 있습니까? 그런 다음 무작위로 100 개를 선택하고 강조 표시 하시겠습니까?
나는 델 토로

9

질문에 제공된 뉴욕 데이터 셋을 더 이상 다운로드 할 수 없습니다. sf 패키지의 nc 데이터 세트를 사용하여 sf 패키지를 사용하는 솔루션을 보여줍니다.

library(sf)
library(ggplot2)

# read nc polygon data and transform to UTM 
nc <- st_read(system.file('shape/nc.shp', package = 'sf')) %>%
  st_transform(32617)

# random sample of 5 points
pts <- st_sample(nc, size = 5) %>% st_sf

# create 50km grid - here you can substitute 200 for 50000
grid_50 <- st_make_grid(nc, cellsize = c(50000, 50000)) %>% 
  st_sf(grid_id = 1:length(.))

# create labels for each grid_id
grid_lab <- st_centroid(grid_50) %>% cbind(st_coordinates(.))

# view the sampled points, polygons and grid
ggplot() +
  geom_sf(data = nc, fill = 'white', lwd = 0.05) +
  geom_sf(data = pts, color = 'red', size = 1.7) + 
  geom_sf(data = grid_50, fill = 'transparent', lwd = 0.3) +
  geom_text(data = grid_lab, aes(x = X, y = Y, label = grid_id), size = 2) +
  coord_sf(datum = NA)  +
  labs(x = "") +
  labs(y = "")

# which grid square is each point in?
pts %>% st_join(grid_50, join = st_intersects) %>% as.data.frame

#>   grid_id                 geometry
#> 1      55 POINT (359040.7 3925435)
#> 2      96   POINT (717024 4007464)
#> 3      91 POINT (478906.6 4037308)
#> 4      40 POINT (449671.6 3901418)
#> 5      30 POINT (808971.4 3830231)

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


감사. 웹 페이지의 변경 사항을 반영하기 위해 질문에 링크를 업데이트했습니다. 이제 다시 작동해야합니다.
majom

sf패키지 사용을 시작해야 합니다. 대단해!
philiporlando

상태 다각형과 교차하는 격자 셀만 플롯하는 쉬운 방법이 있습니까?
philiporlando

st_intersection (grid_50, nc)해야합니다
sebdalgarno

동일하게 복제하는 방법이 있지만 각 그리드의 중앙에 점이 있으므로 그리드의 중심으로 위도 / 경도로 그리드가 그려집니다. @sebdalgarno
Vijay Ramesh

2

R 래스터 패키지를 보지 않은 경우, 벡터 GIS 객체로 /로부터 변환하는 도구가 있으므로 a) 200x200m 셀로 래스터 (그리드)를 만들고 b) 다음을 사용하여 다각형 세트로 변환 할 수 있어야합니다. 어떤 종류의 논리적 ID. 여기에서 sp 패키지를보고 점과 다각형 격자를 교차시키는 데 도움이됩니다. 이 http://cran.r-project.org/web/packages/sp/vignettes/over.pdf 페이지는 좋은 시작일 수 있습니다. sp 패키지 문서를 살펴보면 SpatialGrid 클래스로 시작하여 래스터 부분을 완전히 건너 뛸 수 있습니다.


-1

"GIS 유니버스"는 복잡하며 데이터를 준수해야하는 많은 표준이 있습니다. 모든 "GIS 도구"는 GIS 표준에 따라 상호 운용됩니다 . 오늘 (2014)의 모든 "심각한 GIS 데이터" 는 데이터베이스에 저장됩니다 .

다른 FOSS 도구 와 함께 GIS 컨텍스트에서 "R"을 사용하는 가장 좋은 방법 은 SQL에 포함되어 있습니다. 최상의 도구는 PostgreSQL 9.X ( PL / R 참조 ) 및 PostGIS 입니다.


당신은 대답합니다 :

  • 모양 파일을 가져 오거나 내보내려면 shp2pgsqlpgsql2shp .
  • "200 미터 정사각형 / 하위 다각형으로 모양 파일을 분할하려면"을 참조하십시오 ST_SnapToGrid().ST_AsRaster() 등 우리는 더 나은 "레시피"로 표현하는 사용자의 요구를 이해할 필요가 있습니다.
  • 당신은 "지리 좌표가 위치해야한다"고 말할 것 ST_Centroid()입니다 . 아마도 사각형 (?) 일 것입니다. "수학적으로"표현할 수 있습니다.

... 아마도 당신은 래스터 변환이 필요하지 않을 것입니다.


기본적인 방법은 일반적인 외부 컴파일러에서 PL / R없이 R을 사용 하는 것입니다. 다각형을 변환하고 모양 또는 WKT로 내보내고 (참조 ST_AsText), awk 또는 다른 필터가있는 데이터를 R 형식으로 변환 하십시오 .


1
당신의 도움을 주셔서 감사합니다. 그러나 R 및 기존 패키지에 완전히 의존하는 솔루션을 강력히 선호합니다. 모양 파일을 200m * 200m 하위 point.in.polygon폴리곤 으로 분할 할 수있을 때 어떤 좌표가 어떤 다각형에 있는지 확인할 수 있습니다 . 내 문제는 원래 모양 파일을 해당 하위 다각형으로 분할하는 것입니다.
majom
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.