Conteggio del numero di punti nel poligono usando R?


11

Ho due classi che condividono lo stesso CRS (Latitute e Longitude):

  1. bolognaQuartieriMap: a SpatialPolygonDataFramecontenente i dati di un distretto cittadino.
  2. crashPoints: a SpatialPointsDataFramecontenente dati sugli incidenti.

Sono ben tracciati usando:

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

Ciò di cui ho bisogno è ottenere il numero di punti ( crashPoints) in ciascun poligono che costituisce bolognaQuartieriMap. Mi è stato suggerito di utilizzare over()ma non ci sono riuscito.

Risposte:


21

Poiché non hai fornito un esempio riproducibile né un messaggio di errore, verifica se questo frammento di codice ti avvia:

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)

tracciare

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
Apprezzo davvero moltissimo questa risposta. Per favore, dai il mio voto, mille grazie.
Danny Hern,

2

Voglio lasciare un'altra opzione. È possibile eseguire l'attività utilizzando poly.counts()nel GISToolspacchetto. Utilizzando i dati di esempio di rcs, è possibile effettuare le seguenti operazioni. Se esaminassi la funzione, ti accorgeresti che la funzione è scritta come colSums(gContains(polys, pts, byid = TRUE)). Quindi, puoi semplicemente usare gContains()nel rgeospacchetto e colSums().

library(GISTools)

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

O

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

E il risultato è:

#              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 

Questo è stato davvero molto utile. Ma ho problemi a salvare i risultati poiché vorrei tracciare un coropleth in base al numero di punti nel poligono
qpisqp

2

Puoi ottenere lo stesso risultato usando il sfpacchetto. Controlla il codice riproducibile e commentato di seguito. Il pacchetto sfviene utilizzato per gestire oggetti spaziali come semplici oggetti caratteristiche. In questa risposta il pacchetto rasterviene utilizzato solo per il download di dati poligonali di esempio e il pacchetto dplyrper la trasformazione dei dati alla fine.

# 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.