Anzahl der Punkte im Polygon mit R zählen?


11

Ich habe zwei Klassen, die dasselbe CRS (Latitute und Longitude) teilen:

  1. bolognaQuartieriMap: a SpatialPolygonDataFrameenthält Daten eines Stadtbezirks.
  2. crashPoints: a SpatialPointsDataFrameenthält Daten von Unfällen.

Sie sind gut geplottet mit:

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

Was ich brauche, ist die Anzahl der Punkte ( crashPoints) in jedem Polygon zu erhalten, die bilden bolognaQuartieriMap. Es wurde mir vorgeschlagen, es zu verwenden, over()aber es gelang mir nicht.

Antworten:


21

Da Sie weder ein reproduzierbares Beispiel noch eine Fehlermeldung angegeben haben, prüfen Sie, ob Sie mit diesem Codefragment loslegen können:

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)

Handlung

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
Ich schätze diese Antwort wirklich sehr und sehr wieder. Bitte geben Sie meine positive Stimme, tausend Dank.
Danny Hern

2

Ich möchte eine andere Option lassen. Sie können die Aufgabe mit poly.counts()im GISToolsPaket erreichen. Mit den Beispieldaten von rcs können Sie Folgendes tun. Wenn Sie sich die Funktion ansehen, werden Sie feststellen, dass die Funktion wie folgt geschrieben ist colSums(gContains(polys, pts, byid = TRUE)). Sie können also einfach gContains()im rgeosPaket und verwenden colSums().

library(GISTools)

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

Oder

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

Und das Ergebnis ist:

#              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 

Das war in der Tat sehr hilfreich. Aber ich habe Probleme beim Speichern der Ergebnisse, da ich ein Choroplethen basierend auf der Anzahl der Punkte im Polygon
zeichnen möchte

2

Sie können das gleiche mit dem sfPaket erreichen. Überprüfen Sie den reproduzierbaren und kommentierten Code unten. Das Paket sfwird verwendet, um räumliche Objekte als einfache Feature-Objekte zu behandeln. In dieser Antwort wird das Paket rasternur zum Herunterladen von Beispielpolygondaten und das Paket dplyrfür die Datentransformation am Ende verwendet.

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

Kreuzungsergebnis

Schnittpunkt

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.