Sunday, 15 March 2015

coordinate system - Manually transforming rotated lat/lon to regular lat/lon?


First I should clarify I don't have previous experience with the field, so I don't know the technical terminology. My question is as follows:


I have two weather datasets:




  • The first one has the regular coordinate system (I don't know if it has an specific name), ranging from -90 to 90 and -180 to 180, and the poles are at latitudes -90 and 90.





  • In the second one, although it should correspond to the same region, I noticed something different: latitude and longitude were not the same, as they have another reference point (in the description is called a rotated grid). Together with the lat/lon pairs, comes the following information: southern pole lat: -35.00, southern pole lon: -15.00, angle: 0.0.




I need to transform the second pair of lon/lat to the first one. It could be as simple as add 35 to the latitudes and 15 to the longitudes, since the angle is 0 and it seems a simple shifting, but I'm not sure.


Edit: The information I have about the coordinates is the following


http://rda.ucar.edu/docs/formats/grib/gribdoc/llgrid.html


Apparently, the second coordinate system is defined by a general rotation of the sphere


"One choice for these parameters is:





  • The geographic latitude in degrees of the southern pole of the coordinate system, thetap for example;




  • The geographic longitude in degrees of the southern pole of the coordinate system, lambdap for example;




  • The angle of rotation in degrees about the new polar axis (measured clockwise when looking from the southern to the northern pole) of the coordinate system, assuming the new axis to have been obtained by first rotating the sphere through lambdap degrees about the geographic polar axis, and then rotating through (90 + thetap) degrees so that the southern pole moved along the (previously rotated) Greenwich meridian."




but still I don't know how to convert this to the first one.




Answer



Manually reversing the rotation should do the trick; there should be a formula for rotating spherical coordinate systems somewhere, but since I can't find it, here's the derivation ( ' marks the rotated coordinate system; normal geographic coordinates use plain symbols):


First convert the data in the second dataset from spherical (lon', lat') to (x',y',z') using:


x' = cos(lon')*cos(lat')
y' = sin(lon')*cos(lat')
z' = sin(lat')

Then use two rotation matrices to rotate the second coordinate system so that it coincides with the first 'normal' one. We'll be rotating the coordinate axes, so we can use the axis rotation matrices. We need to reverse the sign in the ϑ matrix to match the rotation sense used in the ECMWF definition, which seems to be different from the standard positive direction.


Since we're undoing the rotation described in the definition of the coordinate system, we first rotate by ϑ = -(90 + lat0) = -55 degrees around the y' axis (along the rotated Greenwich meridian) and then by φ = -lon0 = +15 degrees around the z axis):


x   ( cos(φ), sin(φ), 0) (  cos(ϑ), 0, sin(ϑ)) (x')

y = (-sin(φ), cos(φ), 0).( 0 , 1, 0 ).(y')
z ( 0 , 0 , 1) ( -sin(ϑ), 0, cos(ϑ)) (z')

Expanded, this becomes:


x = cos(ϑ) cos(φ) x' + sin(φ) y' + sin(ϑ) cos(φ) z'
y = -cos(ϑ) sin(φ) x' + cos(φ) y' - sin(ϑ) sin(φ) z'
z = -sin(ϑ) x' + cos(ϑ) z'

Then convert back to 'normal' (lat,lon) using


lat = arcsin(z)

lon = atan2(y, x)

If you don't have atan2, you can implement it yourself by using atan(y/x) and examining the signs of x and y


Make sure that you convert all angles to radians before using the trigonometric functions, or you'll get weird results; convert back to degrees in the end if that's what you prefer...


Example (rotated sphere coordinates ==> standard geographic coordinates):




  • southern pole of the rotated CS is (lat0, lon0)


    (-90°, *) ==> (-35°, -15°)





  • prime meridian of the rotated CS is the -15° meridian in geographic (rotated 55° towards north)


    (0°, 0°) ==> (55°, -15°)




  • symmetry requires that both equators intersect at 90°/-90° in the new CS, or 75°/-105° in geographic coordinates


    (0°, 90°) ==> (0°, 75°)
    (0°, -90°) ==> (0°,-105°)





EDIT: Rewritten the answer thanks to very constructive comment by whuber: the matrices and the expansion are now in sync, using proper signs for the rotation parameters; added reference to the definition of the matrices; removed atan(y/x) from the answer; added examples of conversion.


EDIT 2: It is possible to derive expressions for the same result without explicit tranformation into cartesian space. The x, y, z in the result can be substituted with their corresponding expressions, and the same can be repeated for x', y' and z'. After applying some trigonometric identities, the following single-step expressions emerge:


lat = arcsin(cos(ϑ) sin(lat') - cos(lon') sin(ϑ) cos(lat'))
lon = atan2(sin(lon'), tan(lat') sin(ϑ) + cos(lon') cos(ϑ)) - φ

No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...