पढ़ते समय NA मानों के साथ समस्या। विंडोज में R 'raster' पैकेज के साथ .DEM फ़ाइल


10

मैं R में 'raster' पैकेज का उपयोग करके विंडोज़ पर .DEM प्रारूप में एक रैस्टर फ़ाइल पढ़ने की कोशिश कर रहा हूँ।

विंडोज 7 में आर में डेटा लोड करते समय मुझे एनए मानों के साथ समस्याएं मिलती हैं, लेकिन मुझे ओएसएक्स लायन के साथ मैक पर समस्या नहीं है। खिड़कियों पर, एनए मान सही ढंग से पढ़ा नहीं लगता है। सवाल यह है कि ऐसा क्यों होता है?

उपयोग की गई रेखापुंज फ़ाइल यूएसजीएस से निम्नलिखित आर कोड के साथ डाउनलोड की गई थी:

download.file('http://edcftp.cr.usgs.gov/pub/data/gtopo30/global/e020n90.tar.gz', 'e020n90.tar.gz')
untar('e020n90.tar.gz')

तब मैंने 'रेखापुंज' पैकेज का उपयोग करके आर को रेखापुंज में पढ़ा। ओएसएक्स लायन और आर 64 संस्करण 2.13.1 में, एनए मूल्यों को मान्यता दी गई है:

> onMac <- raster('E020N90.DEM')
> onMac
class       : RasterLayer 
dimensions  : 6000, 4800, 28800000  (nrow, ncol, ncell)
resolution  : 0.008333333, 0.008333333  (x, y)
extent      : 20, 60, 40, 90  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs 
values      : /Users/Tam/Desktop/E020N90.DEM 
min value   : -9999 
max value   : 5483 

> summary(values(onMac))
Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
-137       85      148      213      213     5483 13046160

लेकिन विंडोज 7 (64 बिट, एक ही आर संस्करण) पर यह सेल मानों को परिवर्तित करता है जो NA की संख्या में होना चाहिए:

> onWindows <- raster('E020N90.DEM')
> onWindows
class       : RasterLayer 
dimensions  : 6000, 4800, 28800000  (nrow, ncol, ncell)
resolution  : 0.008333333, 0.008333333  (x, y)
extent      : 20, 60, 40, 90  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0 
values      : E:/WorldDegreeDays/gsoddata/gtopo/E020N90.DEM 
min value   : -9999 
max value   : 5483 

> summary(values(onWindows))
Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1     150     946   27190   55540   65540

जब मैं इसे विंडोज पर पढ़ता हूं तो रास्टर में कोई NA मान क्यों नहीं हैं? मैं इसके आसपास कैसे काम कर सकता था? मेरा अनुमान है कि यह संख्याओं को संग्रहीत करने के तरीके के साथ करना है, बहुत सारे एनए मान 55540 में बदल दिए जाते हैं।

Windows से जानकारी (रेखांकन लोड करने के बाद):

SessionInfo()
R version 2.13.1 (2011-07-08)
Platform: x86_64-pc-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] rgdal_0.7-1   raster_1.9-12 sp_0.9-88    

loaded via a namespace (and not attached):
[1] grid_2.13.1     lattice_0.19-30

OSX से जानकारी (रेखांकन लोड करने के बाद):

R version 2.13.1 (2011-07-08)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/C/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

other attached packages:
[1] rgdal_0.6-33  raster_1.9-12 sp_0.9-88    

loaded via a namespace (and not attached):
[1] grid_2.13.1     lattice_0.19-33

दोनों प्रणालियों पर रेखापुंज संस्करण 1.9-12
yellowcap

क्या आप sessionInfo()अपने पोस्ट में शामिल कर सकते हैं ?
रोमन लुसट्रिक

मुझे winXP पर raster_1.8-12 (लेकिन 1.9-12 पर आपके समान) पर अलग-अलग मान मिले।
रोमन लुसट्रिक

क्या यह raster_1.8-12 के साथ ठीक काम करता है, या यह सिर्फ अलग था?
येलो

जवाबों:


11

एक वर्कअराउंड कच्चे डेटा के लिए जाना है, क्योंकि यह एक बहुत ही सरल फ़ाइल प्रारूप है।

हर किसी के लिए नहीं, लेकिन यह देखने के लिए रोशन हो सकता है कि क्या हो रहा है।

## all these details are in the .HDR file
NROWS   <-      6000
NCOLS   <-      4800

इस बिंदु पर आप सीधे पूर्णांक चिह्न और अंतरण के विभिन्न विकल्पों की कोशिश कर सकते हैं, और इस तरह से पढ़ने पर हम प्राप्त करते हैं कि रॉबर्ट > 32767फ़ाइल को पढ़ने के बाद परिवर्तन के साथ क्या करता है।

x1 <- readBin("E020N90.DEM", "integer", size = 2, signed = TRUE, n = NROWS * NCOLS, endian = "big")

range(x1)
[1] -9999  5483

x1[x1 < -9998] <- NA

## now for the simple georeferencing, also in the HDR file

ULXMAP   <-     20.00416666666667
ULYMAP   <-     89.99583333333334
XDIM     <-     0.00833333333333
YDIM     <-     0.00833333333333

## now generate x/y coordinates, and the data matrix (flip on Y)
x <- list(x = seq(ULXMAP, by = XDIM, length = NCOLS),
       y = seq(ULYMAP - NROWS * YDIM, by = YDIM, length = NROWS),
      z = matrix(x1, nrow = NCOLS)[ , NROWS:1])

library(sp)

x <- image2Grid(x)

library(raster)
r <- raster(x)

plot(r)

यहां छवि विवरण दर्ज करें

अंत में, प्रक्षेपण को सेट करें क्योंकि यह रेखापुंज द्वारा पढ़ा जाता है (और यह उस तरह से देखने वाले भूखंड में समान पहलू अनुपात देगा जो उस तरह से पढ़ा जाता है)।

projection(r) <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0"

संपादित करें: वूप्स, अब ऊपर से घटाना भूल गया था, अब तय हो गया है - अभी भी एक आधा-सेल मुद्दा है जिसे मैंने नीचे भी नहीं देखा है।


वास्तव में आप दोनों तरीकों को जोड़ सकते हैं (यह उत्तर और मेरे / रॉबर्ट्स उत्तर): r <- raster('E020N90.DEM')और फिर चलाएं values(r)<-readBin("E020N90.DEM", "integer", size = 2, signed = TRUE, n = nrows(r) * ncols(r), endian = "big")और फिर values(r)[values(r)==-9999]<-NA
johanvdw

हा हाँ, लेकिन वह विधर्मी है
mdsumner

6

इस फ़ाइल के साथ या GDAL के साथ कुछ समस्याएं हैं। मैं विंडोज 7 का उपयोग कर रहा हूं

R version 2.13.1 (2011-07-08)
Platform: x86_64-pc-mingw32/x64 (64-bit)

तथा

> getGDALVersionInfo()
[1] "GDAL 1.7.2, released 2010/04/23"


> GDALinfo('E020N90.DEM')
rows        6000 
columns     4800 
bands       1 
origin.x        20 
origin.y        40 
res.x       0.008333333 
res.y       0.008333333 
ysign       -1 
oblique.x   0 
oblique.y   0 
driver      EHdr 
projection  +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs 
file        E020N90.DEM 
apparent band summary:
 GDType  Bmin Bmax   Bmean    Bsd hasNoDataValue NoDataValue
1 UInt16 -9999 5483 -4412.9 5088.6           TRUE       -9999
> 

ध्यान दें कि NoDataValue Bmin मान (-9999) के समान है, जो विषम है। इससे भी बुरी बात यह है कि GDType UInt16 - अनसाइन्टेड 2-बाइट इंटेगर है - जिसका अर्थ है कि आपके पास शून्य से कम मान नहीं हो सकते। यह संभवतया एक बग है जिसे गदल 1.8.0 में तय किया गया था

जब आप करते हैं तो समस्या का चित्रण किया जाता है

r <- 'E020N90.DEM'
plot(r)

मुझे लगता है कि इसे ठीक करने का उपवास तरीका है:

r <- raster('E020N90.DEM')
fun <- function(x){ x[x > 32767] <- x[x > 32767] - 65536; x[x == -9999] <- NA; x}
r[] <- fun(values(r))

plot(r)
r <- writeRaster(r, 'E020N90.TIF')

1
यह फिक्स मेरा से बेहतर है क्योंकि कैस्पियन समुद्र में डेटा बिंदु भी परिवर्तित होते हैं (ये बिंदु भी नकारात्मक हैं)। अच्छा!
२२:०२ पर johanvdw

6

इस समस्या को इस तथ्य को पहचानने में समस्या के कारण लगता है कि डेटा हस्ताक्षरित 2 बाइट पूर्णांक प्रारूप में है। इसे गलत तरीके से अनसाइनड 2 बाइट पूर्णांक प्रारूप के रूप में व्याख्या किया गया है। इसलिए -9999 का आपका नोडा मूल्य बन जाता है: 2bytes = 256 * 256 -9999 = 55537

मुझे जो कुछ अजीब लगा वह यह है कि न्यूनतम मूल्य: -9999 और अधिकतम मूल्य: 5483 दोनों विंडोज़ और मैक के लिए समान हैं। ऐसा लगता है कि दोनों मामलों में हेडर का निर्माण करते समय किसी भी डेटा की सही पहचान नहीं की गई थी, लेकिन जब वास्तव में इसका उपयोग मूल्यों के लिए किया गया तो त्रुटि उत्पन्न हुई।

वैकल्पिक हल:

values(onWindows)[values(onWindows)>128*256]<-values(onWindows)[values(onWindows)>128*256]-256*256
values(onWindows)[values(onWindows)==-9999]<-NA

गहरी खुदाई करने के लिए: ऐसा लगता है कि रेखापुंज को रग्गल कहते हैं, जो बदले में खुद को गदल कहते हैं। सबसे अधिक संभावना है कि आपके पास अपने सिस्टम पर गदल का एक अलग संस्करण है। जब लोड हो रहा है rgdal की जाँच करें जैसे:

Loaded GDAL runtime: GDAL 1.8.0, released 2011/01/12

मैंने अभी-अभी linux पर एक त्वरित जाँच की: gdal 1.8 फ़ाइल को ठीक लोड करता है, लेकिन gdal 1.6 विफल रहता है। तो यह गदल की वजह से लगता है।


लोडेड GDAL रनटाइम: GDAL 1.7.2, 2010/04/23 को जारी
रोमन लुसट्रिक

विंडोज़ पर मेरा GDAL संस्करण भी ऊपर उद्धृत (1.7.2) है, OSX पर मेरे पास 1.8.0 है। लेकिन मैं 1.7.2 का उपयोग करके डीईएम फ़ाइल क्यों नहीं पढ़ सकता हूं। क्या कोई काम है?
yellowcap

मुझे रास्टर के अलग-अलग संस्करणों में अलग-अलग परिणाम मिले (ऊपर मेरी टिप्पणियाँ देखें) इसलिए मुझे पूरी तरह यकीन नहीं है कि यह प्रति GDAL है
रोमन लुसट्रिक

क्या आप बता rgdalसकते हैं कि gdalWin7 पर एक अद्यतन स्थापना कैसे मिल सकती है ? मैंने सबसे हालिया gdalबायनेरिज़ (32 और 64 दोनों) को डाउनलोड और इंस्टॉल किया । इन्हें डिफ़ॉल्ट स्थान पर स्थापित किया गया था, लेकिन rgdalअपडेट करने के बाद भी 1.7.2 का उपयोग करता है।
yellowcap

Rgdal को अपडेट करना स्पष्ट नहीं है, और इसे rgdal के पुन: संयोजन की आवश्यकता होगी। अधिक जानकारी यहाँ
johanvdw

0

यद्यपि मुझे आपकी आवश्यकता के बारे में निश्चित नहीं है, आप परिवर्तित कर सकते हैं। DEM फ़ाइलें .GRID फ़ाइलों में। फिर, आर्कगिस जियोप्रोसेसर या आर स्वचालित रूप से पहचान करेंगे। ग्रिड रेखापुंज हेरफेर के दौरान एन / ए मूल्यों के साथ .GRIDs।


फ़ाइल को परिवर्तित करने के लिए किसी अन्य सॉफ़्टवेयर का उपयोग करना संभव है, लेकिन मेरा इरादा नहीं। फ़ाइल डाउनलोड करने, पढ़ने और विश्लेषण करने के लिए विचार केवल R का उपयोग करना था।
yellowcap

सिद्धांत रूप में आप R का उपयोग करके gdaltranslate चला सकते हैं system2
जोहन्वाडव २ at'११
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.