Opened 17 years ago

Closed 17 years ago

#1469 closed defect (fixed)

AutoCreateWarpedVRT creates incorrect VRT Dataset

Reported by: szekerest Owned by: warmerdam
Priority: normal Milestone: 1.4.1
Component: GDAL_Raster Version: unspecified
Severity: normal Keywords: vrt
Cc: Mateusz Łoskot

Description (last modified by Mateusz Łoskot)

Currently, for the SWIG bindings, the only option to use the the GDAL warp functionality is to utilize AutoCreateWarpedVRT. To use this feature the following (simplified) C# code sample was created:

gdal.AllRegister();
Dataset ds = gdal.Open( "usapm.jpg", gdalconst.GA_ReadOnly );

SpatialReference t_srs = new SpatialReference("");
t_srs.SetFromUserInput("+proj=longlat +ellps=clrk80 +no_defs");
string t_srs_wkt;
t_srs.ExportToWkt(out t_srs_wkt);
SpatialReference s_srs = new SpatialReference("");
s_srs.SetFromUserInput("+proj=utm +zone=16 +datum=NAD83 +no_defs");
string s_srs_wkt;
s_srs.ExportToWkt(out s_srs_wkt);
Dataset dswarp = gdal.AutoCreateWarpedVRT( ds, s_srs_wkt, t_srs_wkt, gdalconst.GRA_NearestNeighbour, 0.125 );

Driver drv_out = gdal.GetDriverByName("GTiff");

// saving the VRT dataset (optional)
Dataset dsw1 = dswarp.GetDriver().CreateCopy("usapm_bad.vrt", dswarp, 1, null);
// saving the warped image
Dataset dsw = drv_out.CreateCopy("usapm_bad.tif", dswarp, 0, new string[] { "INTERLEAVE=PIXEL", null });

Currently this code does not work as expected and the resulting image is not warped.

So as to inspect this problem the following equivalent commands were executed using the same dataset:

gdalwarp -s_srs "+proj=utm +zone=16 +datum=NAD83 +no_defs" \
   -t_srs "+proj=longlat +ellps=clrk80 +no_defs" -of VRT \
   usapm.jpg usapm_good.vrt
gdalwarp -co "INTERLEAVE=PIXEL" usapm_good.vrt usapm_good.tif

A suggested patch was also created for fixing this problem.

The following files will be attached to this bug:

usapm_good.vrt
usapm_bad.vrt
usapm.zip (contains usapm.jpg, usapm.jgw)
vrtwarped.cpp.patch

Attachments (3)

usapm_good.vrt (3.1 KB ) - added by szekerest 17 years ago.
usapm_good.vrt
usapm_bad.vrt (1.9 KB ) - added by szekerest 17 years ago.
usapm_bad.vrt
vrtwarped.cpp.patch (2.9 KB ) - added by szekerest 17 years ago.
vrtwarped.cpp.patch

Download all attachments as: .zip

Change History (8)

by szekerest, 17 years ago

Attachment: usapm_good.vrt added

usapm_good.vrt

by szekerest, 17 years ago

Attachment: usapm_bad.vrt added

usapm_bad.vrt

by szekerest, 17 years ago

Attachment: vrtwarped.cpp.patch added

vrtwarped.cpp.patch

comment:1 by szekerest, 17 years ago

The data file couldn't be attached due to it's size, and can be downloaded from here:

http://members.chello.hu/szekeres.tamas1/usapm.zip

comment:3 by Mateusz Łoskot, 17 years ago

Description: modified (diff)

comment:4 by Mateusz Łoskot, 17 years ago

Cc: Mateusz Łoskot added
Keywords: vrt added

comment:5 by warmerdam, 17 years ago

Milestone: 1.4.1
Priority: highestnormal
Severity: criticalnormal

I will review this before the 1.4.1 release to see if it belongs there, though I am hesitant at this late date.

comment:6 by warmerdam, 17 years ago

Resolution: fixed
Status: newclosed

I don't really understand the bulk of the patch. I found the following change (passing pszDstWKT into GDALCreateGenImgProjTransformer()) was sufficient to fix the problem.

warmerda@amd64[120]% svn diff --diff-cmd diff -x -c
Index: vrtwarped.cpp
===================================================================
*** vrtwarped.cpp       (revision 11196)
--- vrtwarped.cpp       (working copy)
***************
*** 120,126 ****
  /* -------------------------------------------------------------------- */
      psWO->pfnTransformer = GDALGenImgProjTransform;
      psWO->pTransformerArg = 
!         GDALCreateGenImgProjTransformer( psWO->hSrcDS, pszSrcWKT, NULL, NULL,
                                           TRUE, 1.0, 0 );
  
  /* -------------------------------------------------------------------- */
--- 120,127 ----
  /* -------------------------------------------------------------------- */
      psWO->pfnTransformer = GDALGenImgProjTransform;
      psWO->pTransformerArg = 
!         GDALCreateGenImgProjTransformer( psWO->hSrcDS, pszSrcWKT, 
!                                          NULL, pszDstWKT,
                                           TRUE, 1.0, 0 );
  
  /* ------------------------------------------------------------------

This change has been applied in trunk, and 1.4 branch in time for the 1.4.1 release.

Note: See TracTickets for help on using tickets.