Skip to content
Snippets Groups Projects
Select Git revision
  • bugfix-issue30
  • master default protected
  • develop protected
  • exp-workaround-ahi-sat-id
  • feat-satpy-msg-hrit
  • dev-rkg-msg-202411
  • refactor-msg-hrit-202411
  • feat-msg-hrit-make
  • feat-env-himawari-ids
  • fix-wmo-ids-cspp-geo-geocat
  • msg_hrit_srm
  • feature-gk2a-ami-cxx
  • metosat-hrit
  • refactor-efficient-fgfyx
  • feature-gk2a-ami
  • feature-winapi
  • feature-format-v1p3
  • feature-hcast2nc
  • bugfix-auto-sentinels
  • bugfix-erfa-leapsec-20161231
  • r20241220-volcat-ngfs-code-ancil
  • r20191031
  • r20190506
  • v20181113
  • v20181109
  • b20180827
  • v20180827
  • v20180820
  • v20180816
  • v20180709
  • v20180531
  • v20180411
  • v20180216
  • v20180102
  • v20171020
  • v20171016
  • v20171013
  • v20171002
  • v20170929
  • v20170928
40 results

cffi_geos_transform.py

Blame
  • cffi_geos_transform.py 3.05 KiB
    import numpy as np
    from cffi import FFI 
    from collections import namedtuple
    ffi = FFI()
    ffi.cdef("""
    enum SCAN_GEOMETRIES {
      GOES,
      GEOS
    };
    
    void fgf_to_sat(const double fgf_x, const double fgf_y, const double scale_x, 
                    const double offset_x, const double scale_y, const double offset_y, 
                    double *lamda, double *theta);
                    
    void goes_to_geos(double *lamda, double *theta);
    
    void sat_to_earth(const double lamda, const double theta, const double sub_lon_degrees,
                      double *lon_degrees, double *lat_degrees);
                      
    void fgf_to_earth_(const double *fgf_x, const double *fgf_y, const double *scale_x, 
                       const double *offset_x, const double *scale_y, const double *offset_y, 
                       const double *sub_lon_degrees, double *lon_degrees, double *lat_degrees);                                  
    
    void earth_to_sat(const double lon_degrees, const double lat_degrees, const double sub_lon_degrees, double *lamda, double *theta);
    
    void sat_to_fgf(const double lamda, const double theta, const double scale_x, const double offset_x, const double scale_y, 
                    const double offset_y, double *fgf_x, double *fgf_y);
    
    """)
    
    _so = ffi.dlopen('./libgeos_transform.so')
    
    place = namedtuple('place', ('lon','lat'))
    
    def fgf_to_earth(fgf_x, fgf_y, scale_x, offset_x, scale_y, offset_y, sub_lon_degrees):
        """
        return longitude, latitude    
        """
        lam = ffi.new('double *')
        tht = ffi.new('double *')
        lon = ffi.new('double *')
        lat = ffi.new('double *')
        _so.fgf_to_sat(fgf_x, fgf_y, scale_x, offset_x, scale_y, offset_y, lam, tht)
        print "lam %f tht %f" % (lam[0], tht[0])
        _so.sat_to_earth(lam[0], tht[0], sub_lon_degrees, lon, lat)
        return place(lon[0], lat[0])
    
    DEG2RAD = np.pi / 180.0
    
    def y_x_to_earth(line, column, CFAC, COFF, LFAC, LOFF, sub_lon_degrees):
        'imitate geocoord2pixcoord approach to *FAC/*OFF so we can use info directly from HSD files'
        lambda_ = 2.0**16 * (float(column)-COFF) / CFAC * DEG2RAD
        theta = 2.0**16 * (float(line)-LOFF) / LFAC * DEG2RAD
        lon = ffi.new('double *')
        lat = ffi.new('double *')
        _so.sat_to_earth(lambda_, theta, sub_lon_degrees, lon, lat)
        return place(lon[0], lat[0])
    
    
    def hsd_test(line=1856, column=1858):
        sub_lon = 140.7
        CFAC = 20466275
        LFAC = 20466275
        COFF = 2750.5
        LOFF = 2750.5
        return lc_to_earth(line, column, CFAC, COFF, LFAC, LOFF, sub_lon)
    
    
    
    
    class fgf(object):
        _xoyo = None
        
        def __init__(self, cfac, lfac, coff, loff, sublon):
            self._xoyo = xoyo = ffi.new('double[5]')
            xoyo[0] = cfac
            xoyo[1] = coff
            xoyo[2] = lfac
            xoyo[3] = loff
            xoyo[4] = sublon
        
        def __call__(self, fgf_x, fgf_y):
            lam = ffi.new('double *')
            tht = ffi.new('double *')
            lon = ffi.new('double *')
            lat = ffi.new('double *')
            _so.fgf_to_sat(fgf_x, fgf_y, self._xoyo[0], self._xoyo[1], self._xoyo[2], self._xoyo[3], lam, tht)
            _so.sat_to_earth(lam[0], tht[0], self._xoyo[4], lon, lat)
            return lon[0], lat[0]