Menghitung jumlah titik dalam poligon menggunakan R?

11

Saya memiliki dua kelas berbagi CRS yang sama (Latitute dan Longitude):

  1. bolognaQuartieriMap: a SpatialPolygonDataFrameberisi data kota borough.
  2. crashPoints: a SpatialPointsDataFrameberisi data kecelakaan.

Mereka diplot dengan baik menggunakan:

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

Yang saya butuhkan adalah untuk mendapatkan jumlah poin ( crashPoints) di setiap poligon yang membentuk bolognaQuartieriMap. Saya disarankan untuk menggunakan over()tetapi saya tidak berhasil.

Giorgio Spedicato
sumber

Jawaban:

21

Karena Anda tidak memberikan contoh yang dapat direproduksi atau pesan kesalahan, lihat apakah potongan kode ini membuat Anda memulai:

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)

merencanakan

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
rcs
sumber
1
Saya benar-benar sangat dan sangat menghargai jawaban ini. Tolong beri saya upvote, ribuan terima kasih.
Danny Hern 6-18
2

Saya ingin meninggalkan opsi lain. Anda dapat mencapai tugas menggunakan poly.counts()dalam GISToolspaket. Menggunakan data sampel oleh rcs, Anda dapat melakukan hal berikut. Jika Anda melihat ke dalam fungsi, Anda akan menyadari bahwa fungsi tersebut ditulis sebagai colSums(gContains(polys, pts, byid = TRUE)). Jadi, Anda bisa menggunakan gContains()dalam rgeospaket dan colSums().

library(GISTools)

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

Atau

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

Dan hasilnya adalah:

#              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 
jazzurro
sumber
Ini memang sangat membantu. Tapi saya mengalami kesulitan menyimpan hasilnya karena saya ingin merencanakan choropleth berdasarkan jumlah poin dalam poligon
qpisqp
2

Anda dapat mencapai hal yang sama menggunakan sfpaket. Periksa kode yang dapat direproduksi dan dikomentari di bawah. Paket sfini digunakan untuk menangani objek spasial sebagai objek fitur sederhana. Dalam jawaban ini paket rasterhanya digunakan untuk mengunduh contoh data poligon dan paket dplyruntuk transformasi data di bagian akhir.

# 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

persimpangan intersection

Guzmán
sumber