R kullanarak poligondaki noktaların sayımı?


11

Aynı CRS (Enlem ve Boylam) paylaşan iki sınıf var:

  1. bolognaQuartieriMap: bir SpatialPolygonDataFrameşehir ilçeleri içeren veriler.
  2. crashPoints: SpatialPointsDataFramekaza içeren veriler.

Bunlar kullanılarak iyi bir şekilde çizilmiştir:

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

İhtiyacım crashPointsolan her çokgendeki sayı ( ) sayısını elde etmektir bolognaQuartieriMap. Kullanmam önerildi over()ama başaramadım.

Yanıtlar:


21

Tekrarlanabilir bir örnek veya hata mesajı sağlamadığınızdan, bu kod snippet'inin başlayıp başlamadığına bakın:

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)

arsa

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
Bu cevabı gerçekten çok ama çok takdir ediyorum. Lütfen oyumu ver, binlerce teşekkürler.
Danny Hern

2

Başka bir seçenek bırakmak istiyorum. Görevi pakette kullanarak poly.counts()gerçekleştirebilirsiniz GISTools. Örnek verileri rcs ile kullanarak aşağıdakileri yapabilirsiniz. Eğer işleve bakarsanız, fonksiyonun olarak yazıldığını fark edersiniz colSums(gContains(polys, pts, byid = TRUE)). Yani, sadece kullanabilirsiniz gContains()içinde rgeospaket ve colSums().

library(GISTools)

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

Veya

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

Ve sonuç:

#              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 

Bu gerçekten çok yardımcı oldu. Ama çokgendeki nokta sayısına göre bir choropleth çizmek istediğim gibi sonuçları kaydetmekte sorun yaşıyorum
qpisqp 20:17

2

sfPaketi kullanarak da aynı şeyi yapabilirsiniz . Aşağıdaki tekrarlanabilir ve yorumlanmış kodu kontrol edin. Paket sf, uzamsal nesneleri basit özellik nesneleri olarak işlemek için kullanılır. Bu cevapta paket rastersadece örnek çokgen verilerini indirmek dplyriçin ve sonunda veri dönüşümü için kullanılır.

# 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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.