# grib2io.utils.rotate

View Source

     1#from math import *
     2import math
     3import numpy as np
     4
     5def rotated_grid_transform(lats, lons, lat_sp, lon_sp, option=2):
     6    #lon = grid_in[0]
     7    #lat = grid_in[1]
     8
     9    lons = (lons*math.pi)/180.0 # Convert degrees to radians
    10    lats = (lats*math.pi)/180.0
    11
    12    #SP_lon = SP_coor[0]
    13    #SP_lat = SP_coor[1]
    14
    15    theta = 90.0 + lat_sp # Rotation around y-axis
    16    phi = lon_sp # Rotation around z-axis
    17
    18    theta = (theta*math.pi) / 180.0
    19    phi = (phi*math.pi) / 180.0 # Convert degrees to radians
    20
    21    x = np.cos(lons)*np.cos(lats) # Convert from spherical to cartesian coordinates
    22    y = np.sin(lons)*np.cos(lats)
    23    z = np.sin(lats)
    24
    25    if option == 1: # Regular -> Rotated
    26
    27        x_new = np.cos(theta)*np.cos(phi)*x + np.cos(theta)*np.sin(phi)*y + np.sin(theta)*z
    28        y_new = -np.sin(phi)*x + np.cos(phi)*y
    29        z_new = -np.sin(theta)*np.cos(phi)*x - np.sin(theta)*np.sin(phi)*y + np.cos(theta)*z
    30
    31    elif option == 2:  # Rotated -> Regular
    32
    33        phi = -phi
    34        theta = -theta
    35
    36        x_new = np.cos(theta)*np.cos(phi)*x + np.sin(phi)*y + np.sin(theta)*np.cos(phi)*z
    37        y_new = -np.cos(theta)*np.sin(phi)*x + np.cos(phi)*y - np.sin(theta)*np.sin(phi)*z
    38        z_new = -np.sin(theta)*x + np.cos(theta)*z
    39
    40    lons_new = np.arctan2(y_new,x_new) # Convert cartesian back to spherical coordinates
    41    lats_new = np.arcsin(z_new)
    42
    43    lons_new = (lons_new*180.0) / math.pi # Convert radians back to degrees
    44    lats_new = (lats_new*180.0) / math.pi
    45
    46    return lats_new, lons_new

def rotated_grid_transform(lats, lons, lat_sp, lon_sp, option=2): View Source

     6def rotated_grid_transform(lats, lons, lat_sp, lon_sp, option=2):
     7    #lon = grid_in[0]
     8    #lat = grid_in[1]
     9
    10    lons = (lons*math.pi)/180.0 # Convert degrees to radians
    11    lats = (lats*math.pi)/180.0
    12
    13    #SP_lon = SP_coor[0]
    14    #SP_lat = SP_coor[1]
    15
    16    theta = 90.0 + lat_sp # Rotation around y-axis
    17    phi = lon_sp # Rotation around z-axis
    18
    19    theta = (theta*math.pi) / 180.0
    20    phi = (phi*math.pi) / 180.0 # Convert degrees to radians
    21
    22    x = np.cos(lons)*np.cos(lats) # Convert from spherical to cartesian coordinates
    23    y = np.sin(lons)*np.cos(lats)
    24    z = np.sin(lats)
    25
    26    if option == 1: # Regular -> Rotated
    27
    28        x_new = np.cos(theta)*np.cos(phi)*x + np.cos(theta)*np.sin(phi)*y + np.sin(theta)*z
    29        y_new = -np.sin(phi)*x + np.cos(phi)*y
    30        z_new = -np.sin(theta)*np.cos(phi)*x - np.sin(theta)*np.sin(phi)*y + np.cos(theta)*z
    31
    32    elif option == 2:  # Rotated -> Regular
    33
    34        phi = -phi
    35        theta = -theta
    36
    37        x_new = np.cos(theta)*np.cos(phi)*x + np.sin(phi)*y + np.sin(theta)*np.cos(phi)*z
    38        y_new = -np.cos(theta)*np.sin(phi)*x + np.cos(phi)*y - np.sin(theta)*np.sin(phi)*z
    39        z_new = -np.sin(theta)*x + np.cos(theta)*z
    40
    41    lons_new = np.arctan2(y_new,x_new) # Convert cartesian back to spherical coordinates
    42    lats_new = np.arcsin(z_new)
    43
    44    lons_new = (lons_new*180.0) / math.pi # Convert radians back to degrees
    45    lats_new = (lats_new*180.0) / math.pi
    46
    47    return lats_new, lons_new