Comment reprojeter un raster de 0 360 à -180 180 avec une coupe de 180 méridiens

31

J'ai une image raster géotiff qui a un système de coordonnées avec des longitudes de 0 à 360. Le centre horizontal de l'image est 180 longtitude. Voir l'image ci-dessous:

entrez la description de l'image ici

Je veux le transformer en EPSG: 4326 SRS avec une plage de -180 180 longtitude. Et je veux que le centre de l'image soit au méridien de Greenwich (0). Je suppose que ce srs est très largement utilisé. Je m'attends à ce que le résultat ressemble à ceci:

entrez la description de l'image ici

J'utilise donc une commande gdalwarp pour reprojeter:

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

Mais je ne reçois qu'un tiff avec de plus grandes dimensions (plus de pixels) et des métadonnées EPSG: 4326. L'image elle-même a la même apparence que l'image initiale. Mais je m'attends à ce qu'il permute les hémisphères.

La question est - comment puis-je déformer une image pour qu'elle soit strictement -180 180 EPSG: 4326 avec le centre en 0 longtitude?

Voici gdalinfo de mon fichier initial:

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)

Ceci est gdalinfo après 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
la source
À propos des différentes résolutions, avez-vous essayé d'ajouter le -tr xres yresdrapeau?
nickves

Réponses:

21

Vous pouvez définir explicitement la plage de coordonnées de sortie à l'aide de l'option d'étendue cible sur gdalwarp (c'est-à-dire "-te -180 -90 180 90"), mais vous pouvez également utiliser l'option de configuration CENTER_LONG pour forcer le reconditionnement autour d'une nouvelle longitude centrale. Quelque chose comme ça:

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

Notez également l'option de déformation "SOURCE_EXTRA = 1000". Lors du reconditionnement, le calcul du rectangle source se confondra autour de l'interruption de la longitude et perdra des images. Cette option dit tirer un peu plus. Sans cela, vous verrez un écart de données près du méridien principal.

PS définir un méridien principal de 180dW comme vous l'avez fait n'est pas une bonne idée à mon humble avis.

Frank Warmerdam
la source
1
hmm, --config CENTER_LONG 0ne fait rien, le résultat est le même raster. Quelque chose me manque ici? Fonctionnant sur GDAL version 2.2.3.
jurajb
6

Fondamentalement, vous devez couper le raster en deux parties et les reconstituer avec un nouveau décalage / échelle.

Il y a un exemple ici de la façon de faire de [-180,180] à [0,360] avec gdal_translate et le pilote VRT: http://trac.osgeo.org/gdal/wiki/UserDocs/RasterProcTutorial

Parcourez le «didacticiel de 5 minutes» et les détails se trouvent sous «Fichiers virtuels». Il devrait être assez simple de modifier l'exemple pour l'adapter.

mdsumner
la source
2

Cela peut être fait en R avec une ligne de code en utilisant la rotatefonction avec le rasterpackage.

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

Si vous souhaitez simplement afficher le raster dans QGIS, vous pouvez définir une projection personnalisée avec le paramètre + lon_wrap = 180.

Ma compréhension de cela est que, par défaut, proj4 enveloppe les latitudes de 0 -> 360 à -180 -> 180. + lon_wrap = 180 annulera efficacement cet habillage et affichera les latitudes entre 180 et 360 dans l'hémisphère occidental.

L'option + over devrait désactiver complètement le wrapping, mais - au moins dans mon cas - le raster ne s'affichait pas correctement lorsque cette option était utilisée.

Voir http://proj4.org/parameters.html#lon-wrap-over-longitude-wrapping pour plus d'informations.


la source
0

Voici une fonction que j'ai construite pour reprojeter un seul tableau de valeurs de grille à l'aide de javascript de 0-360 à -180-180. J'espère que cela peut être utile à quelqu'un.

  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
la source