Как перепроецировать растр от 0 360 до -180 180 с обрезкой 180 меридианов

31

У меня есть растровое изображение геотифа, которое имеет систему координат с долготой от 0 до 360. Горизонтальный центр изображения составляет 180 долготы. Смотрите изображение ниже:

введите описание изображения здесь

Я хочу преобразовать его в EPSG: 4326 SRS с дальностью -180 180. И я хочу, чтобы центр изображения был на гринвичском меридиане (0). Я предполагаю, что этот srs очень широко используется. Я ожидаю, что результат будет выглядеть так:

введите описание изображения здесь

Поэтому я использую команду gdalwarp для перепроектирования:

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

Но я получаю только tiff с большими размерами (больше пикселей) и метаданными EPSG: 4326. Само изображение выглядит так же, как и исходное. Но я ожидаю, что это поменяет полушария.

Вопрос в том, как мне сделать изображение строго -180 180 EPSG: 4326 с центром в 0 долготы?

Это gdalinfo моего исходного файла:

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)

Это gdalinfo после 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
источник
Насчет другого разрешения, вы пробовали добавить -tr xres yresфлаг?
Nickves

Ответы:

21

Вы можете явно установить диапазон выходных координат с помощью параметра целевого экстента равным gdalwarp (т. Е. "-Te -180 -90 180 90"), но вы также можете использовать параметр конфигурации CENTER_LONG, чтобы принудительно развернуть вокруг новой центральной долготы. Что-то вроде этого:

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

Обратите также внимание на опцию «SOURCE_EXTRA = 1000». При переупаковке вычисление исходного прямоугольника запутается из-за прерывания по долготе и потеряет некоторые изображения. Эта опция говорит тянуть в некоторых дополнительных. Без этого вы увидите пробел в данных рядом с основным меридианом.

PS. установка основного меридиана 180dW, как вы сделали, не очень хорошая идея, имхо.

Фрэнк Вармердам
источник
1
хм, --config CENTER_LONG 0ничего не делает, результат тот же растр. Что-то я здесь скучаю? Работает на GDAL версии 2.2.3.
Юрайб
6

В основном вам нужно разрезать растр на две части и соединить их вместе с новым смещением / масштабом.

Вот пример того, как сделать это от [-180,180] до [0,360] с помощью gdal_translate и драйвера VRT: http://trac.osgeo.org/gdal/wiki/UserDocs/RasterProcTutorial

Сканирование до «5-минутного учебника» и детали находятся в разделе «Виртуальные файлы». Это должно быть достаточно просто, чтобы изменить пример, чтобы удовлетворить.

mdsumner
источник
2

Это можно сделать в R с помощью одной строки кода, используя rotateфункцию с rasterпакетом.

library(raster)
your_raster <- raster("path/to/raster.tif")
rotated_raster <- rotate(your_raster)
SoilSciGuy
источник
1

Если вы просто хотите просмотреть растр в QGIS, вы можете установить собственную проекцию с параметром + lon_wrap = 180.

Насколько я понимаю, по умолчанию proj4 переносит широты от 0 -> 360 до -180 -> 180. + lon_wrap = 180 эффективно отменяет это перенос и отображает широты между 180 и 360 в западном полушарии.

Опция + over должна полностью отключить перенос, но - по крайней мере, в моем случае - растр не отображался должным образом при использовании этой опции.

См. Http://proj4.org/parameters.html#lon-wrap-over-longitude-wrapping для получения дополнительной информации.


источник
0

Вот функция, которую я построил, чтобы перепроектировать один тусклый массив значений сетки, используя javascript от 0-360 до -180-180. Я надеюсь, что это может кому-то помочь.

  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
источник