sp :: proj4string PROJ6 çerçevesinde eşdeğeri?
R uzaysal paketlerinin (ve bu konuda gdal) (görece) son sürümlerinde PROJ4'ten PROJ6'ya geçiş konusunda kafam karıştı . Ben kullanmayı kullanılan sp::proj4string()bir gelen projeksiyon kodu / CRS argüman almak için spnesne ve script'lerime ayrıca bu kodu kullanın. Şimdi bir uyarı alıyorum (bu da bana projeksiyonumun yanlış olabileceğini söylüyor ). Belli ki yanlış bir şey yapıyorum. Projeksiyon kodunu uyarı olmadan almak için hangi işlevi kullanmalıyım? Bu düzeyde bir basitlik mümkün olsaydı şahsen EPSG kodunu tercih ederdim ...
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 tarihinde reprex paketi tarafından oluşturuldu (v0.3.0)
Ayrıca bu sorudaki referanslara ve yorumlara bakın
Yanıtlar
Ayrıca geçen yıl FOSS4G'de yapılan bir konuşmanın bu videosunu izleyene kadar PROJ Strings'den uzaklaşma ve bunun yerine ne kullanacağım konusunda kafam oldukça karışıktı .
İşte ana çıkarımlarım:
PROJ ve GDAL neden PROJ dizilerinden uzaklaşıyor?
PROJ4 ile her dönüşüm "merkez yaklaşımı" kullanılarak yapılır. Yani her şey önce WGS84'e dönüştürülecek ve ancak daha sonra hedef projeksiyona dönüştürülecektir.
Bu yaklaşım, dönüşüm sürecinde iki projeksiyon arasındaki doğrudan dönüşümden daha büyük hatalara yol açabilir. En kötü durumda, gerekli dönüşüm bu yaklaşımla bile mümkün değildir. PROJ dizileri belirsiz olabileceğinden, doğrudan dönüşümler genellikle mümkün değildir.
Konuşmadan bir örnek:
Eski Avustralya verisi GDA94 ve yeni GDA2020, WGS84'e dayanmaktadır. Ancak biri Epoch 2020.0'da ITRF2014 referans çerçevesi ve Epoch 1994.0'da ITRF92 referans çerçevesi kullanılıyor. Bu farklılıklar bir PROJ dizisinde (anladığım kadarıyla) yakalanamaz ve bu nedenle tüm projeksiyonlar WGS84 ile neredeyse aynı PROJ Dizgesine sahiptir. İkisi arasında merkez yaklaşımı ile dönüşüm koordinatlarda hiçbir değişikliğe yol açmayacaktır. Aslında Avustralya, 1994 ile 2020 arasında 1,8 metre hareket etmiş olsa da, veri dönüşümü bunu yansıtmalıdır.
Doğrudan bir dönüşümle bunun gibi hatalar olmazdı.
Bunun yerine ne kullanmalısın
Bunun yerine ideal olarak EPSG Kodları gibi projeksiyonlar veya WKT2 Biçimindeki tanımlar için belirsiz olmayan tanımlar kullanmalısınız.
Bununla birlikte, veri dönüşümleri yapmak istemiyorsanız (veya birkaç metre veya daha fazla yanlışlığı umursamıyorsanız) yine de PROJ-Strings'i kullanabilirsiniz, ancak en iyi uygulamanın EPSG Kodlarını veya WKT2'yi kullanmak olduğunu unutmayın.
Bu sp'de nasıl uygulanır?
CRS-sp'deki nesneler artık commentCRS'nin WKT2 gösteriminin kaydedildiği ek bir alana sahiptir.
Dolayısıyla, en iyi uygulama iş akışı spşu anda şuna benzer ( buradan biraz alınmıştır ve genişletilmiştir ):
# 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)
Sonuç olarak, sfcr'lere erişmek ve işlemek için olduğundan çok daha kullanışlı işlevlere sahiptir sp. sfYukarıda verilen bağlantıdan nasıl işlediği hakkında daha fazla bilgi edinebilirsiniz .
Proj4strings aşamalı olarak kaldırılıyor. Sf paketi ve geliştiricileri sayesinde bir proj4string'i WKT formatına dönüştürmek için basit bir numara var.
Sadece rgdal'dan gelen datum uyarılarını görmezden gelin ve aslında, sıkıcı hale geldikleri için onları kapatabilirsiniz. Ya options("rgdal_show_exportToProj4_warnings"="none")Rprofile.site dosyanıza ekleyin ya da herhangi bir kitaplık eklemeden önce yayınlayın.
Örneğin, coğrafi WGS84 projeksiyonunda kullanılması 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]]]]
Gönderen R-uzamsal blog R mekansal GDAL PROJ gelişme aşağıdaki sf geliştiriciler devlet:
PROJ4 dizgelerinin (+ proj = longlat + datum = WGS84 gibi) kullanılması önerilmez, artık koordinat referans sistemleri için yeterli açıklama sunmuyorlar; + init = epsg: XXXX kullanımı uyarılara yol açar
Bu uyarı çıktınızı hiç etkilemez. Diğerlerinin önerdiği gibi, sf paketi daha temiz ve basit EPSG kodlaması için yararlı olabilir. İşte kodunuz uyarlanmıştır:
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)