Đếm số điểm trong đa giác bằng R?


11

Tôi có hai lớp chia sẻ cùng một CRS (Học viện và Kinh độ):

  1. bolognaQuartieriMap: một SpatialPolygonDataFramedữ liệu có chứa của một thành phố quận.
  2. crashPoints: SpatialPointsDataFramechứa dữ liệu về tai nạn.

Chúng được vẽ tốt bằng cách sử dụng:

plot(bolognaQuartieriMap)
title("Crash per quartiere")
plot(crashPoints, col="red",add=TRUE)

Những gì tôi cần là để có được số điểm ( crashPoints) trong mỗi đa giác tạo thành bolognaQuartieriMap. Tôi đã được đề nghị sử dụng over()nhưng tôi đã không thành công.

Câu trả lời:


21

Vì bạn không cung cấp ví dụ có thể lặp lại cũng như thông báo lỗi, hãy xem đoạn mã này có giúp bạn bắt đầu không:

library("raster")
library("sp")

x <- getData('GADM', country='ITA', level=1)
class(x)
# [1] "SpatialPolygonsDataFrame"
# attr(,"package")
# [1] "sp"

set.seed(1)
# sample random points
p <- spsample(x, n=300, type="random")
p <- SpatialPointsDataFrame(p, data.frame(id=1:300))

proj4string(x)
# [1] " +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0"
proj4string(p)
# [1] " +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0"

plot(x)
plot(p, col="red" , add=TRUE)

âm mưu

res <- over(p, x)
table(res$NAME_1) # count points
#               Abruzzo                Apulia            Basilicata
#                    11                    20                     9
#              Calabria              Campania        Emilia-Romagna
#                    16                     8                    25
# Friuli-Venezia Giulia                 Lazio               Liguria
#                     7                    14                     7
#             Lombardia                Marche                Molise
#                    22                     4                     3
#              Piemonte              Sardegna                Sicily
#                    35                    18                    21
#               Toscana   Trentino-Alto Adige                Umbria
#                    33                    15                     6
#         Valle d'Aosta                Veneto
#                     4                    22

1
Tôi thực sự thực sự và thực sự một lần nữa đánh giá cao câu trả lời này. Xin hãy cho upvote của tôi, một lời cảm ơn hàng ngàn.
Danny Hern

2

Tôi muốn để lại một lựa chọn khác. Bạn có thể đạt được nhiệm vụ sử dụng poly.counts()trong GISToolsgói. Sử dụng dữ liệu mẫu của rcs, bạn có thể làm như sau. Nếu bạn nhìn vào hàm, bạn sẽ nhận ra rằng hàm được viết là colSums(gContains(polys, pts, byid = TRUE)). Vì vậy, bạn chỉ có thể sử dụng gContains()trong rgeosgói và colSums().

library(GISTools)

poly.counts(p, x) -> res
setNames(res, x@data$NAME_1)

Hoặc là

colSums(gContains(x, p, byid = TRUE)) -> res
setNames(res, x@data$NAME_1)

Và kết quả là:

#              Abruzzo                Apulia            Basilicata 
#                   11                    20                     9 
#             Calabria              Campania        Emilia-Romagna 
#                   16                     8                    25 
#Friuli-Venezia Giulia                 Lazio               Liguria 
#                    7                    14                     7 
#            Lombardia                Marche                Molise 
#                   22                     4                     3 
#             Piemonte              Sardegna                Sicily 
#                   35                    18                    21 
#              Toscana   Trentino-Alto Adige                Umbria 
#                   33                    15                     6 
#        Valle d'Aosta                Veneto 
#                    4                    22 

Điều này thực sự rất hữu ích. Nhưng tôi gặp khó khăn trong việc lưu kết quả vì tôi muốn vẽ một bản hợp xướng dựa trên số điểm trong đa giác
qpisqp

2

Bạn có thể đạt được điều tương tự bằng cách sử dụng sfgói. Kiểm tra mã tái sản xuất và nhận xét dưới đây. Gói sfđược sử dụng để xử lý các đối tượng không gian như các đối tượng tính năng đơn giản. Trong câu trả lời này, gói rasterchỉ được sử dụng để tải xuống dữ liệu đa giác mẫu và gói dplyrđể chuyển đổi dữ liệu ở cuối.

# Load libraries ----------------------------------------------------------

library(raster)
library(sf)
library(dplyr)

# Get sample data ---------------------------------------------------------

# Get polygon
polygon <- getData('GADM', country='URY', level = 1)[,1] # Download polygon of country admin level 1 
polygon <- st_as_sf(polygon) # convert to sf object
colnames(polygon) <- c("id_polygons", "geometry") # change colnames
polygon$id_polygons <- paste0("poly_", LETTERS[1:19]) #  change polygon ID

# Get sample random poins from polygon bbox
set.seed(4)
bbox <- st_as_sfc(st_bbox(polygon))
points <- st_sample(x = bbox, size = 100, type = "random")
points <- st_as_sf(data.frame(id_points = as.character(1:100)), points) # add points ID

# Plot data ---------------------------------------------------------------

# Plot polygon + points
plot(polygon, graticule = st_crs(4326), key.pos = 1)
plot(points, pch = 19, col = "black", add = TRUE)

# Intersection between polygon and points ---------------------------------

intersection <- st_intersection(x = polygon, y = points)

# Plot intersection
plot(polygon, graticule = st_crs(4326), key.pos = 1)
plot(intersection[1], col = "black", pch = 19, add = TRUE)

# View result
table(intersection$id_polygons) # using table

# using dplyr
int_result <- intersection %>% 
  group_by(id_polygons) %>% 
  count()

as.data.frame(int_result)[,-3]

ngã tư

nút giao

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.