Як перепрофілювати растр від 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

Але я отримую лише тиф з більшими розмірами (більше пікселів) та метаданими EPSG: 4326. Саме зображення виглядає так само, як і початкове. Але я очікую, що він поміняє півкулі.

Питання - як я можу gdalwarp зображення бути суворо -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)

Про іншу роздільну здатність ви намагалися додати -tr xres yresпрапор?
ники

Відповіді:


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, як ви робили, - це не дуже гарна ідея IMHO.


1
хм, --config CENTER_LONG 0нічого не робить, результат той самий растровий. Що я тут сумую? Запуск у версії GDAL 2.2.3.
jurajb

6

В основному вам потрібно розрізати растр на дві частини і скласти їх назад разом з новим зміщенням / масштабом.

Тут є приклад того, як це зробити від [-180,180] до [0,360] за допомогою gdal_translate та драйвера VRT: http://trac.osgeo.org/gdal/wiki/UserDocs/RasterProcTutorial

Скануйте униз до "5-ти хвилинного підручника", а деталі - у розділі "Віртуальні файли". Він повинен бути досить простим, щоб змінити приклад на відповідний.


2

Це можна зробити в R з одним рядком коду, використовуючи rotateфункцію з rasterпакетом.

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

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)))
  }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.