मुझे विविध विषयगत मानचित्रों के लिए एक मास्टर ग्रिड के रूप में एक स्थानिक ग्रिड की आवश्यकता है। मैं सभी एनए पिक्सल को त्यागने वाले रेखापुंज से एक स्थानिक ग्रिड का उत्पादन कैसे करूं?
मुझे विविध विषयगत मानचित्रों के लिए एक मास्टर ग्रिड के रूप में एक स्थानिक ग्रिड की आवश्यकता है। मैं सभी एनए पिक्सल को त्यागने वाले रेखापुंज से एक स्थानिक ग्रिड का उत्पादन कैसे करूं?
जवाबों:
आप एक रेखापुंज में कोशिकाओं के सभी गैर-एनए निर्देशांक प्राप्त कर सकते हैं:
r = raster(matrix(runif(20),5,4))
r[r>.5]=NA
coordinates(r)[!is.na(values(r)),]
x y
[1,] 0.375 0.7
[2,] 0.125 0.5
[3,] 0.375 0.5
[4,] 0.625 0.5
[5,] 0.875 0.5
[6,] 0.125 0.3
[7,] 0.375 0.3
[8,] 0.625 0.3
[9,] 0.375 0.1
[10,] 0.875 0.1
वे कोशिकाएं हैं जो NA नहीं हैं। तब आप संभवतः इन्हें SpatialPixels को खिला सकते हैं
SpatialPixels(SpatialPoints(coordinates(r)[!is.na(values(r)),]))
Object of class SpatialPixels
Grid topology:
cellcentre.offset cellsize cells.dim
x 0.125 0.25 4
y 0.100 0.20 4
SpatialPoints:
x y
[1,] 0.375 0.7
[2,] 0.125 0.5
[3,] 0.375 0.5
[4,] 0.625 0.5
[5,] 0.875 0.5
[6,] 0.125 0.3
[7,] 0.375 0.3
[8,] 0.625 0.3
[9,] 0.375 0.1
[10,] 0.875 0.1
Coordinate Reference System (CRS) arguments: NA
हालांकि व्यक्तिगत रूप से एक ग्रिड पर कुछ भी मैं एक रेखापुंज के रूप में रखना होगा।
मुझे पूरी तरह से अभी भी यकीन नहीं है कि आप क्या चाहते हैं - SpatialGrid
ऑब्जेक्ट पूर्ण आयताकार ग्रिड को परिभाषित करते हैं, इसलिए बिना एनए पिक्सल के कोई मतलब नहीं होता है।
एक रैस्टरलेयर को एक स्थानिक * ऑब्जेक्ट (ग्रिड या पिक्सेल) में बदलने के लिए, आप कॉर्शनर "आप" का उपयोग कर सकते हैं
library(raster)
r <- raster(matrix(runif(20),5,4))
r[r>.5] <- NA
g <- as(r, 'SpatialGridDataFrame')
p <- as(r, 'SpatialPixels')
plot(r)
points(p)
आपकी दो आवश्यकताएं अलग-अलग चीजों के बारे में प्रतीत होती हैं:
1) विश्वसनीय रेखापुंज ग्रिड टेम्पलेट के कुछ प्रकार।
2) एक विरल ग्रिड जो स्पष्ट रूप से लापता कोशिकाओं को संग्रहीत नहीं करता है।
sp :: GridTopology पहला प्रदान करता है, यह केवल निचले बाएँ सेल के समन्वय (Cellcentre.offset), सेल रिक्ति (Cellize), और ग्रिड के आयाम (cells.dim) पर आधारित ग्रिड का वर्णन है।
Sp :: SpatialPixelsDataFrame वर्ग आपको विरल ग्रिडों को संग्रहीत करने की अनुमति देता है, लेकिन अपने दम पर यह "टेम्पलेट" की तुलना में बहुत अधिक संग्रहीत करता है - यह हर समन्वय को स्पष्ट रूप से संग्रहीत करता है। ऐसा इसलिए है क्योंकि यह दो काम करता है, एक यह आपको मूल निर्देशांक को संरक्षित करने की अनुमति देता है जो ग्रिड से आते हैं और संभवतः थोड़ा अनियमित होते हैं, दो यह आपको केवल उन कोशिकाओं को संग्रहीत करने देता है जिनके पास वैध मान हैं। (यकीनन * इन दोनों लक्ष्यों को अलग किया जाना चाहिए था, लेकिन यह एक और कहानी है)।
मुझे नहीं लगता कि रेखापुंज पैकेज में ग्रिडटोलॉजी का एक स्पष्ट एनालॉग है, लेकिन आप "अपना स्वयं का रोल" करने के लिए घटकों को पकड़ सकते हैं:
library(raster)
r1 <- raster(nrows=108, ncols=21, xmn=0, xmx=10)
## "cellsize"
res(r1)
## [1] 0.4761905 1.6666667
## extreme cell corners (just a different convention to sp's cellcentre)
extent(r1)
class : Extent
xmin : 0
xmax : 10
ymin : -90
ymax : 90
## we can also use bbox to get the same thing
bbox(r1)
min max
s1 0 10
s2 -90 90
## grid dimensions (including number of attributes/layers as 3rd "dim")
dim(r1)
## [1] 108 21 1
इन सभी को एक साथ जोड़कर, हम रेखापुंज से सपा तक जा सकते हैं:
GridTopology(bbox(r1)[,1] + res(r1)/2, res(r1), dim(r1)[2:1])
(ध्यान दें कि आयामों को कैसे उलट देना है)। एक और सरल तरीका है SpatialGrid के साथ सामंजस्य स्थापित करना और सपा के getGridTopology का उपयोग करना, हालांकि यह अधिक महंगा है क्योंकि निर्देशांक रास्ते के साथ उत्पन्न हो रहे हैं:
getGridTopology(as(r1, "SpatialGrid"))
रेखापुंज "टोपोलॉजी" के वे तीन भाग आवश्यक नहीं हैं, क्योंकि कुछ निरर्थक हैं, लेकिन अन्यथा उन सभी को एक वस्तु के रूप में कैप्चर करने का कोई तरीका नहीं है - सिवाय इसके कि ऊपर बनाया गया रेखापुंज "खाली" है और इसलिए यह ऐसा कर सकता है नौकरी जो GridTopology सपा के लिए करता है। मुझे इस बात पर यकीन नहीं है कि यह "खाली" कैसे है, लेकिन यह निश्चित रूप से "डेटा" स्लॉट को स्पष्ट रूप से संग्रहीत नहीं करता है और इसमें मूल्यों के साथ होने की तुलना में छोटा है। रैस्टर पैकेज सामान्य रूप से मेमोरी उपयोग को न्यूनतम रखने के लिए अपना सर्वश्रेष्ठ प्रयास करता है, और इसलिए इसके साथ आपको वास्तव में "विरल" होने के बारे में चिंता करने की आवश्यकता नहीं है।
यह थोड़ा और समझाने में मदद कर सकता है, मुझे पता है कि मैं स्पेल्डमैन के जवाब को ओवरलैप कर रहा हूं, लेकिन यह अभी भी स्पष्ट नहीं है कि प्रश्न में आपका क्या मतलब है।