गदलवार और प्रोजेक्टरस्टर के बीच अंतर


9

मैं एक रेखापुंज परियोजना की कोशिश कर रहा हूँ। आर में projectRaster()यह करने के लिए समारोह है (एक पूरी तरह से प्रतिलिपि प्रस्तुत करने योग्य उदाहरण के नीचे):

# example Raster
require(raster)
r <- raster(xmn=-110, xmx=-90, ymn=40, ymx=60, ncols=40, nrows=40)
r <- setValues(r, 1:ncell(r))
projection(r)
# project to
newproj <- "+init=epsg:4714"


# using raster package to reproject
pr1 <- projectRaster(r, crs = CRS(newproj), method = 'bilinear')

जो ठीक काम करता है। हालाँकि यह काफी धीमा है।

गति बढ़ाने के लिए हालांकि मैं gdalwarpइसके बजाय उपयोग करना चाहता हूं (एक एसएसडी के साथ / डिस्क / आर से पढ़ने और लिखने की लागत बहुत अधिक नहीं है)।

हालाँकि, मैं projectRaster()उपयोग के परिणामों को पुन: पेश नहीं कर सकता gdalwarp:

# using gdalwarp to reproject
tf <- tempfile(fileext = '.tif')
tf2 <- tempfile(fileext = '.tif')
writeRaster(r, tf)
system(command = paste(paste0("gdalwarp -t_srs \'", newproj, "\' -r bilinear -overwrite"), 
                       tf,
                       tf2))
pr2 <- raster(tf2)

यह काम करने लगता है, हालांकि परिणाम अलग हैं:

# Info
system(command = paste("gdalinfo", 
                       tf))
system(command = paste("gdalinfo", 
                       tf2))

# plots
plot(r)
plot(pr1)
plot(pr2)

#extents
extent(r)
extent(pr1)
extent(pr2)

# PROJ4
proj4string(r)
proj4string(pr1)
proj4string(pr2)

# extract value
take <- SpatialPoints(matrix(c(-100, 50), byrow = T, ncol = 2), proj4string = CRS(newproj))
plot(take, add = TRUE)
extract(pr1, take)
extract(pr2, take)

मुझे क्या याद आ रहा है / गलत कर रहा है?

क्या अन्य (तेज) विकल्प हैं projectRaster()?


कोई नहीं? मैंने एक पूरी तरह से प्रतिलिपि प्रस्तुत करने योग्य उदाहरण (लिनक्स या मैक के साथ काम करना चाहिए) की आपूर्ति की ...
ईडी

आप क्या उम्मीद कर रहे हैं क्या दोनों विकल्प समान proj.4 का उपयोग करते हैं?

मुझे उम्मीद है कि दोनों विधियाँ एक ही पुन: प्रक्षेपित रेखापुंज, समान सीमा और समान मान (-100, 50) प्राप्त करती हैं। हालाँकि, वे स्पष्ट रूप से नहीं :(
ईडी

1
दो कार्यक्रमों पर ताना देने के लिए अलग ग्रिड बना रहे हैं। बिलिनियर सैंपलिंग बिलकुल एक जैसी होने पर भी, जिन बिंदुओं को आपस में जोड़ा जा रहा है, वे अलग-अलग जगहों पर हैं, और आपके पास अलग-अलग उत्तर होंगे। मूल और पिक्सेल आकार अलग हैं। R संस्करण को पुन: प्रयास करने और पुन: उत्पन्न करने के लिए आप कुछ फ्लैग को gwarwarp (-te, -tr, आदि) में सेट कर सकते हैं और फिर पिक्सेल मानों की तुलना करके देख सकते हैं कि वे कितने अलग हैं।

मैंने कई अवसरों पर पाया कि जीसीपी का उपयोग किए बिना भी -orderध्वज ("युद्ध के लिए उपयोग किए जाने वाले बहुपद का क्रम") gdalwarpका उपयोग करके अधिक सटीक परिणाम उत्पन्न हुए।
क्रिस्टोफ

जवाबों:


10

अच्छा और प्रतिलिपि प्रस्तुत करने योग्य प्रश्न। व्यक्तिगत रूप से, मुझे उम्मीद है कि अंतर का कारण बिलिनियर रिप्रोडक्शन के कार्यान्वयन में है। आप स्पष्ट रूप से दो दृष्टिकोणों के लिए स्रोत कोड देख सकते हैं, लेकिन मुझे उम्मीद है कि यह एक विशाल ओवरकिल होगा।
ऐसा प्रतीत होता है कि R कार्यान्वयन कच्चे GDAL संस्करण की तुलना में बड़े "त्रुटियों" / "परिवर्तन" का परिचय देता है (मेरे संस्करणों और परीक्षणों में कम से कम - ProjectRaster + -0.01 के आसपास परिवर्तन प्रस्तुत करता है जबकि GDAL + -0.002 के आसपास मान देता है)।

यदि आप किसी नजदीकी पड़ोसी प्रतिवाद का उपयोग करते हुए दोनों दृष्टिकोणों की तुलना करते हैं तो वे अपेक्षित रूप से मेल खाते हैं।


प्रक्षेपण के तरीकों के साथ इस संकेत के लिए धन्यवाद! अगर मुझे समय मिलता है तो मैं उन पर गहराई से नज़र डालूँगा (हालाँकि, मैं R से C से अधिक परिचित हूँ)।
ईडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.