<P>Hello, I have built a GIS sytem in which I use radians as my unit of measurement. To serve that purpose I created a OGRSpatialReference to represent a radian based projection.&nbsp; Here is the code that I use...
<P>////begin code snippet////<BR>&nbsp;<BR>char* strWkt="GEOGCS[\"MY RADIAN WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",7030]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",6326]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",8901]],UNIT[\"radian\",1.0],AXIS[\"Lat\",NORTH],AXIS[\"Long\",EAST],AUTHORITY[\"EPSG\",4326]]";<BR>&nbsp;&nbsp;<BR>OGRSpatialReference myProjection;<BR>myProjection.importFromWkt(&amp;strWkt);
<P>////end code snippet////
<P>Notice that my Unit node looks like this ...
<P>UNIT[\"radian\",1.0]
<P>My question: is this a correct use of the wkt string?&nbsp; 
<P>If the answer is no than please ignore the rest of this posting.&nbsp; If the answer is yes than there seems to be a bug in the OGRProj4CT class.&nbsp; OGRProj4CT is the class&nbsp;which handles conversions between projections.&nbsp; In cases&nbsp;where one of the projections involved in the conversion has a radians based unit the transform method returns faulty results.&nbsp; Here are the relevant bits of code...
<P><BR>////begin code snippet////<BR>int OGRProj4CT::Initialize( OGRSpatialReference * poSourceIn,OGRSpatialReference * poTargetIn )<BR>{<BR>&nbsp;poSRSSource = poSourceIn-&gt;Clone();<BR>&nbsp;poSRSTarget = poTargetIn-&gt;Clone();<BR>&nbsp;bSourceLatLong = poSRSSource-&gt;IsGeographic();<BR>&nbsp;bTargetLatLong = poSRSTarget-&gt;IsGeographic();
<P>////end code snippet////
<P>////begin code snippet////
<P>int OGRProj4CT::Transform( int nCount, double *x, double *y, double *z )
<P>{<BR>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; err, i;
<P><BR>&nbsp;&nbsp;&nbsp; if( bSourceLatLong )<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( i = 0; i &lt; nCount; i++ )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x[i] *= DEG_TO_RAD;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y[i] *= DEG_TO_RAD;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>//transform code snipped out//////
<P>if( bTargetLatLong )<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( i = 0; i &lt; nCount; i++ )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x[i] *= RAD_TO_DEG;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y[i] *= RAD_TO_DEG;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }
<P><BR>////end code snippet////
<P>As you can see the flags bSourceLatLong , bTargetLatLong&nbsp; turn on conversion between radians and degrees.&nbsp; The problem is that no check is made to ascertain that the unit really is degrees.&nbsp; In my local codebase I have made and used the following change successfully.
<P><BR>////begin code snippet////<BR>int OGRProj4CT::Initialize( OGRSpatialReference * poSourceIn,OGRSpatialReference * poTargetIn )<BR>{<BR>&nbsp;poSRSSource = poSourceIn-&gt;Clone();<BR>&nbsp;poSRSTarget = poTargetIn-&gt;Clone();<BR>&nbsp;bSourceLatLong=FALSE;<BR>&nbsp;bTargetLatLong=FALSE;<BR>&nbsp;if(poSRSSource-&gt;IsGeographic())<BR>&nbsp;{<BR>&nbsp;&nbsp;const char * unitType=poSRSSource-&gt;GetAttrValue("GEOGCS|UNIT",0);<BR>&nbsp;&nbsp;bSourceLatLong=(strstr(unitType,"degree")!=NULL);<BR>&nbsp;}<BR>&nbsp;if(poSRSTarget-&gt;IsGeographic())<BR>&nbsp;{<BR>&nbsp;&nbsp;const char *unitType=poSRSTarget-&gt;GetAttrValue("GEOGCS|UNIT",0);<BR>&nbsp;&nbsp;bTargetLatLong=(strstr(unitType,"degree")!=NULL);<BR>&nbsp;}
<P><BR>////end code snippet////
<P><BR>My apologies if this topic has been discussed before.&nbsp; The Yahoo mailing list archives are currently inaccessible. 
<P>&nbsp;
<P>Thanks,
<P>David E. Knight 
<P>david1&lt;*at*&gt;davideknight&lt;*dot*&gt;com</P>