Xếp chồng đa giác không gian với lưới và kiểm tra tọa độ cụ thể của phần tử lưới được đặt bằng R [đóng]


32

Làm thế nào người ta có thể sử dụng R để

  1. chia một shapefile trong 200 mét vuông / đa giác phụ,
  2. vẽ lưới này (bao gồm số ID cho mỗi ô vuông) trên bản đồ gốc bên dưới và
  3. đánh giá trong đó tọa độ địa lý cụ thể vuông được đặt .

Tôi là người mới bắt đầu học về GIS và đây có lẽ là một câu hỏi cơ bản, nhưng tôi chưa tìm thấy hướng dẫn về cách thực hiện điều này trong R.

Những gì tôi đã làm cho đến nay là tải một shapefile của NYC và vẽ một số tọa độ địa lý mẫu mực.

Tôi đang tìm một ví dụ (mã R) làm thế nào với dữ liệu dưới đây.

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

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


Câu trả lời:


36

Dưới đây là một ví dụ sử dụng một SpatialGridđối tượng:

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

Bây giờ bạn có thể sử dụng over-method đã triển khai để lấy ID di động:

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

Để vẽ biểu đồ shapefile và lưới với 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

hoặc không có phím màu / màu:

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


Điều này trông giống như một câu trả lời cho tôi, nhưng trong trường hợp bạn đang tìm kiếm một cái gì đó khác biệt. Hãy thử thẻ r trong stackoverflow stackoverflow.com/search?q=R+tag
Brad Nesom

@rcs mã này trông giống như những gì tôi đang cố gắng nhưng shapefile của tôi nằm trong một phép chiếu khác: proj4string (DK_reg1) [1] "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" có ai có bất kỳ đề xuất nào về cách phá vỡ các shapefile của phép chiếu này thành 1000 ô lưới có kích thước bằng nhau không? và sau đó chọn ngẫu nhiên 100 trong số chúng và làm nổi bật chúng?
Tôi Del Toro

9

Bộ dữ liệu New York được cung cấp trong câu hỏi không còn có sẵn để tải xuống. Tôi sử dụng tập dữ liệu nc từ gói sf để trình bày giải pháp sử dụng gói 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)

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


Cảm ơn. Tôi đã cập nhật liên kết trong câu hỏi của mình để thay đổi các thay đổi trên trang web của họ. Bây giờ nó sẽ hoạt động trở lại.
hùng vĩ

Tôi thực sự cần phải bắt đầu sử dụng sfgói. Điều này thật tuyệt!
philiporlando 23/03/18

Có một cách dễ dàng để chỉ vẽ các ô lưới giao nhau với đa giác trạng thái?
philiporlando 23/03/18

st_intersection (Grid_50, nc) nên làm điều đó
sebdalgarno

Có cách nào để sao chép giống nhau không, nhưng các điểm ở trung tâm của mỗi lưới, do đó, một lưới được vẽ với lat / long là tâm của lưới @sebdalgarno
Vijay Ramesh

2

Nếu bạn chưa xem gói raster R, nó có các công cụ để chuyển đổi sang / từ các đối tượng GIS vector để bạn có thể a) tạo một raster (lưới) với các ô 200x200m và b) chuyển đổi nó thành một tập hợp đa giác với một id logic của một số loại. Từ đó tôi sẽ xem xét gói sp để giúp giao nhau giữa các điểm và lưới đa giác. Đây http://cran.r-project.org/web/packages/sp/vignettes/over.pdf trang có thể là một khởi đầu tốt. Đi lang thang qua các tài liệu gói sp, bạn có thể bắt đầu với lớp SpatialGrid và chỉ cần bỏ qua phần raster hoàn toàn.


-1

"Vũ trụ GIS" rất phức tạp và có nhiều tiêu chuẩn mà dữ liệu của bạn phải tuân thủ. Tất cả "công cụ GIS" hoạt động theo tiêu chuẩn GIS . Tất cả "dữ liệu GIS nghiêm trọng" ngày hôm nay (2014) được lưu trữ trong cơ sở dữ liệu .

Cách tốt nhất để "sử dụng R" trong ngữ cảnh GIS, với các công cụ FOSS khác , được nhúng vào SQL. Các công cụ tốt nhất là PostgreSQL 9.X (xem PL / R ) và PostGIS .


Bạn trả lời:

  • Để nhập / xuất tệp hình dạng: sử dụng shp2pgsqlpgsql2shp .
  • Để "chia một tập tin hình dạng trong 200 vuông mét / sub-đa giác": xem ST_SnapToGrid(), ST_AsRaster(), vv Chúng tôi cần hiểu rõ hơn về nhu cầu của bạn để thể hiện thành một "công thức".
  • bạn nói rằng cần "tọa độ địa lý" .. có lẽ ST_Centroid()là hình vuông (?) ... Bạn có thể diễn đạt "toán học hơn" để tôi hiểu.

... Có lẽ bạn không cần bất kỳ sự hội tụ raster nào, chỉ có một ma trận các điểm lấy mẫu regurlar.


Một cách nguyên thủy là sử dụng R mà không cần PL / R , trong trình biên dịch bên ngoài thông thường của bạn: chỉ chuyển đổi đa giác của bạn và xuất dưới dạng hình dạng hoặc dưới dạng WKT (xem ST_AsText), sau đó chuyển đổi dữ liệu bằng awk hoặc bộ lọc khác sang định dạng R.


1
Cảm ơn bạn đã giúp đỡ. Tuy nhiên, tôi rất muốn một giải pháp dựa hoàn toàn vào R và các gói hiện có. Khi tôi có thể phân chia tệp hình dạng trong các tệp con 200m * 200m, tôi có thể kiểm tra point.in.polygontọa độ nào trong đa giác. Vấn đề của tôi là phân chia shapefile ban đầu trong các đa giác phụ đó.
hùng vĩ
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.