So projizieren Sie ein Raster von 0 360 auf -180 180 mit einem Schnitt von 180 Meridian

31

Ich habe ein Geotiff-Rasterbild mit einem Koordinatensystem mit Längen von 0 bis 360. Die horizontale Bildmitte beträgt 180 Längen. Siehe Bild unten:

Bildbeschreibung hier eingeben

Ich möchte es in EPSG umwandeln: 4326 SRS mit -180 180 Längenbereich. Und ich möchte, dass die Bildmitte auf dem Greenwich-Meridian (0) liegt. Ich denke, diese srs ist sehr weit verbreitet. Ich erwarte, dass das Ergebnis so aussieht:

Bildbeschreibung hier eingeben

Daher verwende ich einen gdalwarp-Befehl, um Folgendes neu zu projizieren:

gdalwarp -s_srs '+proj=latlong +datum=WGS84 +pm=180dW' -t_srs EPSG:4326 test_col.tif test_4326.tif

Aber ich bekomme nur einen TIFF mit größeren Dimensionen (mehr Pixel) und EPSG: 4326-Metadaten. Das Bild selbst sieht genauso aus wie das ursprüngliche. Aber ich erwarte, dass es die Hemisphären vertauscht.

Die Frage ist - wie kann ich ein Bild so formatieren, dass es genau -180 180 EPSG: 4326 ist, wobei sich die Mitte in der Länge 0 befindet?

Dies ist gdalinfo meiner ursprünglichen Datei:

Origin = (-0.102272598067084,89.946211604095552)
Pixel Size = (0.204545196134167,-0.204423208191126)
Metadata:
  AREA_OR_POINT=Area
Image Structure Metadata:
  INTERLEAVE=BAND
Corner Coordinates:
Upper Left  (  -0.1022726,  89.9462116) (  0d 6' 8.18"W, 89d56'46.36"N)
Lower Left  (  -0.1022726, -89.9462116) (  0d 6' 8.18"W, 89d56'46.36"S)
Upper Right (     359.897,      89.946) (359d53'50.18"E, 89d56'46.36"N)
Lower Right (     359.897,     -89.946) (359d53'50.18"E, 89d56'46.36"S)
Center      ( 179.8975000,  -0.0000000) (179d53'51.00"E,  0d 0' 0.00"S)

Dies ist gdalinfo nach gdalwarp

Origin = (-180.102727401932952,89.946211604095552)
Pixel Size = (0.091397622896436,-0.091420837939082)
Metadata:
  AREA_OR_POINT=Area
Image Structure Metadata:
  INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  (-180.1027274,  89.9462116) (180d 6' 9.82"W, 89d56'46.36"N)
Lower Left  (-180.1027274, -89.9699975) (180d 6' 9.82"W, 89d58'11.99"S)
Upper Right ( 179.8211116,  89.9462116) (179d49'16.00"E, 89d56'46.36"N)
Lower Right ( 179.8211116, -89.9699975) (179d49'16.00"E, 89d58'11.99"S)
Center      (  -0.1408079,  -0.0118929) (  0d 8'26.91"W,  0d 0'42.81"S)
nextstopsun
quelle
Haben Sie in Bezug auf die unterschiedliche Auflösung versucht, die -tr xres yresFlagge hinzuzufügen ?
nickves

Antworten:

21

Sie können den Ausgabekoordinatenbereich explizit mit der Option target extend auf gdalwarp setzen (dh "-te -180 -90 180 90"), aber Sie können auch die Konfigurationsoption CENTER_LONG verwenden, um das Umbrechen um einen neuen zentralen Längengrad zu erzwingen. Etwas wie das:

  gdalwarp -t_srs WGS84 ~/0_360.tif 180.tif  -wo SOURCE_EXTRA=1000 \
           --config CENTER_LONG 0

Beachten Sie auch die Warp-Option "SOURCE_EXTRA = 1000". Beim erneuten Verpacken wird die Berechnung des Quellrechtecks ​​durch die Längengradunterbrechung verwirrt und es gehen einige Bilder verloren. Diese Option gibt an, etwas mehr einzuziehen. Ohne sie sehen Sie eine Datenlücke in der Nähe des Nullmeridians.

PS. Es ist meiner Meinung nach keine gute Idee, einen Nullmeridian von 180dW einzustellen, wie Sie es getan haben.

Frank Warmerdam
quelle
1
hmm, --config CENTER_LONG 0macht nix, das ergebnis ist das selbe raster. Was vermisse ich hier? Laufen auf GDAL Version 2.2.3.
Jura
6

Grundsätzlich müssen Sie das Raster in zwei Teile schneiden und diese mit einem neuen Versatz / Maßstab wieder zusammensetzen.

Hier finden Sie ein Beispiel dafür, wie Sie dies mit gdal_translate und dem VRT-Treiber von [-180,180] bis [0,360] tun können: http://trac.osgeo.org/gdal/wiki/UserDocs/RasterProcTutorial

Scannen Sie zum "5 min Tutorial" und die Details finden Sie unter "Virtuelle Dateien". Es sollte einfach genug sein, das Beispiel entsprechend zu modifizieren.

mdsumner
quelle
2

Dies kann in R mit einer Codezeile erfolgen, indem die rotateFunktion mit dem rasterPaket verwendet wird.

library(raster)
your_raster <- raster("path/to/raster.tif")
rotated_raster <- rotate(your_raster)
SoilSciGuy
quelle
1

Wenn Sie das Raster nur in QGIS anzeigen möchten, können Sie eine benutzerdefinierte Projektion mit dem Parameter + lon_wrap = 180 festlegen.

Ich verstehe dies so, dass proj4 standardmäßig Breiten von 0 -> 360 bis -180 -> 180 umschließt. + Lon_wrap = 180 hebt diese Umschließung effektiv auf und zeigt Breiten zwischen 180 und 360 in der westlichen Hemisphäre an.

Die Option + over sollte den Umbruch insgesamt deaktivieren, aber - zumindest in meinem Fall - das Raster wurde bei Verwendung dieser Option nicht richtig angezeigt.

Weitere Informationen finden Sie unter http://proj4.org/parameters.html#lon-wrap-over-longitude-wrapping .


quelle
0

Hier ist eine Funktion, die ich erstellt habe, um ein einzelnes dim-Array von Rasterwerten mit Javascript von 0-360 bis -180-180 neu zu projizieren. Ich hoffe, es kann jemandem helfen.

  let xstart = 180 / xres //xres is the number of values per 1 degree
  for (let y = 0; y < data.height; y++) {
    let index = (y * data.width) + 1,
    start = index + xstart,
    end = index + data.width
    array.splice(index, 0, ...array.splice(start, (end - start)))
  }
maeneak
quelle