<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 12 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Arial Unicode MS";
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@Arial Unicode MS";
        panose-1:2 11 6 4 2 2 2 2 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>Hi All,<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>I am experiencing a bit of confusion regarding the use of GDALCreateGenImgProjTransformer.<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>I am attempting to create a ProjTransformer in 2 different ways to prove to myself that I would get the same result&#8230;The problem is I don&#8217;t but don&#8217;t understand exactly why.<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>The first method I am trying is to open the GRIB2 dataset using GDALOpen to get a GDAL dataset handle.&nbsp; This handle is then passed to GDALCreateGenImgProjTransformer as the first argument with the second argument being passed as NULL.&nbsp; The destination dataset is one created using the well-known &#8220;WGS84&#8221; Tag&#8230;For example<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>OGRSpatialReferenceH hDEST;<o:p></o:p></p><p class=MsoNormal> hDEST = OSRNewSpatialReference(NULL);<o:p></o:p></p><p class=MsoNormal> OSRSetWellKnownGeogCS(hDEST, &quot;WGS84&quot;);<o:p></o:p></p><p class=MsoNormal> OSRExportToWkt(hDEST, &amp;pszDstWKT);<o:p></o:p></p><p class=MsoNormal> OSRDestroySpatialReference(hDEST);<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>void *my_transformer = GDALCreateGenImgProjTransformer(hSrcDS,<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pszDstWKT,<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FALSE, 0.0, 0);<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>The second method passes NULL for the first argument and instead passed the WKT instead.&nbsp; The destination data set is the same as created above.<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal> void *my_second_transformer = GDALCreateGenImgProjTransformer( NULL,<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GDALGetProjectionRef( hSrcDS ),<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pszDstWKT,<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FALSE,<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0, 0 );<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>The result of GDALGetProjectionRef( hSrcDS ) for reference :<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp; <o:p></o:p></p><p class=MsoNormal>PROJCS[&quot;unnamed&quot;,<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp; GEOGCS[&quot;Coordinate System imported from GRIB file&quot;,<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DATUM[&quot;unknown&quot;,<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SPHEROID[&quot;Sphere&quot;,6371229,0]],<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRIMEM[&quot;Greenwich&quot;,0],<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UNIT[&quot;degree&quot;,0.0174532925199433]],<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp; PROJECTION[&quot;Lambert_Conformal_Conic_2SP&quot;],<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp; PARAMETER[&quot;standard_parallel_1&quot;,25],<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp; PARAMETER[&quot;standard_parallel_2&quot;,25],<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp; PARAMETER[&quot;latitude_of_origin&quot;,0],<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp; PARAMETER[&quot;central_meridian&quot;,265],<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp; PARAMETER[&quot;false_easting&quot;,0],<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp; PARAMETER[&quot;false_northing&quot;,0]]<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>Lambert Conformal Grid Information as extracted from gdalinfo:<o:p></o:p></p><p class=MsoNormal>Origin = (-4226106.996915472671390,7240925.337282469496131)<o:p></o:p></p><p class=MsoNormal>Pixel Size = (12191.000000000000000,-12191.000000000000000)<o:p></o:p></p><p class=MsoNormal>Corner Coordinates:<o:p></o:p></p><p class=MsoNormal>Upper Left&nbsp; (-4226106.997, 7240925.337) (152d52'43.04&quot;W, 54d33'55.24&quot;N)<o:p></o:p></p><p class=MsoNormal>Lower Left&nbsp; (-4226106.997, 2023177.337) (133d25'42.19&quot;W, 12d 5'14.28&quot;N)<o:p></o:p></p><p class=MsoNormal>Upper Right ( 3259167.003, 7240925.337) ( 49d15'27.05&quot;W, 57d17'54.49&quot;N)<o:p></o:p></p><p class=MsoNormal>Lower Right ( 3259167.003, 2023177.337) ( 65d 2'28.98&quot;W, 14d12'48.02&quot;N)<o:p></o:p></p><p class=MsoNormal>Center&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( -483469.997, 4632051.337) (100d30'19.44&quot;W, 40d34'21.84&quot;N)<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>To test both of these I pass in the known coordinates up the upper left hand corner of the grid ( -152.877, 54.567 ) using code:<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>double x_coord = atof( argv[2] );<o:p></o:p></p><p class=MsoNormal>double y_coord = atof( argv[3] );<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal> std::cout &lt;&lt; std::fixed &lt;&lt; &quot;original x_coord: &quot; &lt;&lt; x_coord &lt;&lt; &quot; y_coord: &quot; &lt;&lt; y_coord &lt;&lt; std::endl;<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal> result =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GDALGenImgProjTransform( my_transformer, TRUE, 1, &amp;x_coord, &amp;y_coord,<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL, &amp;panSuccess);<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>&nbsp; std::cout &lt;&lt; std::fixed &lt;&lt; &quot;calculated x_coord: &quot; &lt;&lt; x_coord &lt;&lt; &quot; y_coord: &quot; &lt;&lt; y_coord &lt;&lt; std::endl;<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>// Reset x-coord and y-coord from command line.<o:p></o:p></p><p class=MsoNormal>&nbsp; x_coord = atof( argv[2] );<o:p></o:p></p><p class=MsoNormal>&nbsp; y_coord = atof( argv[3] );<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>&nbsp; std::cout &lt;&lt; std::fixed &lt;&lt; &quot;second original x_coord: &quot; &lt;&lt; x_coord &lt;&lt; &quot; y_coord: &quot; &lt;&lt; y_coord &lt;&lt; std::endl;<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>&nbsp;&nbsp; esult =<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GDALGenImgProjTransform( my_second_transformer, TRUE, 1, &amp;x_coord, &amp;y_coord,<o:p></o:p></p><p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL, &amp;panSuccess);<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>&nbsp;&nbsp; std::cout &lt;&lt; std::fixed &lt;&lt; &quot;second calculated x_coord: &quot; &lt;&lt; x_coord &lt;&lt; &quot; y_coord: &quot; &lt;&lt; y_coord &lt;&lt; std::endl;<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>The results:<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal><b>// This result is right on the money and exactly what I expect<o:p></o:p></b></p><p class=MsoNormal>original x_coord: -152.877000 y_coord: 54.567000<o:p></o:p></p><p class=MsoNormal>calculated x_coord: 0.016427 y_coord: -0.011915<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal><b>// This result is not what I expect.&nbsp; I would have assumed since I created the transformer in a different way but using the WKT information it should have been the same.<o:p></o:p></b></p><p class=MsoNormal><b>// instead I am getting the Lambert Easting and Northing in Meters.<o:p></o:p></b></p><p class=MsoNormal>second original x_coord: -152.877000 y_coord: 54.567000<o:p></o:p></p><p class=MsoNormal>second calculated x_coord: -4225906.734228 y_coord: 7241070.590061<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>Am I missing a step here?<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>Thanks,<o:p></o:p></p><p class=MsoNormal>Bill<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal><span style='font-size:9.0pt'>++++<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:9.0pt'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:9.0pt'>William Cassanova | Senior GFS Developer | The Weather Channel | 770.226.2368 | bcassanova@weather.com<o:p></o:p></span></p><p class=MsoNormal><o:p>&nbsp;</o:p></p></div></body></html>