বহুভুজতে পয়েন্ট সংখ্যা গণনা করে আর?


11

একই সিআরএস (অ্যাট্রিবিউট এবং দ্রাঘিমাংশ) ভাগ করে নেওয়ার জন্য আমার দুটি ক্লাস রয়েছে:

  1. bolognaQuartieriMap: একটি SpatialPolygonDataFrameশহর বোর্টের ডেটাযুক্ত।
  2. crashPoints: SpatialPointsDataFrameদুর্ঘটনার একটি তথ্য রয়েছে।

তারা ভাল ব্যবহার করে চক্রান্ত করা হয়েছে:

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

আমার যা দরকার তা হ'ল crashPointsপ্রতিটি বহুভুতে গঠিত পয়েন্টগুলির সংখ্যা ( ) পাওয়া bolognaQuartieriMap। আমাকে ব্যবহার করার পরামর্শ দেওয়া হয়েছিল over()কিন্তু আমি সফল হইনি।

উত্তর:


21

যেহেতু আপনি পুনরায় উত্পাদনযোগ্য উদাহরণ বা ত্রুটি বার্তা সরবরাহ করেন নি, দেখুন এই কোড স্নিপেটটি আপনাকে শুরু করে কিনা:

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)

পটভূমি

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
আমি সত্যিই এবং সত্যই আবার এই উত্তর প্রশংসা করি। দয়া করে আমার উপনোটটি দিন, হাজারো ধন্যবাদ।
ড্যানি হার্ন

2

আমি অন্য বিকল্প ছেড়ে যেতে চাই। ব্যবহার করে আপনি কাজটি অর্জন করতে পারেন poly.counts()মধ্যে GISToolsপ্যাকেজ। আরসিএসের সাহায্যে নমুনা ডেটা ব্যবহার করে আপনি নিম্নলিখিতটি করতে পারেন। আপনি যদি ফাংশনটি সন্ধান করেন তবে বুঝতে পারবেন যে ফাংশনটি সেই হিসাবে লেখা হয়েছিল colSums(gContains(polys, pts, byid = TRUE))। সুতরাং, আপনি শুধু ব্যবহার করতে পারেন gContains()মধ্যে rgeosপ্যাকেজ এবং colSums()

library(GISTools)

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

অথবা

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

এবং ফলাফল:

#              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 

এটি সত্যিই খুব সহায়ক ছিল। তবে ফলাফলগুলি সংরক্ষণ করতে আমার সমস্যা হচ্ছে কারণ আমি বহুভুজের পয়েন্টের সংখ্যার ভিত্তিতে একটি কোরোপলথ প্লট করতে চাই
qpisqp

2

আপনি sfপ্যাকেজ ব্যবহার করে এটি অর্জন করতে পারেন । নীচে পুনরায় প্রজননযোগ্য এবং মন্তব্য করা কোডটি দেখুন। প্যাকেজটি sfস্থানিক অবজেক্টগুলিকে সাধারণ বৈশিষ্ট্যগুলির বিষয় হিসাবে পরিচালনা করতে ব্যবহৃত হয়। এই উত্তরে প্যাকেজটি rasterকেবলমাত্র বহুভুজ ডেটা ডাউনলোডের জন্য এবং প্যাকেজটি dplyrডেটা ট্রান্সফরমেশনের শেষে ব্যবহার করা হয়।

# 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.