如何将平面图像投影到球形墨卡托EPSG:900013以在openlayers中的图像层中使用

时间:2013-09-23 13:15:41

标签: image openlayers gdal map-projections

我有一个400x400像素的平面图像,表示400x400公里的区域。我需要在OpenLayers映射系统上绘制此图像作为叠加层。我使用OpenStreetMap / Google Maps作为基础层。我想使用图像层绘制叠加图像,我想将叠加图像居中于特定的纬度/经度点。基础层的投影是EPSG:900913,实际上是OpenStreetMap和Google Maps使用的投影。

我所理解的(如果我错了请纠正我),是因为我不能使用平面的“未投影”图像作为图像层,但我必须做一些“重新投影”来调整图像符合地图投影,即EPSG:900913。在这里和网上搜索,似乎我应该使用一个名为GDAL的库/工具来做这件事,但是我完全是新手,我问你:

  • 有人可以告诉我如何使用它吗?
  • 你能否告诉我,我刚才所说的是正确的,我在这里描述的方式是否有效?
  • 我如何使用gdal将平面未投影的400x400像素图像转换为EPSG中投影的图像:900913,并且适合作为图像层作为叠加层使用?

感谢。

我按照要求添加了图片。

enter image description here

@capdragon提供的答案很有用,让我更进一步。无论如何我还有一些问题。我这样做了:

  1. 使用gdal_translate将GCP设置为图像的四个角和中心,如下所示:
  2. gdal_translate -of "GTIFF" -gcp 0 0 8.6923 45.5427 -gcp 400 0 13.8149 45.5427 -gcp 200 200 11.2536 43.771702 -gcp 0 400 8.8413 41.9460 -gcp 400 400 13.6659 41.9460 quadrprod.png quadrprod_gpc.tif

    这样我得到了一个quadrprod_gcp.tif输出。然后

    1. 使用gdalwarp应用上面设置的GCP并设置正确的投影,即EPSG:4326,如下所示:
    2. gdalwarp -t_srs EPSG:4326 quadrprod_gcp.tif quadrprod_gcp_warped.tif

      这样我得到了最终的quadrprod_gcp_warped.tif。生成的图像不再是400x400像素,而是458x331像素。然后,如果我使用gdalinfo来查看它,我发现了这个:

      gdalinfo quadrprod_gcp_warped.tif
      Driver: GTiff/GeoTIFF
      Files: quadrprod_gcp_warped.tif
      Size is 458, 331
      Coordinate System is:
      GEOGCS["WGS 84",
          DATUM["WGS_1984",
              SPHEROID["WGS 84",6378137,298.257223563,
                  AUTHORITY["EPSG","7030"]],
              AUTHORITY["EPSG","6326"]],
          PRIMEM["Greenwich",0],
          UNIT["degree",0.0174532925199433],
          AUTHORITY["EPSG","4326"]]
      Origin = (8.768046497499189,45.547291862003739)
      Pixel Size = (0.010877474938832,-0.010877474938832)
      Metadata:
          AREA_OR_POINT=Area
      Image Structure Metadata:
          INTERLEAVE=PIXEL
      Corner Coordinates:
      Upper Left  (   8.7680465,  45.5472919) (  8d46'4.97"E, 45d32'50.25"N)
      Lower Left  (   8.7680465,  41.9468477) (  8d46'4.97"E, 41d56'48.65"N)
      Upper Right (  13.7499300,  45.5472919) ( 13d44'59.75"E, 45d32'50.25"N)
      Lower Right (  13.7499300,  41.9468477) ( 13d44'59.75"E, 41d56'48.65"N)
      Center      (  11.2589883,  43.7470698) ( 11d15'32.36"E, 43d44'49.45"N)
      Band 1 Block=458x4 Type=Byte, ColorInterp=Red
          Mask Flags: PER_DATASET ALPHA
      Band 2 Block=458x4 Type=Byte, ColorInterp=Green
          Mask Flags: PER_DATASET ALPHA
      Band 3 Block=458x4 Type=Byte, ColorInterp=Blue
          Mask Flags: PER_DATASET ALPHA
      Band 4 Block=458x4 Type=Byte, ColorInterp=Alpha
      

      正如您所看到的,4个角和中心lat / lon与我使用-gcp值设置的值不同。我的问题:

      • 为什么gdalinfo返回的lat / lon值与我在步骤1中使用-gpc设置的值不同?
      • 这是正常还是我做错了什么?
      • 下一步是什么?我是否应该将图像从EPSG:4326翻译成EPSG:900913?
      • 当我将图像作为叠加层放置在openlayers中时,当我创建边界对象时,我应该使用西南角和东北角,我在-gcp中使用的值还是我用gdalinfo看到的最终值?

1 个答案:

答案 0 :(得分:1)

你所说的是正确的。

您基本上想要使用gdal_translate设置一些控制点(参考点),然后使用gdalwarp扭曲图像。

因此,对于粗略投影,您可以简单地使用角落坐标来设置4个控制点。 (这些示例使用的是EPSG:4326,但您可以使用EPSG:900913。

设置4个控制点(角坐标)

gdal_translate -a_srs EPSG:4326 -gcp 0 0 -89.38939600 30.39282800 -gcp 1024 0 -87.00029400 30.01043900 -gcp 0 1250 -89.99424800 27.37030800 -gcp 1024 1250 -87.67748400 26.98606100 "originalImage.tif" "image_trans.tiff"

以上是指像素x = 0且y = 0等于“-89.38939600 30.39282800”像素x = 1024,y = 0等于-87.00029400 30.01043900等等。

使图像变形:

gdalwarp -dstalpha -t_srs EPSG:4326 image_trans.tiff image_warped.tiff

如果翘曲不够好,您将需要在图像上设置更多控制点。

更新

我下载了您的图片并运行了您拥有的命令。一切都很适合我: |

    captDragon@liberatecuba:/media/Data/tmp/orthoTesting$ gdal_translate -of "GTIFF" -gcp 0 0 8.6923 45.5427 -gcp 400 0 13.8149 45.5427 -gcp 200 200 11.2536 43.771702 -gcp 0 400 8.8413 41.9460 -gcp 400 400 13.6659 41.9460 quadrprod.png quadrprod_gpc.tif
    Input file size is 400, 400
    0...10...20...30...40...50...60...70...80...90...100 - done.
captDragon@liberatecuba:/media/Data/tmp/orthoTesting$ gdalinfo quadrprod_gpc.tif 
    Driver: GTiff/GeoTIFF
    Files: quadrprod_gpc.tif
    Size is 400, 400
    Coordinate System is `'
    GCP Projection = 
    GCP[  0]: Id=1, Info=
              (0,0) -> (8.6923,45.5427,0)
    GCP[  1]: Id=2, Info=
              (400,0) -> (13.8149,45.5427,0)
    GCP[  2]: Id=3, Info=
              (200,200) -> (11.2536,43.771702,0)
    GCP[  3]: Id=4, Info=
              (0,400) -> (8.8413,41.946,0)
    GCP[  4]: Id=5, Info=
              (400,400) -> (13.6659,41.946,0)
    Image Structure Metadata:
      INTERLEAVE=PIXEL
    Corner Coordinates:
    Upper Left  (    0.0,    0.0)
    Lower Left  (    0.0,  400.0)
    Upper Right (  400.0,    0.0)
    Lower Right (  400.0,  400.0)
    Center      (  200.0,  200.0)
    Band 1 Block=400x5 Type=Byte, ColorInterp=Red
      Mask Flags: PER_DATASET ALPHA 
    Band 2 Block=400x5 Type=Byte, ColorInterp=Green
      Mask Flags: PER_DATASET ALPHA 
    Band 3 Block=400x5 Type=Byte, ColorInterp=Blue
      Mask Flags: PER_DATASET ALPHA 
    Band 4 Block=400x5 Type=Byte, ColorInterp=Alpha