Contando o número de pontos no polígono usando R?

11

Eu tenho duas classes que compartilham o mesmo CRS (Latitute e Longitude):

  1. bolognaQuartieriMap: um SpatialPolygonDataFramedado contendo os municípios de uma cidade.
  2. crashPoints: um SpatialPointsDataFramecontendo dados de acidentes.

Eles são bem plotados usando:

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

O que eu preciso é obter o número de pontos ( crashPoints) em cada polígono que constitui bolognaQuartieriMap. Foi-me sugerido o uso, over()mas não obtive sucesso.

Giorgio Spedicato
fonte

Respostas:

21

Como você não forneceu um exemplo reproduzível nem uma mensagem de erro, veja se este snippet de código o ajuda a começar:

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)

enredo

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
fonte
1
Realmente aprecio muito essa resposta. Por favor, dê meu voto positivo, muito obrigado.
Danny Hern #
2

Eu quero deixar outra opção. Você pode realizar a tarefa usando poly.counts()o GISToolspacote. Usando os dados de amostra por rcs, você pode fazer o seguinte. Se você olhar para a função, perceberá que a função está escrita como colSums(gContains(polys, pts, byid = TRUE)). Então, você pode apenas usar gContains()no rgeospacote e colSums().

library(GISTools)

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

Ou

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

E o resultado é:

#              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
fonte
Isso foi realmente muito útil. Mas eu estou tendo problemas para salvar os resultados como eu gostaria de traçar um choropleth com base no número de pontos no polígono
qpisqp
2

Você pode conseguir o mesmo usando o sfpacote. Verifique o código reproduzível e comentado abaixo. O pacote sfé usado para manipular objetos espaciais como objetos de recursos simples. Nesta resposta, o pacote rasteré usado apenas para baixar dados de polígono de exemplo e o pacote dplyrpara transformação de dados no final.

# 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

Guzmán
fonte