से 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
>
B gIntersects
, C कोड के बजाय R में चौराहों की जांच करने के लिए मैट्रिक्स को स्वीप करने के साथ भी तेज़ है। मुझे इसके prepared geometry
GEOS के कौशल पर संदेह है , स्थानिक सूचकांक बनाते हैं - हाँ, इसके साथ prepared=FALSE
थोड़ा लंबा समय लगता है, लगभग 5.5 सेकंड।
मुझे आश्चर्य है कि सूचकांकों या बिंदुओं को सीधे वापस करने का कोई कार्य नहीं है। जब मैंने लिखा था splancs
20 साल पहले बिंदु-बहुभुज कार्यों दोनों में था ...