R: रैस्टर लायर से अक्षांश और देशांतर कैसे प्राप्त करें?


15

मैं भौगोलिक डेटा का पूर्ण आरंभक हूं, इसलिए कृपया, मुझे क्षमा करें यदि प्रश्न उचित नहीं है।

मैंने एनसीडीसी एनएआरआर से डेटा डाउनलोड किया और rasterपैकेज का उपयोग करके आर में लोड करने में कामयाब रहा । मैं अक्षांश, देशांतर और मूल्य के साथ एक सूची प्राप्त करना चाहूंगा। मैं समझता हूं कि rasterToPoints()मुझे वही करना चाहिए जो मैं चाहता हूं, हालांकि, मेरा अक्षांश और देशांतर मान अजीब लगता है:

r <- raster(myfile)
data_matrix <- rasterToPoints(r)
head(data_matrix)
            x       y value
[1,] -5405401 4347242    70
[2,] -5372938 4347242    88
[3,] -5340475 4347242    76
[4,] -5308012 4347242    85
[5,] -5275549 4347242    87
[6,] -5243086 4347242    88

मुझे लगता है कि मुझे उस प्रक्षेपण के साथ कुछ करना चाहिए जो वर्तमान में लैम्बर्ट कॉनफॉर्मल कॉनिक (एलसीसी) है। यहाँ रास्टर के बारे में और जानकारी दी गई है।

> r
class       : RasterLayer 
dimensions  : 277, 349, 96673  (nrow, ncol, ncell)
resolution  : 32463, 32463  (x, y)
extent      : -5648874, 5680713, -4628777, 4363474  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=lcc +lat_1=50 +lat_2=50 +lat_0=50 +lon_0=-107 +x_0=0 +y_0=0 +a=6371200 +b=6371200 +units=m +no_defs 
data source : mypath-to-file
names       : value

मुझे वास्तविक यूएस अक्षांश और देशांतर मान प्राप्त करने के लिए क्या करना चाहिए?

जवाबों:


15

आपको वास्तव में "प्रोजेक्टरस्टर" या "स्पट्रांसफॉर्म" का उपयोग करके एक भौगोलिक (दशमलव डिग्री) प्रक्षेपण में रेखापुंज को पुन: अस्वीकार करने की आवश्यकता है। इसके अलावा सीआरएस सपा परिभाषाओं को देखें जो आपके वांछित प्रक्षेपण स्ट्रिंग को निर्दिष्ट करते हैं। "प्रोजेक्टरस्टर" के लिए मदद में उदाहरण यह कैसे करना है में काफी स्पष्ट है।

यदि आप अपने रेखापुंज डेटा को एक SpatialPointsDataFrame ऑब्जेक्ट में ले जाते हैं, तो आप "स्पेसट्रॉफ़ॉर्म" का उपयोग करेंगे और @coordinates स्लॉट से निर्देशांक खींचेंगे और उन्हें @dadnet स्लॉट में data.frame में जोड़ देंगे। यहाँ एक उदाहरण है कि ऐसा क्या दिखेगा।

library(raster)
library(rgdal) # for spTransform

# Create data
r <- raster(ncols=100, nrows=100)
  r[] <- runif(ncell(r))
  crs(r) <- "+proj=lcc +lat_1=48 +lat_2=33 +lon_0=-100 +ellps=WGS84"
  projection(r)

# Convert raster to SpatialPointsDataFrame
r.pts <- rasterToPoints(r, spatial=TRUE)
  proj4string(r.pts)

# reproject sp object
geo.prj <- "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0" 
r.pts <- spTransform(r.pts, CRS(geo.prj)) 
  proj4string(r.pts)

# Assign coordinates to @data slot, display first 6 rows of data.frame
r.pts@data <- data.frame(r.pts@data, long=coordinates(r.pts)[,1],
                         lat=coordinates(r.pts)[,2])                         
head(r.pts@data)

मुझे ध्यान देना चाहिए कि चूहों को वेक्टर ऑब्जेक्ट क्लास में बदलना अच्छा अभ्यास नहीं है और मेमोरी सुरक्षित प्रसंस्करण प्रदान करने वाले रास्टर पैकेज के फायदों की उपेक्षा करता है। यह वास्तव में आपकी समस्या के बारे में सोचने और आकलन करने के लिए विवेकपूर्ण है कि क्या आप सही तरीके से संपर्क कर रहे हैं। यदि ओपी ने संदर्भ प्रदान किया है कि उन्हें हर सेल के लिए [x, y] निर्देशांक की आवश्यकता क्यों है, तो फोरम समुदाय कम्प्यूटेशनल विकल्प प्रदान करने में सक्षम हो सकता है जो समस्या को तेज वातावरण में रखेगा।


1
अपनी सावधानी (डेटा रूपांतरण से बचने के बारे में) को दिल तक ले जाने का एक तरीका मूल रेखापुंज (शायद एक बहुत मोटे ग्रिड) को अनप्रोजेक्ट करना है, अप्रमाण की सीमा को कवर करने वाले अक्षांश और देशांतर मूल्यों के दो ग्रिड बनाएं और उन लोगों को वापस प्रोजेक्ट करें मूल ग्रिड की सीमा। कोई वेक्टर कक्षाएं नहीं बनाई गई हैं: यह पूरी तरह से रेखापुंज संचालन का एक सेट है।
व्हिबर

4

सेल केंद्रों के निर्देशांक प्राप्त करें और एक स्थानिक वस्तु बनाएं:

spts <- rasterToPoints(r, spatial = TRUE)

अपने इच्छित लक्ष्य पर बिंदुओं को रूपांतरित करें:

library(rgdal)
llprj <-  "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0"
llpts <- spTransform(spts, CRS(llprj))

मानों को पहले ही इस SpatialPointsDataFrame पर कॉलम के रूप में कॉपी किया जाता है।

print(llpts)

अब समाप्त करने के लिए, एक data.frame प्राप्त करें:

x <- as.data.frame(llpts)

SGAT पैकेज में इसका एक सामान्य कार्यान्वयन है, lonlatFromCellयहां फ़ंक्शन देखें :

https://github.com/SWotherspoon/SGAT/blob/master/R/Raster.R


मैंने यह कोशिश की, लेकिन निम्नलिखित त्रुटि संदेश मिला: > llpts$layer1 <- values(r[[1]]) Error in [[<- data.frame (* tmp *, name, value = c(NA, NA, NA, NA, NA, : replacement has 96673 rows, data has 95025
janosdivenyi

वास्तव में आपको विशेषताओं को स्थानांतरित करने की आवश्यकता नहीं है, मैं इसे हटा दूँगा।
mdsumner

SGAT पैकेज सलाह के अलावा, क्या यह वास्तव में वही उत्तर / उदाहरण नहीं है जो मैंने प्रदान किया है? निर्देशांक डेटा स्लॉट में डेटा के लिए प्रचारित नहीं किया जाता है, केवल रेखापुंज से मान। निर्देशांक, वास्तव में, निर्देशांक स्लॉट में आयोजित किए जाते हैं और डेटा.फ्रेम में जोड़े जाने की आवश्यकता होती है।
जेफरी इवांस

धन्यवाद, मैंने as.data.frame कदम जोड़ा। मुझे लगता है कि निर्देशांक को विशेषताओं के रूप में जोड़ने के लिए यह भयानक सलाह है - विशेष रूप से स्लॉट के साथ मुंगिंग करके - चूंकि ऑब्जेक्ट के निर्देशांक बदल सकते हैं। यदि आप एक कच्चा डेटा चाहते हैं। बस एक बनाइए। मुझे परवाह नहीं है कि जानकारी कहां है, हो सकता है कि सिर्फ आपका संपादन करें और हम इस उत्तर को काट सकें।
मॉडसमर

ओपी विशेष रूप से निर्देशांक चाहते थे और मुझे लगता है कि यह एक अलग डेटा.फ्रेम को बचाने के लिए अनावश्यक है। मुझे आमतौर पर मुख्य रूप से डेटा स्लॉट में निर्देशांक जोड़ना पसंद नहीं है, क्योंकि यह समन्वय स्लॉट के साथ बेमानी है। इसके अलावा, डेटा स्लॉट में जानकारी जोड़ने के लिए यह "भयानक सलाह" नहीं है। क्या होगा यदि आप दो निर्देशांक प्रणाली चाहते हैं। आप डेटा स्लॉट में lat / long को जोड़ सकते हैं और पूरी तरह से अलग प्रोजेक्शन में ऑब्जेक्ट रख सकते हैं। इसके अलावा, यदि आप एक फ्लैट फ़ाइल का निर्यात करना चाहते हैं, और एक जीआईएस प्रारूप नहीं, तो आप डेटा.फ्रेम में निर्देशांक जोड़ सकते हैं और सीएसवी के रूप में सहेज सकते हैं।
जेफरी इवांस

0

ऐसा प्रतीत होता है कि आपने वहां निर्देशांक जमा किए हैं (अक्षांश / देशांतर उर्फ ​​जीसीएस निर्देशांक नहीं)। यह शायद आपके लिए स्पष्ट नहीं था कि यह समस्या थी। इस पोस्ट को देखें। भौगोलिक समन्वय प्रणाली को आर में परिवर्तित करना


इससे पहले कि मैं जवाब देता मैं पोस्ट को आपके द्वारा संदर्भित नहीं करता। आप इसे डुप्लिकेट के रूप में फ़्लैग करना चाहते हैं। हालांकि SpatialPointsDataFrame ज़बरदस्ती और समन्वय असाइनमेंट के अलावा अगर थोड़ा अलग है। तुम्हारा फोन।
जेफरी इवांस

मैंने इसे इस तरह चिह्नित करने के बारे में सोचा था, लेकिन मैंने सोचा कि अगर कोई अन्य व्यक्ति इसी तरह के उत्तर की खोज कर रहा है, तो यह जानने के लिए कि उन्हें मूल्यों को प्रोजेक्ट करने की आवश्यकता नहीं है, यह उनके लिए दिख सकता है। आपके उत्तर के अलावा वहां पहुंचने के लिए एक अलग तरीका है (अपवोटेड)।
jbchurchill

मैंने आपके द्वारा सूचीबद्ध स्रोतों को देखने की कोशिश की। मेरे द्वारा जारी किए गए मानक अक्षांश / देशांतर प्राप्त करने के लिए lonlat_r <- projectRaster(r, crs="+init=epsg:4326")। हालाँकि, नए रेखापुंज की सीमा वह है -181.3232, 181.4938, -1.590457, 87.76154 (xmin, xmax, ymin, ymax)जो मैं अमेरिका से उम्मीद करता हूं (जो 30 से 70 और -60 से -160 के बीच कहीं होनी चाहिए) से बहुत दूर है। मुझे कुछ गलत समझ लेना चाहिए था।
२१:१yi पर Janosdivenyi

0
    library(raster)
r<-pt$cpc.pr[[1]] #my raster taken from a first layer of a stack
    rlon<-rlat<-r #copy r to rlon and rlat rasters [1]][1]which will contain the longitude and latitude
    xy<-xyFromCell(r,1:length(r)) #matrix of logitudes (x) and latitudes(y)
    rlon[]<-xy[,1] #raster of longitudes
    rlat[]<-xy[,2] #raster of latitides
    par(mfrow=c(1,2))
    image(rlon,main="longitudes")
    image(rlat,main="latitudes")

परिणाम छवि में दिखाया गया है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.