मैं R का उपयोग करके डेटा को lat, lon, value के रूप में raster फ़ाइल में कैसे बदल सकता हूँ?


40

मेरे पास महाद्वीपीय यूएस में एक किमी ग्रिड पर मूल्यों का एक डेटा सेट है कॉलम "अक्षांश", "देशांतर", और "अवलोकन", जैसे हैं:

"lat"    "lon"     "yield"
 25.567  -120.347  3.6 
 25.832  -120.400  2.6
 26.097  -120.454  3.4
 26.363  -120.508  3.1
 26.630  -120.562  4.4

या, R डेटा फ़्रेम के रूप में:

mydata <- structure(list(lat = c(25.567, 25.832, 26.097, 26.363, 26.63), 
lon = c(-120.347, -120.4, -120.454, -120.508, -120.562), 
yield = c(3.6, 2.6, 3.4, 3.1, 4.4)), .Names = c("lat", 
"lon", "yield"), class = "data.frame", row.names = c(NA, -5L))

(पूरा डेटा सेट यहां csv के रूप में डाउनलोड किया जा सकता है )

डेटा एक फसल मॉडल (30 किमी x 30 किमी ग्रिड पर होना करने के लिए) से उत्पादन कर रहे हैं ( मिगुएज़ एट अल 2012 से )।

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

मैं इन्हें जीआईएस - संबंधित मेटाडेटा जैसे मानचित्र प्रक्षेपण के साथ एक रेखापुंज फ़ाइल में कैसे बदल सकता हूं?

आदर्श रूप से फ़ाइल एक पाठ (ASCII?) फ़ाइल होगी क्योंकि मैं इसके लिए प्लेटफ़ॉर्म और सॉफ़्टवेयर स्वतंत्र होना चाहूंगा।


CSV के रूप में, यह पहले से ही ASCII में एक "टेक्स्ट फ़ाइल" है। इसके अलावा, जैसा कि यह बिल्कुल भी प्रक्षेपण का उपयोग नहीं करता है, जोड़ने के लिए थोड़ा प्रासंगिक मेटाडेटा (डेटम, ज्यादातर) हो सकता है। क्या आप इस बारे में थोड़ा और विशिष्ट हो सकते हैं कि आप किस तरह का आउटपुट चाहते हैं और आप इसके साथ क्या करना चाहते हैं?
whuber

मैं किसी व्यक्ति के लिए डेटा का उपयोग विभिन्न प्रकार के मैपिंग सॉफ़्टवेयर (ArcGIS, Google मैप्स, ग्रास, R, आदि) के साथ करना आसान बना सकता हूं ताकि पुन: उपयोग की सुविधा के लिए, जैसे कि अतिरिक्त रूपांतरण चरणों की आवश्यकता न हो। जीआईएस फ़ाइल स्वरूपों के विकिपीडिया पृष्ठ के आधार पर , मैं 1) अनुमान लगाता हूं कि एक "रेखापुंज" फाइल में अक्षांश और देशांतर के कॉलम नामों के साथ एक छवि की तरह होना चाहिए और 2) मेटाडेटा में भौगोलिक जानकारी (एक कोने का स्थान, क्षेत्र शामिल) होना चाहिए डेटा द्वारा)।
अबे

यह एक सबसे अच्छा संदर्भ है जो मुझे आर और जीआईएस पर आया था। आपका बहुत बहुत धन्यवाद! क्या आप कृपया सही proj4string के साथ लेट और लॉन्ग के साथ एक और सीएसवी प्रदान कर सकते हैं? मैं वास्तव में इसकी सराहना करूंगा।

@Nandini सुनिश्चित नहीं हैं कि क्या सही proj4string है, मुझे लगता है लैंबर्ट:proj +proj=lcc +lat_1=50.0 +lat_2=50.0 +units=km +lon_0=-145.5 +lat_0=1.0 । मुझे यकीन नहीं है कि आप किसी अन्य सीएसवी फ़ाइल के संबंध में क्या पूछ रहे हैं - यह प्रश्न में जुड़े लिंक से अलग कैसे होगा, या यह स्वीकार किए गए उत्तर द्वारा निर्मित होगा?
अबे

मेरे लिए काम नहीं करता है! मुझे नहीं पता कि "x" और "y" को "निर्देशांक (pts) = ~ x + y" पर क्या

जवाबों:


44

कई चरणों की आवश्यकता:

  1. आप कहते हैं कि यह एक नियमित 1 किमी ग्रिड है, लेकिन इसका मतलब है कि लैट-लॉन्ग नियमित नहीं हैं। पहले आपको इसे एक नियमित ग्रिड समन्वय प्रणाली में बदलने की आवश्यकता है ताकि एक्स और वाई मान नियमित रूप से दूरी पर रहे।

    ए। कॉलम x, y, यील्ड के साथ इसे डेटा फ्रेम के रूप में R में पढ़ें।

    pts = read.table("file.csv",......)

    ख। डेटा फ्रेम को SpatialPointsDataFrame में sp पैकेज और कुछ इस तरह से उपयोग करें:

    library(sp)
    library(rgdal)
    coordinates(pts)=~x+y
    

    सी। अपने नियमित किमी सिस्टम को पहले यह बताकर बदलें कि यह सीआरएस क्या है, और फिर गंतव्य के लिए स्थानान्तरण।

    proj4string(pts)=CRS("+init=epsg:4326") # set it to lat-long
    pts = spTransform(pts,CRS("insert your proj4 string here"))
    

    घ। R को बताएं कि यह ग्रिडिड है:

    gridded(pts) = TRUE

    यदि आपके निर्देशांक एक अच्छे नियमित ग्रिड पर झूठ नहीं बोलते हैं तो इस समय आपको एक त्रुटि मिलेगी।

  2. अब एक रेखापुंज में बदलने के लिए रेखापुंज पैकेज का उपयोग करें और अपने सीआरएस सेट करें:

    r = raster(pts)
    projection(r) = CRS("insert your proj4 string here")
    
  3. अब एक नज़र:

    plot(r)
  4. अब इसे रेखापुंज पैकेज का उपयोग करते हुए जियोफिट फ़ाइल के रूप में लिखें:

    writeRaster(r,"pts.tif")

यह जियोफाई सभी प्रमुख जीआईएस पैकेजों में पठनीय होना चाहिए। यहाँ पर स्पष्ट अनुपलब्ध टुकड़ा बदलने के लिए प्रोज 4 स्ट्रिंग है: यह संभवतः किसी प्रकार का यूटीएम संदर्भ प्रणाली होगा। कुछ और आंकड़ों के बिना बताना मुश्किल ...


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

यह एक UTM प्रणाली होने के बहुत करीब है, लेकिन मैंने जिन लोगों की कोशिश की है उनमें से कोई भी R को ग्रिड करने के लिए नियमित ग्रिड के करीब पर्याप्त नहीं है। मैं आर के पूरे एप्सग डेटाबेस के माध्यम से लूप को आधा लुभाता हूं ....
Spacedman

यदि आप इस तरह से प्रक्षेपण की खोज कर सकते हैं तो यह एक वास्तविक टूर डे बल होगा! कुंजी यह निर्धारित करने के लिए एक प्रभावी और कुशल मानदंड खोजने के लिए है कि ये 7,000+ अंक एक नियमित ग्रिड पर झूठ बोलने के लिए पर्याप्त हैं (क्योंकि यह संभव है कि वे किसी भी मानक प्रक्षेपण में एक आदर्श ग्रिड नहीं बना सकते हैं)। डेटाबेस के माध्यम से त्वरित रूप से चलाने के लिए, छोटी संख्या की दूरी की तुलना करने के लिए पर्याप्त होना चाहिए, जैसे कि ग्रिड के उत्तर भाग में पूर्व-पश्चिम की दूरी और दक्षिण भाग में पूर्व-पश्चिम की दूरी। कि उम्मीदवारों के विशाल बहुमत को जल्दी से खत्म करने के लिए चाहिए।
whuber

3
मैं मैथमैटिक द्वारा समर्थित सभी (डिफ़ॉल्ट) अनुमानों के माध्यम से भाग गया । 8. यह एक ऐसा प्रक्षेपण मिला, जिसमें अंक वास्तव में एक ग्रिड पर गिरने लगते हैं: अलास्का स्टेट प्लेन (1983) जोन 10! यह एक लैम्बर्ट कॉनफ़ॉर्मल कॉनिक प्रोजेक्शन है। मेरा मानना ​​है कि यह ईपीएसजी 26940 है । यदि आप इसे देशांतर -106 पर केन्द्रित करने के लिए संशोधित करते हैं, तो बिंदु एक बहुत अच्छा ग्रिड बनाते हैं।
whuber

1
अबे, क्या आपका मतलब वेब पेज पढ़ना है? यह था r = Import[ "https://ebi-forecast.igb.illinois.edu/bety/miscanthusyield.csv", "Data"];। आप data = Rest[r]; ListPlot[data[[;; , {3, 2}]]](या ListPointPlot3D[data[[;; , {3, 2, 4}]]]) के माध्यम से बाद में बिंदुओं का एक त्वरित प्लॉट प्राप्त कर सकते हैं । अस्वीकृति के लिए, मदद पर शुरू करें GeoGridPosition, फिर कुछ समझदार अनुमानों और क्रॉस-रेफरेंस का पता लगाएँ कि क्या चल रहा है :-)। BTW, @ Spacedman की व्याख्या वास्तव में प्रासंगिक है: 25 से 49 डिग्री तक मीट्रिक विकृति cos (25) / cos (49) = 1.38 के बराबर होती है; यह पर्याप्त है।
whuber

29

चूंकि प्रश्न का अंतिम उत्तर दिया गया था, रैस्टर पैकेज के rasterFromXYZफ़ंक्शन का उपयोग करके एक बहुत आसान समाधान मौजूद है जो आवश्यक सभी चरणों को सम्मिलित करता है (सीआरएस स्ट्रिंग के विनिर्देश सहित)।

library(raster)
rasterFromXYZ(mydata)

1
अथक @Spacedman के लिए क्षमा याचना, जिन्होंने मुझे अक्सर सहायता की है, लेकिन मुझे लगता है कि यह जवाब जिंजर ग्रीन टिक विरासत में मिला है।
१२:०४ पर जियोथैरी

@geotheory मैं इस जवाब का चयन करेगा, यह एक महान कार्य है, लेकिन यह मेरे द्वारा उपयोग किए जा रहे डेटासेट पर बहुत धीमा लगता है (सेशन में जुड़ा हुआ है)
अबे

1
... वास्तव में यह घुट गया क्योंकि इसने मेरी ~ 400KB फ़ाइल ले ली थी और इसमें एक फाइल बनाई /tmp/थी ~ ~ 19GB जब मैं डिस्क स्थान से बाहर चला गया था।
अबे

वहाँ कहीं न कहीं एक n- चुकता प्रक्रिया है। आप एक व्यापक ग्रिड द्वारा अंक डेटा को समूहित करने में सक्षम हो सकते हैं, प्रत्येक समूह को व्यक्तिगत रूप से फिर merge()से व्यवस्थित करें और फिर परिणाम एक साथ।
भूगर्भगत

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