সহায়তা থেকে sp::over
:
x = "SpatialPoints", y = "SpatialPolygons" returns a numeric
vector of length equal to the number of points; the number is
the index (number) of the polygon of ‘y’ in which a point
falls; NA denotes the point does not fall in a polygon; if a
point falls in multiple polygons, the last polygon is
recorded.
তাই আপনি যদি আপনার রূপান্তর SpatialPolygonsDataFrame
করতে SpatialPolygons
আপনাকে ফেরত ইন্ডেক্সে একটি ভেক্টর পেতে এবং আপনি আপনার পয়েন্ট উপসেট করতে NA
:
> over(pts,as(ply,"SpatialPolygons"))
[1] NA 1 1 NA 1 1 NA NA 1 1 1 NA NA 1 1 1 1 1 NA NA NA 1 NA 1 NA
[26] 1 1 1 NA NA NA NA NA 1 1 NA NA NA 1 1 1 NA 1 1 1 NA NA NA 1 1
[51] 1 NA NA NA 1 NA 1 NA 1 NA NA 1 NA 1 1 NA 1 1 NA 1 NA 1 1 1 1
[76] 1 1 1 1 1 NA NA NA 1 NA 1 NA NA NA NA 1 1 NA 1 NA NA 1 1 1 NA
> nrow(pts)
[1] 100
> pts = pts[!is.na(over(pts,as(ply,"SpatialPolygons"))),]
> nrow(pts)
[1] 54
> head(pts@data)
var1 var2
2 0.04001092 v
3 0.58108350 v
5 0.85682609 q
6 0.13683264 y
9 0.13968804 m
10 0.97144627 o
>
সন্দেহকারীদের জন্য, রূপান্তর ওভারহেড কোনও সমস্যা নয় তা এখানে প্রমাণ:
দুটি ফাংশন - প্রথম জেফরি ইভান্স পদ্ধতি, তারপরে আমার আসল, তারপরে আমার হ্যাক করা রূপান্তর, তারপরে gIntersects
জোশ ওব্রায়নের উত্তরের উপর ভিত্তি করে একটি সংস্করণ :
evans <- function(pts,ply){
prid <- over(pts,ply)
ptid <- na.omit(prid)
pt.poly <- pts[as.numeric(as.character(row.names(ptid))),]
return(pt.poly)
}
rowlings <- function(pts,ply){
return(pts[!is.na(over(pts,as(ply,"SpatialPolygons"))),])
}
rowlings2 <- function(pts,ply){
class(ply) <- "SpatialPolygons"
return(pts[!is.na(over(pts,ply)),])
}
obrien <- function(pts,ply){
pts[apply(gIntersects(columbus,pts,byid=TRUE),1,sum)==1,]
}
এখন বাস্তব-বিশ্বের উদাহরণস্বরূপ, আমি columbus
ডেটা সেটের উপরে কিছু এলোমেলো পয়েন্ট ছড়িয়েছি:
require(spdep)
example(columbus)
pts=data.frame(
x=runif(100,5,12),
y=runif(100,10,15),
z=sample(letters,100,TRUE))
coordinates(pts)=~x+y
ভাল লাগছে
plot(columbus)
points(pts)
ফাংশনগুলি একই কাজ করছে তা পরীক্ষা করুন:
> identical(evans(pts,columbus),rowlings(pts,columbus))
[1] TRUE
এবং বেঞ্চমার্কিংয়ের জন্য 500 বার চালান:
> system.time({for(i in 1:500){evans(pts,columbus)}})
user system elapsed
7.661 0.600 8.474
> system.time({for(i in 1:500){rowlings(pts,columbus)}})
user system elapsed
6.528 0.284 6.933
> system.time({for(i in 1:500){rowlings2(pts,columbus)}})
user system elapsed
5.952 0.600 7.222
> system.time({for(i in 1:500){obrien(pts,columbus)}})
user system elapsed
4.752 0.004 4.781
আমার অন্তর্নিহিত অনুসারে, এটি কোনও দুর্দান্ত ওভারহেড নয়, প্রকৃতপক্ষে এটি সমস্ত সারি সূচকগুলিকে অক্ষর এবং পিছনে রূপান্তরিত করার চেয়ে, বা অনুপস্থিত মান পাওয়ার জন্য na.omit চালানোর চেয়ে কম ওভারহেডের হতে পারে। যা ঘটনাক্রমে evans
ফাংশনের আরেকটি ব্যর্থতা মোডে নিয়ে যায় ...
যদি বহুভুজ ডেটা ফ্রেমের একটি সারি সমস্ত হয় NA
(যা পুরোপুরি বৈধ হয়), তবে সেই SpatialPolygonsDataFrame
বহুভুজের পয়েন্টগুলির জন্য ওভারলেটি সমস্ত NA
এর সাথে একটি আউটপুট ডেটা ফ্রেম তৈরি করবে , যা evans()
পরে ছাড়বে:
> columbus@data[1,]=rep(NA,20)
> columbus@data[5,]=rep(NA,20)
> columbus@data[17,]=rep(NA,20)
> columbus@data[15,]=rep(NA,20)
> set.seed(123)
> pts=data.frame(x=runif(100,5,12),y=runif(100,10,15),z=sample(letters,100,TRUE))
> coordinates(pts)=~x+y
> identical(evans(pts,columbus),rowlings(pts,columbus))
[1] FALSE
> dim(evans(pts,columbus))
[1] 27 1
> dim(rowlings(pts,columbus))
[1] 28 1
>
gIntersects
সি কোডের পরিবর্তে আর-তে ছেদগুলি পরীক্ষা করতে ম্যাট্রিক্স সুইপ করেও বুট দ্রুত হয়। আমি এটি সন্দেহprepared geometry
জিওএস দক্ষতা , স্থানিক সূচক তৈরি করে - হ্যাঁ, এর সাথেprepared=FALSE
এটি কিছুটা দীর্ঘ সময় নেয়, প্রায় 5.5 সেকেন্ডের মধ্যে।
আমি অবাক হয়েছি সূচকগুলি বা পয়েন্টগুলি সরাসরি ফেরত দেওয়ার জন্য কোনও ফাংশন নেই। আমি যখন splancs
20 বছর আগে লিখেছিলাম পয়েন্ট-ইন-বহুভুজ ফাংশন দুটি ছিল ...