Raster in R neu projizieren: gibt eine Warnung aus, dass projizierte Punkte nicht endlich sind?

8

1. Frage

Ich habe eine Warnung mit der Funktion projectRaster () im Rasterpaket in R festgestellt. Ein vollständig reproduzierbares Beispiel wird unten eingefügt.

   Warning message:
   In rgdal::rawTransform(projto_int, projfrom, nrow(xy), xy[, 1],  :
   33940 projected point(s) not finite

Meine Frage ist: Ist diese Warnung ein Problem, das ich beheben muss, wenn ich an terrestrischen Daten arbeite? Mit anderen Worten sind Daten "verloren". Dies wäre ein großes Problem für mich, wenn es so ist. Wenn dies der Fall ist, wissen Sie, ob ich es auf irgendeine Weise beheben kann?

Ich habe online nach einer Lösung für dieses Problem gesucht und hier , hier und hier eine Erwähnung gefunden , aber ich denke, keine bietet eine geeignete Antwort auf dieses Problem.

2. Laden Sie die Rasterbibliothek

  library(raster)

3. Erstellen Sie zunächst eine (lange lat) Weltkarte mit einer Konstanten in jeder Gitterzelle

Ich füge in jede Gitterzelle eine Konstante ein, um zu sehen, ob ich das Problem diagnostizieren kann, wo die Warnung die Daten wahrscheinlich beeinflusst, wenn überhaupt.

 rastertest.longlat<-raster(ncol=360, nrow=180)
 values(rastertest.longlat)<-c(rep(1,n=180*360))

4. Wenn Sie die Karte (Long Lat) auf ein Raster mit gleicher Fläche projizieren, wird die Warnmeldung ausgegeben

   rastertest.eck4<-projectRaster(rastertest.longlat, res=c(100000,100000), crs="+proj=eck4",method="ngb", over=T)

Warning message:
 In rgdal::rawTransform(projto_int, projfrom, nrow(xy), xy[, 1],  :
33940 projected point(s) not finite

Ich denke, diese Nachricht besagt im Grunde, dass die Neuprojektion für einige der Gitterzellen fehlgeschlagen ist.

5. Wenn Sie jedoch die beiden Karten zeichnen, sieht es nicht so aus, als würde diese Warnung Probleme für die Daten verursachen

Das heißt, Sie sehen keine weißen Lücken in den aufgezeichneten Daten. Ich vermute, dass die verlorenen Zellen nicht-terrestrische Zellen sind, an der Spitze und am Rande der Welt. Irgendwelche Ideen?

par(mfrow=c(2,1))

plot(rastertest.longlat, col="blue")
data(wrld_simpl)
wrld <- spTransform(wrld_simpl, CRS('+proj=longlat'))
plot(wrld, add=TRUE)

plot(rastertest.eck4, col="blue") 
wrld <- spTransform(wrld_simpl, CRS('+proj=eck4'))
plot(wrld, add=TRUE)

Geben Sie hier die Bildbeschreibung ein

Mike
quelle

Antworten:

8

Kurze Antwort: Es ist in Ordnung, und Sie können sich dafür bedanken raster, dass Sie statt eines Fehlers zur Fertigstellung übergegangen sind und Sie wissen lassen, dass einige Daten verloren gegangen sind.

Lange Antwort:

es wird von der Projektion abhängen, und in diesem Fall ist es wahrscheinlich nur an den "Kanten". Was der Rand ist und wie er sich für eine bestimmte Instanz einer bestimmten Projektionsfamilie manifestiert, ist der "abhängige" Teil.

Sie können sehen, dass nicht die Mittelpunkte der Zellen verloren gehen:

tpoints <- rgdal::project(coordinates(rastertest.longlat), "+proj=eck4")
sum(is.na(tpoints))
#[1] 0

Aber es sind wahrscheinlich die Ecken und möglicherweise die Kanten einer Zelle. Dies zeigt vielleicht, dass Rasterprojekte auf der Ausdehnung der Zellen basieren, nicht nur auf ihren Mittelpunkten.

 rgdal::project(as.matrix(expand.grid(x = c(-180, 0, 180), y = c(-90,0, 90))), "+proj=eck4")

Ich gebe zu, ich habe erwartet, dass die fehlenden Werte dort liegen, also projectRastererstreckt es sich vielleicht etwas weiter nach Norden und Süden? Wenn Sie dort Werte für den Breitengrad außerhalb des Bereichs von -90 / 90 einstellen, wird die Warnung angezeigt. Ich werde nachgehen, wenn ich die Gelegenheit habe, mehr zu entdecken.

Schließlich sollten Sie wahrscheinlich einen expliziten Ellipsoid- oder Bezugsparameter verwenden, dh "+ proj = eck4 + ellps = WGS84".

mdsumner
quelle
Vielen Dank! Ich habe gerade die Ausdehnung des ursprünglichen Rasters auf weniger / mehr als +/- 70 Grad zurückgesetzt: rastertest.longlat <- Raster (ncol = 4320, nrow = 2160, xmn = -180, xmx = 180, ymn = -70 , ymx = 70) und dann neu projiziert mit: rastertest.eck4 <-projectRaster (rastertest.longlat, res = c (100000, 100000), crs = "+ proj = eck4, method =" ngb ", over = T) Die Warnung verschwindet vollständig, daher denke ich, dass alle fehlenden Werte bei +/- ~ 70 Grad auftreten müssen.
Mike
@mike Es tut mir leid, aber dies ist keine akzeptable Lösung. Der Verlust von Daten und Informationen ist keine Lösung. Qgis und Arcgis können diesen Vorgang problemlos ausführen. Es muss ein Problem mit projectRaster vorliegen. Ich hoffe, der Entwickler kann
mitmachen
(-‸ლ) Ich begrüße Sie, um genau zu demonstrieren, was QGIS und Arc in diesem Fall tun. Spekulieren ist nicht wirklich hilfreich. Wir haben Zugriff auf genau das , was hier in R vor sich geht, es gibt kein wirkliches Problem.
Mdsumner
5

Dies ist keine vollständige Antwort auf meine ursprüngliche Frage in Bezug auf alle wichtigen Details, aber sie bietet dem interessierten Leser einen Ort, an den er gehen kann.

Im Allgemeinen gehen Daten verloren und werden bei der Neuprojektion von Rastern von Longlat- auf gleichflächige Projektionen verzerrt. Dies kann für die globale Analyse problematisch sein. Wenn Sie Ihre Daten im Vektorformat erhalten können, ist es besser, stattdessen mit diesem Format neu zu projizieren.

Hier ist eine Referenz zum allgemeinen Problem. Und hier noch eine zum Versuch, den Verlust zu quantifizieren. Ich hoffe, das hilft.

Mike
quelle