การนับจำนวนจุดในรูปหลายเหลี่ยมโดยใช้ R


11

ฉันมีสองคลาสที่แบ่งปัน CRS เดียวกัน (Latitute และลองจิจูด):

  1. bolognaQuartieriMap: SpatialPolygonDataFrameข้อมูลที่มีข้อมูลของเมือง
  2. crashPoints: SpatialPointsDataFrameข้อมูลที่มีอุบัติเหตุ

พวกเขาวางแผนโดยใช้:

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

สิ่งที่ฉันต้องการคือการได้รับจำนวนของจุด ( crashPoints) bolognaQuartieriMapในแต่ละรูปหลายเหลี่ยมที่เป็น ฉันแนะนำให้ใช้over()แต่ฉันไม่ประสบความสำเร็จ

คำตอบ:


21

เนื่องจากคุณไม่ได้ให้ตัวอย่างที่ทำซ้ำได้และข้อความแสดงข้อผิดพลาดให้ดูว่าข้อมูลโค้ดนี้ช่วยให้คุณเริ่มต้น:

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)

พล็อต

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
ฉันขอบคุณคำตอบนี้จริงๆ โปรดให้คะแนนโหวตของฉันเป็นพันขอบคุณ
Danny Hern

2

ฉันต้องการออกจากตัวเลือกอื่น คุณสามารถทำงานให้สำเร็จได้โดยใช้poly.counts()ในGISToolsแพ็คเกจ การใช้ข้อมูลตัวอย่างโดย rcs คุณสามารถทำสิ่งต่อไปนี้ colSums(gContains(polys, pts, byid = TRUE))หากคุณต้องการดูเป็นฟังก์ชั่นที่คุณต้องการรู้ว่าฟังก์ชั่นที่มีการเขียนเป็น ดังนั้นคุณก็สามารถใช้gContains()ในแพคเกจและrgeoscolSums()

library(GISTools)

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

หรือ

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

และผลลัพธ์คือ:

#              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 

สิ่งนี้มีประโยชน์มากจริงๆ แต่ฉันมีปัญหาในการบันทึกผลลัพธ์เนื่องจากฉันต้องการพล็อต choropleth ตามจำนวนคะแนนในรูปหลายเหลี่ยม
qpisqp

2

คุณสามารถทำได้เหมือนกันโดยใช้sfแพ็คเกจ ตรวจสอบรหัสที่ทำซ้ำและแสดงความคิดเห็นด้านล่าง แพคเกจsfจะใช้ในการจัดการวัตถุอวกาศเป็นวัตถุคุณสมบัติง่าย ๆ ในคำตอบนี้แพ็คเกจrasterใช้สำหรับดาวน์โหลดตัวอย่างข้อมูลรูปหลายเหลี่ยมและแพ็คเกจdplyrสำหรับการแปลงข้อมูลในตอนท้าย

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

intersectionresult

intersectionplot

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.