Come riproiettare raster da 0 360 a -180 180 con il taglio di 180 meridiani


31

Ho un'immagine raster geotiff che ha un sistema di coordinate con lunghezze da 0 a 360. Il centro orizzontale dell'immagine è di 180 longitudini. Vedi l'immagine qui sotto:

inserisci qui la descrizione dell'immagine

Voglio trasformarlo in EPSG: 4326 SRS con intervallo di longitudine -180 180. E voglio che il centro dell'immagine sia al meridiano di Greenwich (0). Immagino che questo srs sia molto usato. Mi aspetto che il risultato sia simile al seguente:

inserisci qui la descrizione dell'immagine

Quindi uso un comando gdalwarp per riproiettare:

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

Ma ottengo solo un tiff con dimensioni maggiori (più pixel) ed EPSG: 4326 metadati. L'immagine stessa ha lo stesso aspetto di quella iniziale. Ma mi aspetto che cambi gli emisferi.

La domanda è: come posso rendere l'immagine più rigorosamente -180 180 EPSG: 4326 con il centro in 0 longitudine?

Questo è gdalinfo del mio file iniziale:

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)

Questo è gdalinfo dopo 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)

A proposito della diversa risoluzione, hai provato ad aggiungere il -tr xres yresflag?
Nickves,

Risposte:


21

È possibile impostare in modo esplicito l'intervallo di coordinate di output utilizzando l'opzione di estensione target su gdalwarp (ovvero "-te -180 -90 180 90"), ma è anche possibile utilizzare l'opzione di configurazione CENTER_LONG per forzare il riavvolgimento attorno a una nuova longitudine centrale. Qualcosa come questo:

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

Notare anche l'opzione di curvatura "SOURCE_EXTRA = 1000". Quando esegui il riavvolgimento, il calcolo del rettangolo di origine si confonderà con l'interruzione della longitudine e perderà alcune immagini. Questa opzione dice aggiungere qualche extra. Senza di essa vedrai un gap di dati vicino al meridiano principale.

PS. impostare un meridiano primo di 180dW come hai fatto non è una buona idea IMHO.


1
hmm, --config CENTER_LONG 0non fa nulla, il risultato è lo stesso raster. Qualcosa che mi manca qui? In esecuzione su GDAL versione 2.2.3.
jurajb

6

Fondamentalmente è necessario tagliare il raster in due parti e rimetterle insieme con un nuovo offset / scala.

Ecco un esempio di come farlo da [-180.180] a [0,360] con gdal_translate e il driver VRT: http://trac.osgeo.org/gdal/wiki/UserDocs/RasterProcTutorial

Scorri verso il basso fino al "tutorial di 5 minuti" e i dettagli si trovano in "File virtuali". Dovrebbe essere abbastanza semplice modificare l'esempio per adattarlo.


2

Questo può essere fatto in R con una riga di codice usando la rotatefunzione con il rasterpacchetto.

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

1

Se vuoi solo visualizzare il raster in QGIS, puoi impostare una proiezione personalizzata con il parametro + lon_wrap = 180.

La mia comprensione di questo è che, per impostazione predefinita, proj4 avvolge le latitudini da 0 -> 360 a -180 -> 180. + lon_wrap = 180 annullerà effettivamente questo avvolgimento e visualizzerà latitudini tra 180 e 360 ​​nell'emisfero occidentale.

L'opzione + over dovrebbe disabilitare del tutto il wrapping, ma - almeno nel mio caso - il raster non è stato visualizzato correttamente quando è stata utilizzata quell'opzione.

Vedi http://proj4.org/parameters.html#lon-wrap-over-longitude-wrapping per maggiori informazioni.


0

Ecco una funzione che ho creato per riproiettare un singolo array fioco di valori di griglia usando JavaScript da 0-360 a -180-180. Spero possa essere di aiuto a qualcuno.

  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)))
  }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.