GribStream

HRRRベースのトウモロコシ成長シミュレーション

このシミュレーションは、詳細な時間別気象データを使って、トウモロコシの発育段階を予測し、成長ストレスを評価するための実務的な方法を示します。NOAA HRRR気象モデルの気温、日射、風速、湿度、土壌水分を入力として使い、農業気象学の考え方で作物の成長を推定します。

中心になる指標は光熱単位(Photothermal Units、PTU)です。PTUは、基準温度を上回る時間ごとの気温(トウモロコシでは一般に10 °C)と、時間ごとの日射量(MJ/m²)を組み合わせます。従来の有効積算温度(Growing Degree Days、GDD)と違い、PTUは熱条件と放射条件の両方を含むため、実際の作物成長をよりよく表現できます。さらに、水分、低温、放射、ET₀によるストレス係数をかけることで、生育期を通した現実的な条件に近づけます。

このモデルにはいくつかの前提があります。気温と放射は時間ごとの値を使い、アイオワで過去に観測された典型的なトウモロコシ発育時期に合うよう、経験的な0.55の調整係数を適用します。土壌水分ストレスは、しおれ点0.15と圃場容水量0.30を使います。これは米国中西部の農地土壌でよく使われる代表値です。10 m風速は2 m付近の条件へ近似し、蒸発散(ET₀)の計算を改善します。

ET₀はPenman-Monteith式で計算し、作物の水需要を時間ごとに推定します。これは乾燥ストレスを予測するうえで重要です。作物係数Kcは1.05で固定し、生育期のトウモロコシの代表的な水需要を表します。ET₀のストレスしきい値は0.35 mm/hに設定し、水不足が成長を大きく制限し得る時間帯を見つけます。

低温ストレスは、時間ごとの気温をユーザー定義のしきい値と比べて評価します。これにより、冷え込みが作物の健康や発育に影響しそうな時間帯を強調できます。放射ストレスも同じ考え方で、曇天や厚い雲により日射が不足し、成長が制限されそうな時間帯を示します。

ダッシュボードでは、これらの結果を直感的なグラフで確認できます。気温は重要なしきい値と一緒に表示され、低温ストレスの可能性をすぐに見られます。土壌水分はしおれ点と圃場容水量と比較され、乾燥条件の可能性を示します。ET₀のグラフは湿度と合わせて表示され、水ストレスが高い時間帯を見つけやすくします。

さらに、生育期を通した累積PTUを表示し、潜在的な成長とストレス調整後の成長を直接比較できます。最終的なストレス調整後PTUは、出芽、雄穂形成、絹糸抽出、ブリスター期、乳熟期、糊熟期、デント期、成熟といった既知のトウモロコシ発育段階に対応します。

このシミュレーションは、生産者、農学者、研究者がトウモロコシの発育を見通すための分かりやすい方法です。ストレス条件を早めに把握することで、播種、灌漑、収穫の判断を支援し、収量改善やより情報に基づいた農業管理につながります。

下のグラフは、5月1日の播種から9月初旬の成熟までの一連のサイクルを示します。拡大すると、気象変数、ストレス要因、成長の関係をより詳しく確認できます。

下のダッシュボードを動かすGribStreamリクエスト例:

curl -X POST 'https://gribstream.com/api/v2/hrrr/timeseries' \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer [API_TOKEN]" \
    -d '{
    "fromTime": "2024-05-01T00:00:00Z",
    "untilTime": "2024-05-05T00:00:00Z",
    "minHorizon": 0,
    "maxHorizon": 48,
    "coordinates": [
        {
            "name": "Iowa",
            "lat": 42.0347,
            "lon": -93.6200
        }
    ],
    "variables": [
        { "name": "TMP", "level": "2 m above ground", "info": "", "alias": "temperature" },
        { "name": "SOILW", "level": "0.3-0.3 m below ground", "info": "", "alias": "soil_moisture" },
        { "name": "WIND", "level": "10 m above ground", "info": "", "alias": "wind" },
        { "name": "RH", "level": "2 m above ground", "info": "", "alias": "humidity" },
        { "name": "DSWRF", "level": "surface", "info": "", "alias": "dsw_radiation" },
        { "name": "ULWRF", "level": "surface", "info": "", "alias": "ulw_radiation" },
        { "name": "GFLUX", "level": "surface", "info": "", "alias": "ground_heat_flux" }
    ],
    "expressions": [
        { "expression": "120", "alias": "emergence_threshold"},
        { "expression": "1300", "alias": "tasseling_threshold"},
        { "expression": "1500", "alias": "silking_threshold"},
        { "expression": "1800", "alias": "blister_threshold"},
        { "expression": "2100", "alias": "milk_threshold"},
        { "expression": "2400", "alias": "dough_threshold"},
        { "expression": "2700", "alias": "dent_threshold"},
        { "expression": "2900", "alias": "maturity_threshold"},
        { "expression": "wind * 0.748", "alias": "wind"},
        { "expression": "dsw_radiation * 0.0036", "alias": "dsw_radiation"},
        { "expression": "ulw_radiation * 0.0036", "alias": "ulw_radiation"},
        { "expression": "temperature - 273.15", "alias": "temperature"},
        { "expression": "humidity / 100", "alias": "humidity"},
        { "expression": "10", "alias": "base_temperature"},
        { "expression": "0", "alias": "cold_stress_threshold"},
        { "expression": "5", "alias": "cold_stress_recovery_temperature"},
        { "expression": "0.15", "alias": "wilting_point"},
        { "expression": "0.3", "alias": "field_capacity"},
        { "expression": "0.35", "alias": "max_et0_threshold"},
        { "expression": "0.25", "alias": "useful_radiation_cutoff"},
        { "expression": "ground_heat_flux * 0.0036", "alias": "ground_heat_flux"},
        { "expression": "0.066", "alias": "gamma"},
        { "expression": "dsw_radiation * 0.77 - ulw_radiation", "alias": "net_radiation"},
        { "expression": "0.6108 * 2.718281828 ^ (17.27 * temperature / (temperature + 237.3))", "alias": "es"},
        { "expression": "es * (1 - humidity)", "alias": "vpd"},
        { "expression": "(4098 * (0.6108 * 2.718281828 ^ (17.27 * temperature / (temperature + 237.3)))) / ((temperature + 237.3) ^ 2)", "alias": "delta"},
        { "expression": "(0.6108 * 2.718281828 ^ (17.27 * temperature / (temperature + 237.3))) * humidity", "alias": "ea"},
        { "expression": "max((0.408 * delta * (net_radiation - ground_heat_flux) + gamma * (37 * wind * vpd / (temperature + 273))) / (delta + gamma * (1 + 0.34 * wind)), 0)", "alias": "et0"},
        { "expression": "max(0, min(1, 1 - 1.05 * et0 / max_et0_threshold))", "alias": "et0_stress"},
        { "expression": "(max((temperature - base_temperature), 0) * dsw_radiation) * 0.55", "alias": "PTU" },
        { "expression": "dsw_radiation >= useful_radiation_cutoff ? 1 : dsw_radiation / useful_radiation_cutoff", "alias": "radiation_stress"},
        { "expression": "min(max(0, (temperature - cold_stress_threshold) / (cold_stress_recovery_temperature - cold_stress_threshold)), 1)", "alias": "cold_stress"},
        { "expression": "min(max(0, (soil_moisture - wilting_point)/(field_capacity - wilting_point)), 1)", "alias": "water_stress" },
        { "expression": "PTU * water_stress * cold_stress * radiation_stress * et0_stress", "alias": "PTU_adjusted" }
    ]
}'

結果:

forecasted_at,forecasted_time,lat,lon,name,PTU,PTU_adjusted,base_temperature,blister_threshold,cold_stress,cold_stress_recovery_temperature,cold_stress_threshold,delta,dent_threshold,dough_threshold,dsw_radiation,ea,emergence_threshold,es,et0,et0_stress,field_capacity,gamma,ground_heat_flux,humidity,maturity_threshold,max_et0_threshold,milk_threshold,net_radiation,radiation_stress,silking_threshold,soil_moisture,tasseling_threshold,temperature,ulw_radiation,useful_radiation_cutoff,vpd,water_stress,wilting_point,wind
2024-05-01T02:00:00Z,2024-05-01T02:00:00Z,42.0347,-93.6200,Iowa,0.0000,0.0000,10,1800,1,5,0,0.1177,2700,2400,0.0000,1.5558,120,1.8455,0,1,0.3000,0.0660,0.1440,0.8430,2900,0.3500,2100,-1.3260,0.0000,1500,0.2490,1300,16.2332,1.3260,0.2500,0.2898,0.6600,0.1500,1.9666
2024-05-01T03:00:00Z,2024-05-01T03:00:00Z,42.0347,-93.6200,Iowa,0.0000,0.0000,10,1800,1,5,0,0.1138,2700,2400,0.0000,1.5708,120,1.7769,0,1,0.3000,0.0660,0.0360,0.8840,2900,0.3500,2100,-1.3156,0.0000,1500,0.2490,1300,15.6400,1.3156,0.2500,0.2061,0.6600,0.1500,2.9006
2024-05-01T00:00:00Z,2024-05-01T00:00:00Z,42.0347,-93.6200,Iowa,0.0641,0.0026,10,1800,1,5,0,0.1265,2700,2400,0.0155,1.5834,120,2.0043,0,1,0.3000,0.0660,0.0720,0.7900,2900,0.3500,2100,-1.3388,0.0619,1500,0.2500,1300,17.5343,1.3508,0.2500,0.4209,0.6667,0.1500,1.6368
2024-05-01T04:00:00Z,2024-05-01T04:00:00Z,42.0347,-93.6200,Iowa,0.0000,0.0000,10,1800,1,5,0,0.1130,2700,2400,0.0000,1.6018,120,1.7622,0,1,0.3000,0.0660,0.2160,0.9090,2900,0.3500,2100,-1.3189,0.0000,1500,0.2490,1300,15.5103,1.3189,0.2500,0.1604,0.6600,0.1500,4.0706
2024-05-01T06:00:00Z,2024-05-01T06:00:00Z,42.0347,-93.6200,Iowa,0.0000,0.0000,10,1800,1,5,0,0.1031,2700,2400,0.0000,1.3385,120,1.5878,0,1,0.3000,0.0660,0.2880,0.8430,2900,0.3500,2100,-1.2832,0.0000,1500,0.2480,1300,13.8959,1.2832,0.2500,0.2493,0.6533,0.1500,4.6756
2024-05-01T07:00:00Z,2024-05-01T07:00:00Z,42.0347,-93.6200,Iowa,0.0000,0.0000,10,1800,1,5,0,0.0965,2700,2400,0.0000,1.1602,120,1.4724,0,1,0.3000,0.0660,0.3240,0.7880,2900,0.3500,2100,-1.2630,0.0000,1500,0.2480,1300,12.7389,1.2630,0.2500,0.3121,0.6533,0.1500,4.0216
2024-05-01T09:00:00Z,2024-05-01T09:00:00Z,42.0347,-93.6200,Iowa,0.0000,0.0000,10,1800,1,5,0,0.0839,2700,2400,0.0000,1.0344,120,1.2554,0,1,0.3000,0.0660,0.2520,0.8240,2900,0.3500,2100,-1.2218,0.0000,1500,0.2480,1300,10.3302,1.2218,0.2500,0.2210,0.6533,0.1500,2.1057
2024-05-01T05:00:00Z,2024-05-01T05:00:00Z,42.0347,-93.6200,Iowa,0.0000,0.0000,10,1800,1,5,0,0.1050,2700,2400,0.0000,1.4488,120,1.6205,0,1,0.3000,0.0660,0.2520,0.8940,2900,0.3500,2100,-1.2927,0.0000,1500,0.2490,1300,14.2103,1.2927,0.2500,0.1718,0.6600,0.1500,3.7411
...