2

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

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

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

谢谢。

我按要求添加了图像。

在此处输入图像描述

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

  1. 使用 gdal_translate 将 GCP 设置为图像的四个角和中心,如下所示:

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,如下所示:

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 个角和中心纬度/经度与我使用 -gcp 值设置的值不同。我的问题:

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

1 回答 1

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
于 2013-09-23T17:16:56.767 回答