dmrl_prec_file_without_correction.py 3.19 KB
import urllib.request
import json
import os
import datetime
from imageio import imread
import cv2
import numpy as np
import loca_data
import duamel_model
import matplotlib.pyplot as plt
import sher_duam_class
import dateutil.parser
import dmrl_prec_file

class DMRLPrecFile_WOC(dmrl_prec_file.DMRLPrecFile):

    # Получить результаты расчёта
    def GetResult(self, _prec, _test_datetime=None):
        """
        _prec это JSON вида:
            {"time": "2020-03-20T10:00:00Z",
            "period": 600,
            "sum": 0.0,
            "intensity": 0.0,
            "type": 0}
        """

        result = None
        if _prec["sum"] == " ":
            _prec = None

        temp_datetime = datetime.datetime.now()
        temp_cur_min = (temp_datetime.minute // 10) * 10
        cur_datetime = datetime.datetime(temp_datetime.year, temp_datetime.month, temp_datetime.day, temp_datetime.hour, temp_cur_min, 0, 0)

        if _prec is not None:
            cur_datetime = dateutil.parser.parse(_prec["time"])

        if _test_datetime is not None:
            cur_datetime = _test_datetime

        matrix = self.GetMatrix(cur_datetime)

        # 1. Если ДМРЛ нет и нет осадков
        if matrix is None:
            result = dict(time = cur_datetime.__str__(),
                water_volume = 0.0,
                prec_square = 0.0,
                all_square = -1.0,
                dmrl_prec = -1.0)
            return json.dumps(result)

        # 3-4. Если есть ДМРЛ и есть (или нет) осадков с АГК - ОБЫЧНЫЙ АЛГОРИТМ
        # Определяем коэффициент корреляции, если оба значения есть и отличны от нуля
        cur_prec_value = 0
        dmrl_prec = -1.0

        sum_squere = 0.0
        vol_water = 0.0
        vol_water_wc = 0.0
        pixel_counter = 0.0
        for yy in matrix:
            for xx in yy:
                lm_value = xx[0]
                m_prec = self.GetPrecByDBZ(lm_value) / 6.0

                vol_local_wc = self.pixel_size * self.pixel_size * (1.0/1000.0) * m_prec

                vol_water_wc = vol_water_wc + vol_local_wc

                if vol_water_wc > 0.0:
                    sum_squere = sum_squere + 1.0
                    pixel_counter += 1.0

        sum_squere = sum_squere * self.pixel_size * self.pixel_size

        if self.squere != 0.0:
            dmrl_prec = vol_water_wc / self.squere

        result = dict(
            time = cur_datetime.__str__(),          # Дата
            water_volume = vol_water_wc,            # объём воды (метры в кубе)
            prec_square = sum_squere,               # площадь выпадения осадков
            all_square = self.squere,               # общая площадь водосбора
            dmrl_prec = dmrl_prec)                  # осадки (в мм) ОБЪЕМ ПРИВЕДЕННЫЙ К ОБЩЕЙ ПЛОЩАДИ ВОДОСБОРА

        return json.dumps(result)
########################################################################