Beispiel #1
0
    def test_get_geostationary_bbox(self):
        """Get the geostationary bbox."""
        geos_area = mock.MagicMock()
        del geos_area.crs
        lon_0 = 0
        geos_area.proj_dict = {
            'proj': 'geos',
            'lon_0': lon_0,
            'a': 6378169.00,
            'b': 6356583.80,
            'h': 35785831.00,
            'units': 'm'
        }
        geos_area.area_extent = [-5500000., -5500000., 5500000., 5500000.]

        lon, lat = hf.get_geostationary_bounding_box(geos_area, 20)
        elon = np.array([
            -74.802824, -73.667708, -69.879687, -60.758081, -32.224989,
            32.224989, 60.758081, 69.879687, 73.667708, 74.802824, 74.802824,
            73.667708, 69.879687, 60.758081, 32.224989, -32.224989, -60.758081,
            -69.879687, -73.667708, -74.802824
        ])

        elat = -np.array([
            -6.81982903e-15, -1.93889346e+01, -3.84764764e+01, -5.67707359e+01,
            -7.18862588e+01, -7.18862588e+01, -5.67707359e+01, -3.84764764e+01,
            -1.93889346e+01, 0.00000000e+00, 6.81982903e-15, 1.93889346e+01,
            3.84764764e+01, 5.67707359e+01, 7.18862588e+01, 7.18862588e+01,
            5.67707359e+01, 3.84764764e+01, 1.93889346e+01, -0.00000000e+00
        ])

        np.testing.assert_allclose(lon, elon + lon_0)
        np.testing.assert_allclose(lat, elat)
Beispiel #2
0
def _get_sunlight_coverage(area_def, start_time, overpass=None):
    """Get the sunlight coverage of *area_def* at *start_time* as a value between 0 and 1."""
    if area_def.proj_dict.get('proj') == 'geos':
        adp = Boundary(*get_geostationary_bounding_box(
            area_def, nb_points=100)).contour_poly
    else:
        adp = AreaDefBoundary(area_def, frequency=100).contour_poly
    poly = get_twilight_poly(start_time)
    if overpass is not None:
        ovp = overpass.boundary.contour_poly
        cut_area_poly = adp.intersection(ovp)
    else:
        cut_area_poly = adp

    if cut_area_poly is None:
        if not adp._is_inside(ovp):
            return 0.0
        else:
            # Should already have been taken care of in pyresample.spherical.intersection
            cut_area_poly = adp

    daylight = cut_area_poly.intersection(poly)
    if daylight is None:
        if sun_zenith_angle(start_time, *area_def.get_lonlat(0, 0)) < 90:
            return 1.0
        else:
            return 0.0
    else:
        daylight_area = daylight.area()
        total_area = adp.area()
        return daylight_area / total_area