प्रो :: PrJ4string PROJ6 ढांचे में बराबर?
मैं PROJ4 से PROJ6 (R) के स्थानिक पैकेज के (अपेक्षाकृत) हाल के संस्करणों में बदलाव के बारे में उलझन में हूँ (और उस मामले के लिए गदल)। मैं sp::proj4string()एक spवस्तु से प्रक्षेपण कोड / सीआरएस तर्क प्राप्त करने के लिए उपयोग करता था और अपनी स्क्रिप्ट में उस कोड का आगे उपयोग करता था। अब मुझे एक चेतावनी मिलती है (जो मुझे बताती है कि मेरा प्रक्षेपण गलत हो सकता है )। मैं स्पष्ट रूप से कुछ गलत कर रहा हूं। चेतावनी के बिना प्रक्षेपण कोड प्राप्त करने के लिए मुझे किस फ़ंक्शन का उपयोग करना चाहिए? मैं व्यक्तिगत रूप से EPSG कोड पसंद करूंगा अगर उस स्तर की सादगी संभव थी ...
library(sp)
x <- SpatialPolygons(
list(Polygons(
list(Polygon(cbind(c(1,2,3,4,1), c(3,8,10,12,3)))),
ID = 1)),
proj4string = CRS(SRS_string = "EPSG:4326"))
proj4string(x)
#> Warning in proj4string(x): CRS object has comment, which is lost in output
#> [1] "+proj=longlat +datum=WGS84 +no_defs"
2020-09-18 को रेप्रेक्स पैकेज (v0.3.0) द्वारा बनाया गया
इस प्रश्न में संदर्भ और टिप्पणियां भी देखें
जवाब
मैं PROJ स्ट्रिंग्स से दूर जाने के बारे में भी काफी उलझन में था और जब तक कि मैं FOSS4G में पिछले साल आयोजित एक वार्ता के इस वीडियो को नहीं देखता था, तब तक क्या उपयोग करना चाहिए ।
यहाँ मेरा मुख्य takeaways है:
क्यों PROJ और GDAL PROJ-strings से दूर जा रहे हैं
PROJ4 के साथ हर परिवर्तन "हब-एप्रोच" का उपयोग करके किया जाता है। तो सब कुछ पहले WGS84 में परिवर्तित हो जाएगा और उसके बाद ही लक्ष्य प्रक्षेपण में बदल जाएगा।
यह दृष्टिकोण दो अनुमानों के बीच प्रत्यक्ष परिवर्तन की तुलना में परिवर्तन प्रक्रिया में बड़ी त्रुटियों को जन्म दे सकता है। सबसे खराब स्थिति में आवश्यक परिवर्तन इस दृष्टिकोण के साथ भी संभव नहीं है। चूंकि PROJ तार अस्पष्ट हो सकते हैं, प्रत्यक्ष परिवर्तन अक्सर संभव नहीं होते हैं।
बात से एक उदाहरण:
पुराने ऑस्ट्रेलियाई डेटम GDA94 और नए GDA2020 दोनों WGS84 पर आधारित हैं। हालाँकि एक संदर्भ फ्रेम ITRF2014 का उपयोग एपोच 2020.0 पर और दूसरा ITRF92 का एपोच 1994.0 में कर रहा है। उन अंतरों को PROJ-string (जहाँ तक मुझे समझ में आया है) में कैप्चर नहीं किया जा सकता है और इस प्रकार सभी अनुमानों में WGS84 के समान लगभग समान PROJ स्ट्रिंग है। हब-एप्रोच के साथ दोनों के बीच परिवर्तित करने से निर्देशांक में कोई बदलाव नहीं होगा। जबकि वास्तव में ऑस्ट्रेलिया 1994 और 2020 के बीच 1.8 मीटर आगे बढ़ गया है और डेटा रूपांतरण को प्रतिबिंबित करना चाहिए।
प्रत्यक्ष परिवर्तन के साथ ऐसा नहीं होगा।
इसके बजाय आपको क्या उपयोग करना चाहिए
इसके बजाय आपको आदर्श रूप से ईपीएसजी कोड्स जैसे अनुमानों के लिए गैर-अस्पष्ट परिभाषाओं का उपयोग करना चाहिए या डब्ल्यूकेटी 2 प्रारूप में परिभाषाएं।
हालाँकि, यदि आप डेटम ट्रांसफ़ॉर्मेशन करने का इरादा नहीं रखते हैं (या फिर कुछ मीटर या अधिक अशुद्धि की परवाह नहीं करते हैं) तो आप अभी भी PROJ-Strings का उपयोग कर सकते हैं, लेकिन ध्यान रहे कि EPSG कोड या WKT2 का उपयोग करना सबसे अच्छा है।
इसे कैसे लागू किया जाता है
CRS-तब में एक अतिरिक्त फ़ील्ड commentजिसमें CRS के एक WKT2 प्रतिनिधित्व को सहेजा गया है।
तो spअब के साथ सबसे अच्छा अभ्यास वर्कफ़्लो इस तरह दिखता है (लिया और यहां से थोड़ा विस्तारित ):
# Define the CRS using an EPSG Code
x <- CRS(SRS_string='EPSG:4326')
# Display the stored CRS using comment()
cat(comment(x), "\n")
# Store the wkt in a variable
wkt <- comment(x)
# Use this to assign the CRS of another sp-object
y <- CRS(SRS_string = wkt)
सभी के sfलिए crs तक पहुँचने और संभालने के लिए बहुत अधिक सुविधाजनक कार्य हैं sp। sfऊपर दिए गए उसी लिंक में आप इसे कैसे हैंडल करते हैं, इसके बारे में अधिक पढ़ सकते हैं ।
Proj4strings को चरणबद्ध किया जा रहा है। एसएफ पैकेज और इसके डेवलपर्स के लिए धन्यवाद, एक सामान्य ट्रिक को डब्ल्यूकेटी प्रारूप में बदलने के लिए एक सरल चाल है।
बस rgdal से आने वाली डेटम चेतावनियों को नजरअंदाज करें और, वास्तव में, आप उन्हें बंद कर सकते हैं क्योंकि वे चिड़चिड़े हो जाते हैं। या तो options("rgdal_show_exportToProj4_warnings"="none")अपनी Rprofile.site फ़ाइल में जोड़ें या किसी भी पुस्तकालयों को जोड़ने से पहले इसे जारी करें।
भौगोलिक WGS84 प्रक्षेपण के साथ उदाहरण के लिए, का उपयोग करने sf::st_crs("+proj=longlat +datum=WGS84 +no_defs")में परिणाम होगा
Coordinate Reference System:
User input: +proj=longlat +datum=WGS84 +no_defs
wkt:
GEOGCRS["unknown",
DATUM["World Geodetic System 1984",
ELLIPSOID["WGS 84",6378137,298.257223563,
LENGTHUNIT["metre",1]],
ID["EPSG",6326]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433],
ID["EPSG",8901]],
CS[ellipsoidal,2],
AXIS["longitude",east,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433,
ID["EPSG",9122]]],
AXIS["latitude",north,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433,
ID["EPSG",9122]]]]
से आर-स्थानिक ब्लॉग आर स्थानिक इस प्रकार GDAL और PROJ विकास sf डेवलपर्स राज्य:
तथाकथित PROJ4- स्ट्रिंग्स (जैसे + proj = longlat + datum = WGS84) का उपयोग हतोत्साहित किया जाता है, वे अब समन्वित संदर्भ प्रणालियों का पर्याप्त विवरण नहीं देते हैं; + init = epsg का उपयोग: XXXX चेतावनी की ओर जाता है
यह चेतावनी आपके आउटपुट को बिल्कुल प्रभावित नहीं करती है। जैसा कि अन्य लोगों ने सुझाव दिया है, एसएफ पैकेज क्लीनर और सरल ईपीएसजी कोडिंग के लिए उपयोगी हो सकता है। यहां आपका कोड अनुकूलित है:
library(sf)
library(mapview)
coords <- list(rbind(c(1,3), c(2,8), c(3,10), c(4,12), c(1,3)))
x2 <- st_sf(st_geometry(st_polygon(x = coords)), crs="EPSG:4326")
x2$ID <- 1
mapview(x2)