<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:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 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;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@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" style="text-autospace:none"><span style="color:#1F497D">One possible answer seems to be to use
</span><span style="font-size:9.5pt;font-family:Consolas;color:#A31515">ICHIP_OP_**_** and  ICHIP_FI_**_**<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:#A31515"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Using the _<i>OP</i>_ metadata I form a row-wise 2x2 projection matrix with _12 - _11 as one row and _21 - _11 as the other.  With _<i>FI</i>_ I form a column-wise 2x2 projection matrix with _12 - _11 and _21
 - _11 as the columns.   Applying these matrices and the two translations in the right order seems to give ok results.  If I combine this transform with the geoTransform (matrix multi and trans) I seem to get ok results.  The results are different by a little
 from ArcMap’s raster inclusion but close.  Code is included below to show the transforms that I have done.  Does this seem right? 
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> fi11r = strtod(poDataset->GetMetadataItem(<span style="color:#A31515">"ICHIP_FI_ROW_11"</span>,
 NULL), NULL);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> fi11c = strtod(poDataset->GetMetadataItem(<span style="color:#A31515">"ICHIP_FI_COL_11"</span>,
 NULL), NULL);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> fi12r = strtod(poDataset->GetMetadataItem(<span style="color:#A31515">"ICHIP_FI_ROW_12"</span>,
 NULL), NULL);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> fi12c = strtod(poDataset->GetMetadataItem(<span style="color:#A31515">"ICHIP_FI_COL_12"</span>,
 NULL), NULL);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> fi21r = strtod(poDataset->GetMetadataItem(<span style="color:#A31515">"ICHIP_FI_ROW_21"</span>,
 NULL), NULL);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> fi21c = strtod(poDataset->GetMetadataItem(<span style="color:#A31515">"ICHIP_FI_COL_21"</span>,
 NULL), NULL);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> op11r = strtod(poDataset->GetMetadataItem(<span style="color:#A31515">"ICHIP_OP_ROW_11"</span>,
 NULL), NULL);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> op11c = strtod(poDataset->GetMetadataItem(<span style="color:#A31515">"ICHIP_OP_COL_11"</span>,
 NULL), NULL);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> op12r = strtod(poDataset->GetMetadataItem(<span style="color:#A31515">"ICHIP_OP_ROW_12"</span>,
 NULL), NULL);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> op12c = strtod(poDataset->GetMetadataItem(<span style="color:#A31515">"ICHIP_OP_COL_12"</span>,
 NULL), NULL);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> op21r = strtod(poDataset->GetMetadataItem(<span style="color:#A31515">"ICHIP_OP_ROW_21"</span>,
 NULL), NULL);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> op21c = strtod(poDataset->GetMetadataItem(<span style="color:#A31515">"ICHIP_OP_COL_21"</span>,
 NULL), NULL);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:green">//Column matrix</span><span style="font-size:9.5pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> pr11, pr12, pr22, pr21;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> npr1, npr2;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">npr1 = sqrt((fi12c - fi11c)*(fi12c - fi11c) + (fi12r - fi11r)*(fi12r - fi11r));<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">npr2 = sqrt((fi21c - fi11c)*(fi21c - fi11c) + (fi21r - fi11r)*(fi21r - fi11r));<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">pr11 = (fi12c - fi11c)/npr1;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">pr12 = (fi21c - fi11c)/npr2;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">pr21 = (fi12r - fi11r)/npr1;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">pr22 = (fi21r - fi11r)/npr2;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:green">//Row matrix</span><span style="font-size:9.5pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> br11, br12, br22, br21;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> nbr1, nbr2;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">nbr1 = sqrt((op12c - op11c)*(op12c - op11c) + (op12r - op11r)*(op12r - op11r));<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">nbr2 = sqrt((op21c - op11c)*(op21c - op11c) + (op21r - op11r)*(op21r - op11r));<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">br11 = (op12c - op11c)/nbr1;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">br21 = (op21c - op11c)/nbr2;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">br12 = (op12r - op11r)/nbr1;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">br22 = (op21r - op11r)/nbr2;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:green">//Transform</span><span style="font-size:9.5pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> m11, m12, m22, m21;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">m11 = pr11*br11 + pr12*br21;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">m21 = pr21*br11 + pr22*br21;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">m12 = pr11*br12 + pr12*br22;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">m22 = pr21*br12 + pr22*br22;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:green">//Compute the translation factor</span><span style="font-size:9.5pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> a1, a2;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">a1 = -(m11*op11c + m12*op11r) + fi11c;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">a2 = -(m21*op11c + m22*op11r) + fi11r;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">ST[0] = a1;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">ST[3] = a2;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">ST[1] = m11;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">ST[2] = m12;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">ST[4] = m21;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">ST[5] = m22;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> gdal-dev-bounces@lists.osgeo.org [mailto:gdal-dev-bounces@lists.osgeo.org]
<b>On Behalf Of </b>Baker, Anthony W<br>
<b>Sent:</b> Monday, June 10, 2013 12:14 PM<br>
<b>To:</b> gdal-dev@lists.osgeo.org<br>
<b>Subject:</b> [gdal-dev] NITF Chip<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I have a NITF file which I can read fine with GDAL.  The issue that it is a chip and using the transformation to determine geolocations fails (for example finding the chip’s four corners).  Instead of placing a point based on the chip,
 it places it based on the whole image.  I can read the metadata and see that the RPC metadata contains the chip offset:<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">RPC Metadata:<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">  LINE_OFF=3276<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">  LINE_SCALE=3276<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">  SAMP_OFF=2538<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">  SAMP_SCALE=2538<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">  LONG_OFF=-106.8927<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">  LONG_SCALE=0.0542<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">  LAT_OFF=32.3084<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">  LAT_SCALE=0.0593<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">  HEIGHT_OFF=1229<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">  HEIGHT_SCALE=1214<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I am tempted to use the LINE_OFF and SAMP_OFF to make the adjustments to properly get the boundary.  I believe this is only a partial solution (not generic enough) and will just give further problems as I get other NITF chips.  Would someone
 help me with the proper way of handling the chip transformation?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thank you,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Anthony<o:p></o:p></p>
</div>
</body>
</html>