Como reprojetar rasterização de 0 360 a -180 180 com o corte de 180 meridianos

31

Eu tenho uma imagem raster geotiff que possui um sistema de coordenadas com longitudes de 0 a 360. O centro horizontal da imagem é 180 longitude. Veja a imagem abaixo:

insira a descrição da imagem aqui

Quero transformá-lo em EPSG: 4326 SRS com -180 180 de longitude. E eu quero que o centro da imagem esteja no meridiano de Greenwich (0). Eu acho que esse srs é muito usado. Espero que o resultado fique assim:

insira a descrição da imagem aqui

Então, eu uso um comando gdalwarp para reprojetar:

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

Mas só recebo um tiff com dimensões maiores (mais pixels) e metadados EPSG: 4326. A imagem em si parece a mesma, como a inicial. Mas espero que troque os hemisférios.

A questão é: como faço para que uma imagem seja estritamente -180 180 EPSG: 4326 com o centro em 0 longitude?

Este é gdalinfo do meu arquivo inicial:

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)

Este é gdalinfo apó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
fonte
Sobre a resolução diferente, você tentou adicionar a -tr xres yresbandeira?
Nickv #

Respostas:

21

Você pode definir explicitamente o intervalo de coordenadas de saída usando a opção de extensão de destino como gdalwarp (por exemplo, "-te -180 -90 180 90"), mas também pode usar a opção de configuração CENTER_LONG para forçar o rebrulho em torno de uma nova longitude central. Algo assim:

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

Observe também a opção de distorção "SOURCE_EXTRA = 1000". Ao re-embalar, o cálculo do retângulo de origem fica confuso com a interrupção da longitude e perde algumas imagens. Esta opção diz extrair alguns extras. Sem ele, você verá uma lacuna de dados perto do meridiano principal.

PS. definir um meridiano de 180dW como você fez não é uma boa ideia IMHO.

Frank Warmerdam
fonte
1
hmm, --config CENTER_LONG 0não faz nada, o resultado é o mesmo raster. Algo que sinto falta aqui? Rodando no GDAL versão 2.2.3.
jurajb 8/07
6

Basicamente, você precisa cortar a varredura em duas partes e juntá-las novamente com um novo deslocamento / escala.

Há um exemplo aqui de como fazer isso de [-180.180] a [0,360] com gdal_translate e o driver VRT: http://trac.osgeo.org/gdal/wiki/UserDocs/RasterProcTutorial

Digitalize para baixo até o "tutorial de 5 min" e os detalhes estão em "Arquivos virtuais". Deve ser simples o suficiente para modificar o exemplo para se adequar.

mdsumner
fonte
2

Isso pode ser feito em R com uma linha de código usando a rotatefunção com o rasterpacote

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

Se você quiser apenas visualizar a varredura no QGIS, poderá definir uma projeção personalizada com o parâmetro + lon_wrap = 180.

Meu entendimento disso é que, por padrão, o proj4 agrupa latitudes de 0 -> 360 a -180 -> 180. + lon_wrap = 180 efetivamente cancelará esse agrupamento e exibirá latitudes entre 180 e 360 ​​no hemisfério ocidental.

A opção + over deve desativar completamente o agrupamento, mas - pelo menos no meu caso - a varredura não foi exibida corretamente quando essa opção foi usada.

Consulte http://proj4.org/parameters.html#lon-wrap-over-longitude-wrapping para obter mais informações.


fonte
0

Aqui está uma função que eu criei para reprojetar uma única matriz fraca de valores de grade usando javascript de 0-360 a -180-180. Espero que ajude alguém.

  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
fonte