예제 #1
0
class RadarGrid(Event):
    expected_fields = set(
        [
            "sim_time_start",  # time start in seconds
            "sim_time_end",  # can be None
            "radar_dt",  # radar datetime at sim_time_start
            "sync",  # not used
            "multiplier",  # not used
            "type",  # not used
        ]
    )

    def __init__(self, *args, **kwargs):
        super(RadarGrid, self).__init__(*args, **kwargs)
        self.radar_dt = iso8601.parse_date(kwargs["radar_dt"])
        self.memcdf_name = "precipitation_%s.nc" % random_string(8)
        self.rain_grid_dt = None  # current radar datetime

    def init(self, subgrid, radar_url_template):
        self.subgrid = subgrid
        self.radar_url_template = radar_url_template
        self.rain_grid = RainGrid(
            subgrid,
            url_template=radar_url_template,
            memcdf_name=self.memcdf_name,
            size_x=500,
            size_y=500,
            initial_value=0.0,
        )
        self.rain_grid_dt = self.radar_dt

    def update(self, sim_time):
        """Update grid and apply. Return whether the grid has changed"""
        self.rain_grid_dt = self.radar_dt + datetime.timedelta(
            seconds=int(float(sim_time)) - int(float(self.sim_time_start))
        )
        changed = self.rain_grid.update(dt=self.rain_grid_dt, multiplier=1000)
        return changed

    def delete_memcdf(self):
        if os.path.exists(self.memcdf_name):
            os.remove(self.memcdf_name)

    def __str__(self):
        return "rain grid %s (%r-%r)" % (self.radar_dt.strftime("%Y-%m-%d"), self.sim_time_start, self.sim_time_end)