如何通过切割180子午线将栅格从0 360重新投影到-180 180


31

我有一个Geotiff栅格图像,它的坐标系的纬度从0到360。图像的水平中心是180度。见下图:

在此处输入图片说明

我想将其转换为经度范围为-180 180的EPSG:4326 SRS。我希望图像的中心位于格林威治子午线(0)。我想这个SRS用途非常广泛。我希望结果看起来像这样:

在此处输入图片说明

因此,我使用gdalwarp命令重新投影:

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

但是我只会看到尺寸更大(像素更多)和EPSG:4326元数据的tiff。图像本身看起来与初始图像相同。但我希望它能交换半球。

问题是-如何将图像的经度严格调整为-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)

这是gdalwarp之后的gdalinfo

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标志?
尼克,

Answers:


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版上运行。
jurajb

6

基本上,您需要将栅格切成两部分,并用新的偏移/比例将它们重新拼合。

这里有一个示例,说明如何使用gdal_translate和VRT驱动程序从[-180,180]到[0,360]进行操作:http ://trac.osgeo.org/gdal/wiki/UserDocs/RasterProcTutorial

向下扫描至“ 5分钟教程”,详细信息位于“虚拟文件”下。修改示例以使其适合应该足够简单。


2

使用包中的rotate函数,可以使用一行代码在R中完成此操作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)))
  }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.