Spaces:
Sleeping
Sleeping
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,1233 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import requests
|
3 |
+
import json
|
4 |
+
import os
|
5 |
+
|
6 |
+
# --- Configuration ---
|
7 |
+
# IMPORTANT: Replace with your OpenWeatherMap API Key
|
8 |
+
# You can get a free API key by signing up at https://openweathermap.org/api
|
9 |
+
OPENWEATHER_API_KEY = "c37c7e33f31484e45dd7be1f53c228e3"
|
10 |
+
|
11 |
+
# OpenWeatherMap API Endpoints
|
12 |
+
GEOCODING_URL = "http://api.openweathermap.org/geo/1.0/direct"
|
13 |
+
WEATHER_URL = "https://api.openweathermap.org/data/2.5/weather"
|
14 |
+
|
15 |
+
# --- Crop Data and Intercropping Rules ---
|
16 |
+
|
17 |
+
# Define the base crops
|
18 |
+
BASE_CROPS = [
|
19 |
+
"Barnyard Millet",
|
20 |
+
"Finger Millet",
|
21 |
+
"Foxtail Millet",
|
22 |
+
"Kodo Millet",
|
23 |
+
"Little Millet",
|
24 |
+
"Pearl Millet",
|
25 |
+
"Proso Millet",
|
26 |
+
"Maize",
|
27 |
+
]
|
28 |
+
|
29 |
+
# Define intercropping suitability, risk, harvest complexity, and market potential
|
30 |
+
# Added new parameters: temp_min, temp_max, humidity_min, humidity_max, soil_preference
|
31 |
+
# These values are illustrative and should be refined with agricultural expert input for real-world application.
|
32 |
+
INTERCROP_RULES = {
|
33 |
+
"Barnyard Millet": [
|
34 |
+
{
|
35 |
+
"partner": "Cowpea",
|
36 |
+
"risk": "Low",
|
37 |
+
"harvest_complexity": "Medium",
|
38 |
+
"market_potential": "Medium",
|
39 |
+
"temp_min": 20,
|
40 |
+
"temp_max": 35,
|
41 |
+
"humidity_min": 60,
|
42 |
+
"humidity_max": 90,
|
43 |
+
"soil_preference": ["Loamy", "Sandy Loam"],
|
44 |
+
},
|
45 |
+
{
|
46 |
+
"partner": "Green Gram",
|
47 |
+
"risk": "Low",
|
48 |
+
"harvest_complexity": "Medium",
|
49 |
+
"market_potential": "Medium",
|
50 |
+
"temp_min": 25,
|
51 |
+
"temp_max": 35,
|
52 |
+
"humidity_min": 60,
|
53 |
+
"humidity_max": 80,
|
54 |
+
"soil_preference": ["Loamy", "Sandy Loam"],
|
55 |
+
},
|
56 |
+
{
|
57 |
+
"partner": "Pigeon Pea",
|
58 |
+
"risk": "Medium",
|
59 |
+
"harvest_complexity": "High",
|
60 |
+
"market_potential": "Medium",
|
61 |
+
"temp_min": 20,
|
62 |
+
"temp_max": 40,
|
63 |
+
"humidity_min": 50,
|
64 |
+
"humidity_max": 85,
|
65 |
+
"soil_preference": ["Sandy Loam", "Loamy"],
|
66 |
+
},
|
67 |
+
{
|
68 |
+
"partner": "Groundnut",
|
69 |
+
"risk": "Medium",
|
70 |
+
"harvest_complexity": "Medium",
|
71 |
+
"market_potential": "High",
|
72 |
+
"temp_min": 25,
|
73 |
+
"temp_max": 30,
|
74 |
+
"humidity_min": 60,
|
75 |
+
"humidity_max": 80,
|
76 |
+
"soil_preference": ["Sandy", "Sandy Loam"],
|
77 |
+
},
|
78 |
+
],
|
79 |
+
"Finger Millet": [
|
80 |
+
{
|
81 |
+
"partner": "Pigeon Pea",
|
82 |
+
"risk": "Medium",
|
83 |
+
"harvest_complexity": "High",
|
84 |
+
"market_potential": "Medium",
|
85 |
+
"temp_min": 20,
|
86 |
+
"temp_max": 40,
|
87 |
+
"humidity_min": 50,
|
88 |
+
"humidity_max": 85,
|
89 |
+
"soil_preference": ["Sandy Loam", "Loamy"],
|
90 |
+
},
|
91 |
+
{
|
92 |
+
"partner": "Groundnut",
|
93 |
+
"risk": "Medium",
|
94 |
+
"harvest_complexity": "Medium",
|
95 |
+
"market_potential": "High",
|
96 |
+
"temp_min": 25,
|
97 |
+
"temp_max": 30,
|
98 |
+
"humidity_min": 60,
|
99 |
+
"humidity_max": 80,
|
100 |
+
"soil_preference": ["Sandy", "Sandy Loam"],
|
101 |
+
},
|
102 |
+
{
|
103 |
+
"partner": "Soybean",
|
104 |
+
"risk": "Low",
|
105 |
+
"harvest_complexity": "Medium",
|
106 |
+
"market_potential": "High",
|
107 |
+
"temp_min": 20,
|
108 |
+
"temp_max": 30,
|
109 |
+
"humidity_min": 50,
|
110 |
+
"humidity_max": 75,
|
111 |
+
"soil_preference": ["Loamy", "Clay Loam"],
|
112 |
+
},
|
113 |
+
{
|
114 |
+
"partner": "Field Bean",
|
115 |
+
"risk": "Low",
|
116 |
+
"harvest_complexity": "Medium",
|
117 |
+
"market_potential": "Medium",
|
118 |
+
"temp_min": 20,
|
119 |
+
"temp_max": 30,
|
120 |
+
"humidity_min": 60,
|
121 |
+
"humidity_max": 85,
|
122 |
+
"soil_preference": ["Loamy", "Clay Loam"],
|
123 |
+
},
|
124 |
+
],
|
125 |
+
"Foxtail Millet": [
|
126 |
+
{
|
127 |
+
"partner": "Green Gram",
|
128 |
+
"risk": "Low",
|
129 |
+
"harvest_complexity": "Medium",
|
130 |
+
"market_potential": "Medium",
|
131 |
+
"temp_min": 25,
|
132 |
+
"temp_max": 35,
|
133 |
+
"humidity_min": 60,
|
134 |
+
"humidity_max": 80,
|
135 |
+
"soil_preference": ["Loamy", "Sandy Loam"],
|
136 |
+
},
|
137 |
+
{
|
138 |
+
"partner": "Black Gram",
|
139 |
+
"risk": "Low",
|
140 |
+
"harvest_complexity": "Medium",
|
141 |
+
"market_potential": "Medium",
|
142 |
+
"temp_min": 25,
|
143 |
+
"temp_max": 35,
|
144 |
+
"humidity_min": 60,
|
145 |
+
"humidity_max": 80,
|
146 |
+
"soil_preference": ["Loamy", "Sandy Loam"],
|
147 |
+
},
|
148 |
+
{
|
149 |
+
"partner": "Pigeon Pea",
|
150 |
+
"risk": "Medium",
|
151 |
+
"harvest_complexity": "High",
|
152 |
+
"market_potential": "Medium",
|
153 |
+
"temp_min": 20,
|
154 |
+
"temp_max": 40,
|
155 |
+
"humidity_min": 50,
|
156 |
+
"humidity_max": 85,
|
157 |
+
"soil_preference": ["Sandy Loam", "Loamy"],
|
158 |
+
},
|
159 |
+
{
|
160 |
+
"partner": "Sesame",
|
161 |
+
"risk": "Medium",
|
162 |
+
"harvest_complexity": "Medium",
|
163 |
+
"market_potential": "Medium",
|
164 |
+
"temp_min": 25,
|
165 |
+
"temp_max": 35,
|
166 |
+
"humidity_min": 50,
|
167 |
+
"humidity_max": 70,
|
168 |
+
"soil_preference": ["Sandy Loam", "Loamy"],
|
169 |
+
},
|
170 |
+
],
|
171 |
+
"Kodo Millet": [
|
172 |
+
{
|
173 |
+
"partner": "Cowpea",
|
174 |
+
"risk": "Low",
|
175 |
+
"harvest_complexity": "Medium",
|
176 |
+
"market_potential": "Medium",
|
177 |
+
"temp_min": 20,
|
178 |
+
"temp_max": 35,
|
179 |
+
"humidity_min": 60,
|
180 |
+
"humidity_max": 90,
|
181 |
+
"soil_preference": ["Loamy", "Sandy Loam"],
|
182 |
+
},
|
183 |
+
{
|
184 |
+
"partner": "Horse Gram",
|
185 |
+
"risk": "Low",
|
186 |
+
"harvest_complexity": "Medium",
|
187 |
+
"market_potential": "Low",
|
188 |
+
"temp_min": 20,
|
189 |
+
"temp_max": 30,
|
190 |
+
"humidity_min": 60,
|
191 |
+
"humidity_max": 80,
|
192 |
+
"soil_preference": ["Sandy", "Lateritic"],
|
193 |
+
},
|
194 |
+
{
|
195 |
+
"partner": "Castor",
|
196 |
+
"risk": "Medium",
|
197 |
+
"harvest_complexity": "Medium",
|
198 |
+
"market_potential": "Low",
|
199 |
+
"temp_min": 20,
|
200 |
+
"temp_max": 30,
|
201 |
+
"humidity_min": 50,
|
202 |
+
"humidity_max": 70,
|
203 |
+
"soil_preference": ["Sandy Loam", "Lateritic"],
|
204 |
+
},
|
205 |
+
],
|
206 |
+
"Little Millet": [
|
207 |
+
{
|
208 |
+
"partner": "Green Gram",
|
209 |
+
"risk": "Low",
|
210 |
+
"harvest_complexity": "Medium",
|
211 |
+
"market_potential": "Medium",
|
212 |
+
"temp_min": 25,
|
213 |
+
"temp_max": 35,
|
214 |
+
"humidity_min": 60,
|
215 |
+
"humidity_max": 80,
|
216 |
+
"soil_preference": ["Loamy", "Sandy Loam"],
|
217 |
+
},
|
218 |
+
{
|
219 |
+
"partner": "Cowpea",
|
220 |
+
"risk": "Low",
|
221 |
+
"harvest_complexity": "Medium",
|
222 |
+
"market_potential": "Medium",
|
223 |
+
"temp_min": 20,
|
224 |
+
"temp_max": 35,
|
225 |
+
"humidity_min": 60,
|
226 |
+
"humidity_max": 90,
|
227 |
+
"soil_preference": ["Loamy", "Sandy Loam"],
|
228 |
+
},
|
229 |
+
{
|
230 |
+
"partner": "Pigeon Pea",
|
231 |
+
"risk": "Medium",
|
232 |
+
"harvest_complexity": "High",
|
233 |
+
"market_potential": "Medium",
|
234 |
+
"temp_min": 20,
|
235 |
+
"temp_max": 40,
|
236 |
+
"humidity_min": 50,
|
237 |
+
"humidity_max": 85,
|
238 |
+
"soil_preference": ["Sandy Loam", "Loamy"],
|
239 |
+
},
|
240 |
+
],
|
241 |
+
"Pearl Millet": [
|
242 |
+
{
|
243 |
+
"partner": "Cluster Bean",
|
244 |
+
"risk": "Low",
|
245 |
+
"harvest_complexity": "Medium",
|
246 |
+
"market_potential": "Medium",
|
247 |
+
"temp_min": 25,
|
248 |
+
"temp_max": 35,
|
249 |
+
"humidity_min": 50,
|
250 |
+
"humidity_max": 70,
|
251 |
+
"soil_preference": ["Sandy", "Sandy Loam"],
|
252 |
+
},
|
253 |
+
{
|
254 |
+
"partner": "Moth Bean",
|
255 |
+
"risk": "Low",
|
256 |
+
"harvest_complexity": "Medium",
|
257 |
+
"market_potential": "Medium",
|
258 |
+
"temp_min": 28,
|
259 |
+
"temp_max": 40,
|
260 |
+
"humidity_min": 40,
|
261 |
+
"humidity_max": 60,
|
262 |
+
"soil_preference": ["Sandy", "Sandy Loam"],
|
263 |
+
},
|
264 |
+
{
|
265 |
+
"partner": "Pigeon Pea",
|
266 |
+
"risk": "Low",
|
267 |
+
"harvest_complexity": "High",
|
268 |
+
"market_potential": "Medium",
|
269 |
+
"temp_min": 20,
|
270 |
+
"temp_max": 40,
|
271 |
+
"humidity_min": 50,
|
272 |
+
"humidity_max": 85,
|
273 |
+
"soil_preference": ["Sandy Loam", "Loamy"],
|
274 |
+
},
|
275 |
+
{
|
276 |
+
"partner": "Groundnut",
|
277 |
+
"risk": "Medium",
|
278 |
+
"harvest_complexity": "Medium",
|
279 |
+
"market_potential": "High",
|
280 |
+
"temp_min": 25,
|
281 |
+
"temp_max": 30,
|
282 |
+
"humidity_min": 60,
|
283 |
+
"humidity_max": 80,
|
284 |
+
"soil_preference": ["Sandy", "Sandy Loam"],
|
285 |
+
},
|
286 |
+
],
|
287 |
+
"Proso Millet": [
|
288 |
+
{
|
289 |
+
"partner": "Green Gram",
|
290 |
+
"risk": "Low",
|
291 |
+
"harvest_complexity": "Medium",
|
292 |
+
"market_potential": "Medium",
|
293 |
+
"temp_min": 25,
|
294 |
+
"temp_max": 35,
|
295 |
+
"humidity_min": 60,
|
296 |
+
"humidity_max": 80,
|
297 |
+
"soil_preference": ["Loamy", "Sandy Loam"],
|
298 |
+
},
|
299 |
+
{
|
300 |
+
"partner": "Black Gram",
|
301 |
+
"risk": "Low",
|
302 |
+
"harvest_complexity": "Medium",
|
303 |
+
"market_potential": "Medium",
|
304 |
+
"temp_min": 25,
|
305 |
+
"temp_max": 35,
|
306 |
+
"humidity_min": 60,
|
307 |
+
"humidity_max": 80,
|
308 |
+
"soil_preference": ["Loamy", "Sandy Loam"],
|
309 |
+
},
|
310 |
+
{
|
311 |
+
"partner": "Cowpea",
|
312 |
+
"risk": "Low",
|
313 |
+
"harvest_complexity": "Medium",
|
314 |
+
"market_potential": "Medium",
|
315 |
+
"temp_min": 20,
|
316 |
+
"temp_max": 35,
|
317 |
+
"humidity_min": 60,
|
318 |
+
"humidity_max": 90,
|
319 |
+
"soil_preference": ["Loamy", "Sandy Loam"],
|
320 |
+
},
|
321 |
+
],
|
322 |
+
"Maize": [
|
323 |
+
{
|
324 |
+
"partner": "Soybean",
|
325 |
+
"risk": "Low",
|
326 |
+
"harvest_complexity": "Medium",
|
327 |
+
"market_potential": "High",
|
328 |
+
"temp_min": 20,
|
329 |
+
"temp_max": 30,
|
330 |
+
"humidity_min": 50,
|
331 |
+
"humidity_max": 75,
|
332 |
+
"soil_preference": ["Loamy", "Clay Loam"],
|
333 |
+
},
|
334 |
+
{
|
335 |
+
"partner": "Cowpea",
|
336 |
+
"risk": "Low",
|
337 |
+
"harvest_complexity": "Low",
|
338 |
+
"market_potential": "Medium",
|
339 |
+
"temp_min": 20,
|
340 |
+
"temp_max": 35,
|
341 |
+
"humidity_min": 60,
|
342 |
+
"humidity_max": 90,
|
343 |
+
"soil_preference": ["Loamy", "Sandy Loam"],
|
344 |
+
},
|
345 |
+
{
|
346 |
+
"partner": "Pigeon Pea",
|
347 |
+
"risk": "Medium",
|
348 |
+
"harvest_complexity": "Medium",
|
349 |
+
"market_potential": "Medium",
|
350 |
+
"temp_min": 20,
|
351 |
+
"temp_max": 40,
|
352 |
+
"humidity_min": 50,
|
353 |
+
"humidity_max": 85,
|
354 |
+
"soil_preference": ["Sandy Loam", "Loamy"],
|
355 |
+
},
|
356 |
+
{
|
357 |
+
"partner": "Green Gram",
|
358 |
+
"risk": "Low",
|
359 |
+
"harvest_complexity": "Low",
|
360 |
+
"market_potential": "Medium",
|
361 |
+
"temp_min": 25,
|
362 |
+
"temp_max": 35,
|
363 |
+
"humidity_min": 60,
|
364 |
+
"humidity_max": 80,
|
365 |
+
"soil_preference": ["Loamy", "Sandy Loam"],
|
366 |
+
},
|
367 |
+
{
|
368 |
+
"partner": "Pumpkin",
|
369 |
+
"risk": "Medium",
|
370 |
+
"harvest_complexity": "Medium",
|
371 |
+
"market_potential": "Medium",
|
372 |
+
"temp_min": 18,
|
373 |
+
"temp_max": 30,
|
374 |
+
"humidity_min": 60,
|
375 |
+
"humidity_max": 90,
|
376 |
+
"soil_preference": ["Loamy", "Clay Loam"],
|
377 |
+
},
|
378 |
+
],
|
379 |
+
}
|
380 |
+
|
381 |
+
# Define available soil types
|
382 |
+
SOIL_TYPES = [
|
383 |
+
"Sandy",
|
384 |
+
"Loamy",
|
385 |
+
"Clay",
|
386 |
+
"Sandy Loam",
|
387 |
+
"Clay Loam",
|
388 |
+
"Lateritic",
|
389 |
+
"Alluvial",
|
390 |
+
]
|
391 |
+
|
392 |
+
# --- Translation Dictionaries ---
|
393 |
+
TRANSLATIONS = {
|
394 |
+
"English": {
|
395 |
+
"title": "🌾 Intercrop Optimizer 🌾",
|
396 |
+
"description": 'This tool helps you explore suitable intercropping partners for common Indian millets and maize. It considers current water availability, temperature, humidity, and your specified soil type based on your location (using OpenWeatherMap API) and provides insights into risk, harvest complexity, and market potential for each combination.\n\n**Instructions:**\n1. Select your primary base crop from the dropdown.\n2. Enter the city and country for your farming location (e.g., `Delhi, India`).\n3. Select your soil type.\n4. Click "Optimize Intercrops" to get suggestions.\n\n**Note:** This is a simplified model. Actual farming practices require detailed local knowledge, soil testing, and expert advice.',
|
397 |
+
"api_key_warning": "\n\n**⚠️ OpenWeatherMap API Key is NOT set!** Weather-based suitability will be limited. Please replace `'YOUR_OPENWEATHER_API_KEY'` in the code with your actual key.",
|
398 |
+
"select_base_crop": "Select Base Crop",
|
399 |
+
"enter_location": "Enter Location (City, Country)",
|
400 |
+
"select_soil_type": "Select Soil Type",
|
401 |
+
"optimize_button": "Optimize Intercrops",
|
402 |
+
"results_title": "🌱 Intercrop Optimizer Results",
|
403 |
+
"base_crop_label": "Base Crop",
|
404 |
+
"location_label": "Location",
|
405 |
+
"weather_conditions_label": "Current Weather Conditions:",
|
406 |
+
"water_availability_label": "Water Availability Status",
|
407 |
+
"temperature_label": "Temperature",
|
408 |
+
"humidity_label": "Humidity",
|
409 |
+
"soil_type_label": "Soil Type",
|
410 |
+
"suggested_partners_title": "Suggested Intercropping Partners:",
|
411 |
+
"note_guidelines": "Below are potential intercropping partners for {}, with estimated characteristics.\n*Note: These are general guidelines. Local soil conditions, specific crop varieties, and detailed climate data can significantly impact actual results.*",
|
412 |
+
"table_headers": [
|
413 |
+
"Intercrop Partner",
|
414 |
+
"Risk",
|
415 |
+
"Harvest Complexity",
|
416 |
+
"Market Potential",
|
417 |
+
"Overall Suitability",
|
418 |
+
],
|
419 |
+
"error_api_missing": "## ⚠️ API Key Missing!\nPlease obtain an OpenWeatherMap API key and replace `'YOUR_OPENWEATHER_API_KEY'` in the Python code to enable weather-based recommendations.",
|
420 |
+
"error_location_not_found": "## ⚠️ Error: Could not find coordinates for '{}'. Please check the spelling.",
|
421 |
+
"no_suggestions_found": "### No specific intercropping suggestions found for {} yet.",
|
422 |
+
"unknown": "Unknown",
|
423 |
+
"unknown_weather_data": "Unknown (Weather data unavailable)",
|
424 |
+
"high": "High",
|
425 |
+
"medium": "Medium",
|
426 |
+
"low": "Low",
|
427 |
+
"suitable": "Suitable",
|
428 |
+
"partially_suitable": "Partially Suitable",
|
429 |
+
"not_suitable": "Not Suitable",
|
430 |
+
"crop_names": {
|
431 |
+
"Barnyard Millet": "Barnyard Millet",
|
432 |
+
"Finger Millet": "Finger Millet",
|
433 |
+
"Foxtail Millet": "Foxtail Millet",
|
434 |
+
"Kodo Millet": "Kodo Millet",
|
435 |
+
"Little Millet": "Little Millet",
|
436 |
+
"Pearl Millet": "Pearl Millet",
|
437 |
+
"Proso Millet": "Proso Millet",
|
438 |
+
"Maize": "Maize",
|
439 |
+
"Cowpea": "Cowpea",
|
440 |
+
"Green Gram": "Green Gram",
|
441 |
+
"Pigeon Pea": "Pigeon Pea",
|
442 |
+
"Groundnut": "Groundnut",
|
443 |
+
"Soybean": "Soybean",
|
444 |
+
"Field Bean": "Field Bean",
|
445 |
+
"Black Gram": "Black Gram",
|
446 |
+
"Sesame": "Sesame",
|
447 |
+
"Horse Gram": "Horse Gram",
|
448 |
+
"Castor": "Castor",
|
449 |
+
"Cluster Bean": "Cluster Bean",
|
450 |
+
"Moth Bean": "Moth Bean",
|
451 |
+
"Pumpkin": "Pumpkin",
|
452 |
+
},
|
453 |
+
"soil_types": {
|
454 |
+
"Sandy": "Sandy",
|
455 |
+
"Loamy": "Loamy",
|
456 |
+
"Clay": "Clay",
|
457 |
+
"Sandy Loam": "Sandy Loam",
|
458 |
+
"Clay Loam": "Clay Loam",
|
459 |
+
"Lateritic": "Lateritic",
|
460 |
+
"Alluvial": "Alluvial",
|
461 |
+
},
|
462 |
+
},
|
463 |
+
"Hindi": {
|
464 |
+
"title": "🌾 अंतर्फसल अनुकूलक 🌾",
|
465 |
+
"description": 'यह उपकरण आपको सामान्य भारतीय बाजरा और मक्का के लिए उपयुक्त अंतर्फसल भागीदारों का पता लगाने में मदद करता है। यह आपके निर्दिष्ट स्थान (ओपनवेदरमैप एपीआई का उपयोग करके) के आधार पर वर्तमान जल उपलब्धता, तापमान, आर्द्रता और आपकी मिट्टी के प्रकार पर विचार करता है और प्रत्येक संयोजन के लिए जोखिम, कटाई की जटिलता और बाजार क्षमता में अंतर्दृष्टि प्रदान करता है।\n\n**निर्देश:**\n1. ड्रॉपडाउन से अपनी प्राथमिक आधार फसल चुनें।\n2. अपने कृषि स्थान के लिए शहर और देश दर्ज करें (उदाहरण के लिए, `धमपुर, भारत`)।\n3. अपनी मिट्टी का प्रकार चुनें।\n4. सुझाव प्राप्त करने के लिए "अंतर्फसल अनुकूलित करें" पर क्लिक करें।\n\n**नोट:** यह एक सरलीकृत मॉडल है। वास्तविक कृषि पद्धतियों के लिए विस्तृत स्थानीय ज्ञान, मिट्टी परीक्षण और विशेषज्ञ सलाह की आवश्यकता होती है।',
|
466 |
+
"api_key_warning": "\n\n**⚠️ ओपनवेदरमैप एपीआई कुंजी सेट नहीं है!** मौसम-आधारित उपयुक्तता सीमित होगी। कृपया कोड में `'YOUR_OPENWEATHER_API_KEY'` को अपनी वास्तविक कुंजी से बदलें।",
|
467 |
+
"select_base_crop": "आधार फसल चुनें",
|
468 |
+
"enter_location": "स्थान दर्ज करें (शहर, देश)",
|
469 |
+
"select_soil_type": "मिट्टी का प्रकार चुनें",
|
470 |
+
"optimize_button": "अंतर्फसल अनुकूलित करें",
|
471 |
+
"results_title": "🌱 अंतर्फसल अनुकूलक परिणाम",
|
472 |
+
"base_crop_label": "आधार फसल",
|
473 |
+
"location_label": "स्थान",
|
474 |
+
"weather_conditions_label": "वर्तमान मौसम की स्थिति:",
|
475 |
+
"water_availability_label": "जल उपलब्धता स्थिति",
|
476 |
+
"temperature_label": "तापमान",
|
477 |
+
"humidity_label": "आर्द्रता",
|
478 |
+
"soil_type_label": "मिट्टी का प्रकार",
|
479 |
+
"suggested_partners_title": "सुझाए गए अंतर्फसल भागीदार:",
|
480 |
+
"note_guidelines": "{} के लिए संभावित अंतर्फसल भागीदार नीचे दिए गए हैं, अनुमानित विशेषताओं के साथ।\n*नोट: ये सामान्य दिशानिर्देश हैं। स्थानीय मिट्टी की स्थिति, विशिष्ट फसल किस्में और विस्तृत जलवायु डेटा वास्तविक परिणामों को महत्वपूर्ण रूप से प्रभावित कर सकते हैं।*",
|
481 |
+
"table_headers": [
|
482 |
+
"अंतर्फसल भागीदार",
|
483 |
+
"जोखिम",
|
484 |
+
"कटाई की जटिलता",
|
485 |
+
"बाजार क्षमता",
|
486 |
+
"कुल उपयुक्तता",
|
487 |
+
],
|
488 |
+
"error_api_missing": "## ⚠️ एपीआई कुंजी गायब!\nकृपया एक ओपनवेदरमैप एपीआई कुंजी प्राप्त करें और मौसम-आधारित सिफारिशों को सक्षम करने के लिए पायथन कोड में `'YOUR_OPENWEATHER_API_KEY'` को अपनी वास्तविक कुंजी से बदलें।",
|
489 |
+
"error_location_not_found": "## ⚠️ त्रुटि: '{}' के लिए निर्देशांक नहीं मिल सके। कृपया वर्तनी जांचें।",
|
490 |
+
"no_suggestions_found": "### {} के लिए कोई विशिष्ट अंतर्फसल सुझाव नहीं मिला।",
|
491 |
+
"unknown": "अज्ञात",
|
492 |
+
"unknown_weather_data": "अज्ञात (मौसम डेटा अनुपलब्ध)",
|
493 |
+
"high": "उच्च",
|
494 |
+
"medium": "मध्यम",
|
495 |
+
"low": "कम",
|
496 |
+
"suitable": "उपयुक्त",
|
497 |
+
"partially_suitable": "आंशिक रूप से उपयुक्त",
|
498 |
+
"not_suitable": "उपयुक्त नहीं",
|
499 |
+
"crop_names": {
|
500 |
+
"Barnyard Millet": "सनवा बाजरा",
|
501 |
+
"Finger Millet": "रागी",
|
502 |
+
"Foxtail Millet": "कंगनी बाजरा",
|
503 |
+
"Kodo Millet": "कोदो बाजरा",
|
504 |
+
"Little Millet": "कुटकी बाजरा",
|
505 |
+
"Pearl Millet": "बाजरा",
|
506 |
+
"Proso Millet": "चेना बाजरा",
|
507 |
+
"Maize": "मक्का",
|
508 |
+
"Cowpea": "लोबिया",
|
509 |
+
"Green Gram": "मूंग",
|
510 |
+
"Pigeon Pea": "अरहर दाल",
|
511 |
+
"Groundnut": "मूंगफली",
|
512 |
+
"Soybean": "सोयाबीन",
|
513 |
+
"Field Bean": "सेम",
|
514 |
+
"Black Gram": "उड़द",
|
515 |
+
"Sesame": "तिल",
|
516 |
+
"Horse Gram": "कुलथी",
|
517 |
+
"Castor": "अरंडी",
|
518 |
+
"Cluster Bean": "ग्वार फली",
|
519 |
+
"Moth Bean": "मोठ",
|
520 |
+
"Pumpkin": "कद्दू",
|
521 |
+
},
|
522 |
+
"soil_types": {
|
523 |
+
"Sandy": "रेतीली",
|
524 |
+
"Loamy": "दोमट",
|
525 |
+
"Clay": "चिकनी",
|
526 |
+
"Sandy Loam": "रेतीली दोमट",
|
527 |
+
"Clay Loam": "चिकनी दोमट",
|
528 |
+
"Lateritic": "लैटेराइट",
|
529 |
+
"Alluvial": "जलोढ़",
|
530 |
+
},
|
531 |
+
},
|
532 |
+
"Bengali": {
|
533 |
+
"title": "🌾 আন্তঃশস্য অপটিমাইজার 🌾",
|
534 |
+
"description": 'এই সরঞ্জামটি আপনাকে সাধারণ ভারতীয় বাজরা এবং ভুট্টার জন্য উপযুক্ত আন্তঃশস্য অংশীদার অন্বেষণ করতে সহায়তা করে। এটি আপনার নির্দিষ্ট অবস্থানের (ওপেনওয়েদারম্যাপ এপিআই ব্যবহার করে) উপর ভিত্তি করে বর্তমান জলের প্রাপ্যতা, তাপমাত্রা, আর্দ্রতা এবং আপনার মাটির ধরন বিবেচনা করে এবং প্রতিটি সংমিশ্রণের জন্য ঝুঁকি, ফসল কাটার জটিলতা এবং বাজার সম্ভাবনার অন্তর্দৃষ্টি প্রদান করে।\n\n**নির্দেশাবলী:**\n1. ড্রপডাউন থেকে আপনার প্রাথমিক মূল শস্য নির্বাচন করুন।\n2. আপনার কৃষিক্ষেত্রে অবস্থান (যেমন, `ধামপুর, ভারত`) জন্য শহর এবং দেশ লিখুন।\n3. আপনার মাটির ধরন নির্বাচন করুন।\n4. পরামর্শ পেতে "আন্তঃশস্য অপটিমাইজ করুন" এ ক্লিক করুন।\n\n**দ্রষ্টব্য:** এটি একটি সরলীকৃত মডেল। প্রকৃত কৃষি অনুশীলনের জন্য বিস্তারিত স্থানীয় জ্ঞান, মাটি পরীক্ষা এবং বিশেষজ্ঞের পরামর্শ প্রয়োজন।',
|
535 |
+
"api_key_warning": "\n\n**⚠️ ওপেনওয়েদারম্য��প এপিআই কী সেট করা নেই!** আবহাওয়ার উপর ভিত্তি করে উপযুক্ততা সীমিত হবে। অনুগ্রহ করে কোডে `'YOUR_OPENWEATHER_API_KEY'` কে আপনার আসল কী দিয়ে প্রতিস্থাপন করুন।",
|
536 |
+
"select_base_crop": "মূল শস্য নির্বাচন করুন",
|
537 |
+
"enter_location": "অবস্থান লিখুন (শহর, দেশ)",
|
538 |
+
"select_soil_type": "মাটির ধরন নির্বাচন করুন",
|
539 |
+
"optimize_button": "আন্তঃশস্য অপটিমাইজ করুন",
|
540 |
+
"results_title": "🌱 আন্তঃশস্য অপটিমাইজার ফলাফল",
|
541 |
+
"base_crop_label": "মূল শস্য",
|
542 |
+
"location_label": "অবস্থান",
|
543 |
+
"weather_conditions_label": "বর্তমান আবহাওয়ার অবস্থা:",
|
544 |
+
"water_availability_label": "জলের প্রাপ্যতা অবস্থা",
|
545 |
+
"temperature_label": "তাপমাত্রা",
|
546 |
+
"humidity_label": "আর্দ্রতা",
|
547 |
+
"soil_type_label": "মাটির ধরন",
|
548 |
+
"suggested_partners_title": "প্রস্তাবিত আন্তঃশস্য অংশীদার:",
|
549 |
+
"note_guidelines": "{} এর জন্য সম্ভাব্য আন্তঃশস্য অংশীদার নিচে দেওয়া হলো, আনুমানিক বৈশিষ্ট্য সহ।\n*দ্রষ্টব্য: এগুলি সাধারণ নির্দেশিকা। স্থানীয় মাটির অবস্থা, নির্দিষ্ট ফসলের জাত এবং বিস্তারিত জলবায়ু ডেটা প্রকৃত ফলাফলকে উল্লেখযোগ্যভাবে প্রভাবিত করতে পারে।*",
|
550 |
+
"table_headers": [
|
551 |
+
"আন্তঃশস্য অংশীদার",
|
552 |
+
"ঝুঁকি",
|
553 |
+
"ফসল কাটার জটিলতা",
|
554 |
+
"বাজার সম্ভাবনা",
|
555 |
+
"সামগ্রিক উপযুক্ততা",
|
556 |
+
],
|
557 |
+
"error_api_missing": "## ⚠️ এপিআই কী অনুপস্থিত!\nদয়া করে একটি ওপেনওয়েদারম্যাপ এপিআই কী সংগ্রহ করুন এবং আবহাওয়া-ভিত্তিক সুপারিশগুলি সক্ষম করতে পাইথন কোডে `'YOUR_OPENWEATHER_API_KEY'` কে আপনার আসল কী দিয়ে প্রতিস্থাপন করুন।",
|
558 |
+
"error_location_not_found": "## ⚠️ ত্রুটি: '{}' এর জন্য স্থানাঙ্ক পাওয়া যায়নি। দয়া করে বানান পরীক্ষা করুন।",
|
559 |
+
"no_suggestions_found": "### {} এর জন্য কোনো নির্দিষ্ট আন্তঃশস্য পরামর্শ পাওয়া যায়নি।",
|
560 |
+
"unknown": "অজানা",
|
561 |
+
"unknown_weather_data": "অজানা (আবহাওয়ার ডেটা অনুপলব্ধ)",
|
562 |
+
"high": "উচ্চ",
|
563 |
+
"medium": "মাঝারি",
|
564 |
+
"low": "নিম্ন",
|
565 |
+
"suitable": "উপযুক্ত",
|
566 |
+
"partially_suitable": "আংশিকভাবে উপযুক্ত",
|
567 |
+
"not_suitable": "উপযুক্ত নয়",
|
568 |
+
"crop_names": {
|
569 |
+
"Barnyard Millet": "শামা ধান",
|
570 |
+
"Finger Millet": "মাদোয়া",
|
571 |
+
"Foxtail Millet": "কাওন",
|
572 |
+
"Kodo Millet": "কোডো ধান",
|
573 |
+
"Little Millet": "কুতকি",
|
574 |
+
"Pearl Millet": "বাজরা",
|
575 |
+
"Proso Millet": "চিনা",
|
576 |
+
"Maize": "ভুট্টা",
|
577 |
+
"Cowpea": "বরবটি",
|
578 |
+
"Green Gram": "মুগ ডাল",
|
579 |
+
"Pigeon Pea": "অড়হর ডাল",
|
580 |
+
"Groundnut": "চিনাবাদাম",
|
581 |
+
"Soybean": "সয়াবিন",
|
582 |
+
"Field Bean": "শিম",
|
583 |
+
"Black Gram": "মাসকলাই",
|
584 |
+
"Sesame": "তিল",
|
585 |
+
"Horse Gram": "কুলথ",
|
586 |
+
"Castor": "রেড়ি",
|
587 |
+
"Cluster Bean": "গ্ৰাম",
|
588 |
+
"Moth Bean": "মোঠ",
|
589 |
+
"Pumpkin": "মিষ্টি কুমড়া",
|
590 |
+
},
|
591 |
+
"soil_types": {
|
592 |
+
"Sandy": "বেলে",
|
593 |
+
"Loamy": "দোআঁশ",
|
594 |
+
"Clay": "আঁশযুক্ত",
|
595 |
+
"Sandy Loam": "বেলে দ��আঁশ",
|
596 |
+
"Clay Loam": "আঁশযুক্ত দোআঁশ",
|
597 |
+
"Lateritic": "ল্যাটেরাইটিক",
|
598 |
+
"Alluvial": "পলিমাটি",
|
599 |
+
},
|
600 |
+
},
|
601 |
+
"Tamil": {
|
602 |
+
"title": "🌾 ஊடுபயிர் உகப்பாக்கி 🌾",
|
603 |
+
"description": 'இந்தக் கருவி பொதுவான இந்திய சிறுதானியங்கள் மற்றும் மக்காச்சோளத்திற்கான பொருத்தமான ஊடுபயிர் கூட்டாளர்களைக் கண்டறிய உதவுகிறது. இது நீங்கள் குறிப்பிட்ட இடத்தின் (ஓப்பன்வெதர்மேப் API ஐப் பயன்படுத்தி) தற்போதைய நீர் இருப்பு, வெப்பநிலை, ஈரப்பதம் மற்றும் உங்கள் மண் வகையை கருத்தில் கொள்கிறது மற்றும் ஒவ்வொரு கூட்டுக்கும் ஆபத்து, அறுவடை சிக்கல்தன்மை மற்றும் சந்தை திறன் பற்றிய நுண்ணறிவுகளை வழங்குகிறது.\n\n**வழிமுறைகள்:**\n1. கீழ்தோன்றும் பட்டியலிலிருந்து உங்கள் முதன்மை அடிப்படைப் பயிரைத் தேர்ந்தெடுக்கவும்.\n2. உங்கள் விவசாய இடத்திற்கான நகரம் மற்றும் நாட்டை உள்ளிடவும் (எ.கா., `தாமரம், இந்தியா`).\n3. உங்கள் மண் வகையைத் தேர்ந்தெடுக்கவும்.\n4. பரிந்துரைகளைப் பெற "ஊடுபயிர்களை மேம்படுத்து" என்பதைக் கிளிக் செய்யவும்.\n\n**குறிப்பு:** இது ஒரு எளிமைப்படுத்தப்பட்ட மாதிரி. உண்மையான விவசாய நடைமுறைகளுக்கு விரிவான உள்ளூர் அறிவு, மண் பரிசோதனை மற்றும் நிபுணர் ஆலோசனை தேவை.',
|
604 |
+
"api_key_warning": "\n\n**⚠️ ஓப்பன்வெதர்மேப் API விசை அமைக்கப்படவில்லை!** வானிலை அடிப்படையிலான பொருத்தத்தன்மை குறைவாக இருக்கும். தயவுசெய்து குறியீட்டில் `'YOUR_OPENWEATHER_API_KEY'` ஐ உங்கள் உண்மையான விசையுடன் மாற்றவும்.",
|
605 |
+
"select_base_crop": "அடிப்படைப் பயிரைத் தேர்ந்தெடுக்கவும்",
|
606 |
+
"enter_location": "இடத்தை உள்ளிடவும் (நகரம், நாடு)",
|
607 |
+
"select_soil_type": "மண் வகையைத் தேர்ந்தெடுக்கவும்",
|
608 |
+
"optimize_button": "ஊடுபயிர்களை மேம்படுத்து",
|
609 |
+
"results_title": "🌱 ஊடுபயிர் உகப்பாக்கி முடிவுகள்",
|
610 |
+
"base_crop_label": "அடிப்படைப் பயிர்",
|
611 |
+
"location_label": "இடம்",
|
612 |
+
"weather_conditions_label": "தற்போதைய வானிலை நிலைமைகள்:",
|
613 |
+
"water_availability_label": "நீர் இருப்பு நிலை",
|
614 |
+
"temperature_label": "வெப்பநிலை",
|
615 |
+
"humidity_label": "ஈரப்பதம்",
|
616 |
+
"soil_type_label": "மண் வகை",
|
617 |
+
"suggested_partners_title": "பரிந்துரைக்கப்பட்ட ஊடுபயிர் கூட்டாளர்கள்:",
|
618 |
+
"note_guidelines": "{} க்கான சாத்தியமான ஊடுபயிர் கூட்டாளர்கள் கீழே கொடுக்கப்பட்டுள்ளன, மதிப்பிடப்பட்ட பண்புகளுடன்.\n*குறிப்பு: இவை பொதுவான வழிகாட்டுதல்கள். உள்ளூர் மண் நிலைமைகள், குறிப்பிட்ட பயிர் வகைகள் மற்றும் விரிவான காலநிலை தரவு உண்மையான முடிவுகளை குறிப்பிடத்தக்க வகையில் பாதிக்கலா���்.*",
|
619 |
+
"table_headers": [
|
620 |
+
"ஊடுபயிர் கூட்டாளர்",
|
621 |
+
"ஆபத்து",
|
622 |
+
"அறுவடை சிக்கல்தன்மை",
|
623 |
+
"சந்தை திறன்",
|
624 |
+
"மொத்த பொருத்தத்தன்மை",
|
625 |
+
],
|
626 |
+
"error_api_missing": "## ⚠️ API விசை இல்லை!\nவானிலை அடிப்படையிலான பரிந்துரைகளை இயக்க ஒரு ஓப்பன்வெதர்மேப் API விசையைப் பெற்று, பைதான் குறியீட்டில் `'YOUR_OPENWEATHER_API_KEY'` ஐ உங்கள் உண்மையான விசையுடன் மாற்றவும்.",
|
627 |
+
"error_location_not_found": "## ⚠️ பிழை: '{}' க்கான ஆயத்தொலைவுகளைக் கண்டறிய முடியவில்லை. தயவுசெய்து எழுத்துப்பிழையைச் சரிபார்க்கவும்.",
|
628 |
+
"no_suggestions_found": "### {} க்கான குறிப்பிட்ட ஊடுபயிர் பரிந்துரைகள் எதுவும் கண்டறியப்படவில்லை.",
|
629 |
+
"unknown": "அறியப்படாதது",
|
630 |
+
"unknown_weather_data": "அறியப்படாதது (வானிலை தரவு கிடைக்கவில்லை)",
|
631 |
+
"high": "அதிகம்",
|
632 |
+
"medium": "நடுத்தரம்",
|
633 |
+
"low": "குறைவு",
|
634 |
+
"suitable": "பொருத்தமானது",
|
635 |
+
"partially_suitable": "ஓரளவு பொருத்தமானது",
|
636 |
+
"not_suitable": "பொருத்தமற்றது",
|
637 |
+
"crop_names": {
|
638 |
+
"Barnyard Millet": "குதிரைவாலி",
|
639 |
+
"Finger Millet": "கேழ்வரகு",
|
640 |
+
"Foxtail Millet": "தினை",
|
641 |
+
"Kodo Millet": "வரகு",
|
642 |
+
"Little Millet": "சாம",
|
643 |
+
"Pearl Millet": "கம்பு",
|
644 |
+
"Proso Millet": "பனிவரகு",
|
645 |
+
"Maize": "மக்காச்சோளம்",
|
646 |
+
"Cowpea": "காராமணி",
|
647 |
+
"Green Gram": "பச்சைப்பயறு",
|
648 |
+
"Pigeon Pea": "துவரம்பயறு",
|
649 |
+
"Groundnut": "நிலக்கடலை",
|
650 |
+
"Soybean": "சோயாபீன்",
|
651 |
+
"Field Bean": "மொச்சை",
|
652 |
+
"Black Gram": "உளுந்து",
|
653 |
+
"Sesame": "எள்",
|
654 |
+
"Horse Gram": "கொள்ளு",
|
655 |
+
"Castor": "ஆமணக்கு",
|
656 |
+
"Cluster Bean": "கொத்தவரங்காய்",
|
657 |
+
"Moth Bean": "மொச்சைப் பயறு",
|
658 |
+
"Pumpkin": "பூசணி",
|
659 |
+
},
|
660 |
+
"soil_types": {
|
661 |
+
"Sandy": "மணல்",
|
662 |
+
"Loamy": "வண்டல்",
|
663 |
+
"Clay": "களிமண்",
|
664 |
+
"Sandy Loam": "மணல் வண்டல்",
|
665 |
+
"Clay Loam": "களிமண் வண்டல்",
|
666 |
+
"Lateritic": "செம்மண்",
|
667 |
+
"Alluvial": "பள்ளத்தாக்கு மண்",
|
668 |
+
},
|
669 |
+
},
|
670 |
+
"Telugu": {
|
671 |
+
"title": "🌾 అంతరపంట ఆప్టిమైజర్ 🌾",
|
672 |
+
"description": 'ఈ సాధనం సాధారణ భారతీయ చిరుధాన్యాలు మరియు మొక్కజొన్నలకు అనువైన అంతరపంట భాగస్వాములను అన్వేషించడానికి మీకు సహాయపడుతుంది. ఇది మీరు పేర్కొన్న స్థానం (ఓపెన్వెదర్మ్యాప్ APIని ఉపయోగించి) ఆధారంగా ప్రస్తుత నీటి లభ్యత, ఉష్ణోగ్రత, తేమ మరియు మీ నేల రకాన్ని పరిగణనలోకి తీసుకుంటుంది మరియు ప్రతి కలయికకు నష్టం, పంట కోత సంక్లిష్టత మరియు మార్కెట్ సామర్థ్యంపై అంతర్దృష్టిని అందిస్తుంది.\n\n**సూచనలు:**\n1. డ్రాప్డౌన్ నుండి మీ ప్రాథమిక బేస్ పంటను ఎంచుకోండి.\n2. మీ వ్యవసాయ స్థలం (ఉదా., `ధంపూర్, ఇండియా`) కోసం నగరం మరియు దేశాన్ని నమోదు చేయండి.\n3. మీ నేల రకాన్ని ఎంచుకోండి.\n4. సూచనలను ప��ందడానికి "అంతరపంటలను ఆప్టిమైజ్ చేయి" పై క్లిక్ చేయండి.\n\n**గమనిక:** ఇది సరళీకృత నమూనా. వాస్తవ వ్యవసాయ పద్ధతులకు వివరణాత్మక స్థానిక జ్ఞానం, నేల పరీక్ష మరియు నిపుణుల సలహా అవసరం.',
|
673 |
+
"api_key_warning": "\n\n**⚠️ ఓపెన్వెదర్మ్యాప్ API కీ సెట్ చేయబడలేదు!** వాతావరణ ఆధారిత అనుకూలత పరిమితం చేయబడుతుంది. దయచేసి కోడ్లోని `'YOUR_OPENWEATHER_API_KEY'` ను మీ అసలు కీతో భర్తీ చేయండి.",
|
674 |
+
"select_base_crop": "బేస్ పంటను ఎంచుకోండి",
|
675 |
+
"enter_location": "స్థానాన్ని నమోదు చేయండి (నగరం, దేశం)",
|
676 |
+
"select_soil_type": "నేల రకాన్ని ఎంచుకోండి",
|
677 |
+
"optimize_button": "అంతరపంటలను ఆప్టిమైజ్ చేయి",
|
678 |
+
"results_title": "🌱 అంతరపంట ఆప్టిమైజర్ ఫలితాలు",
|
679 |
+
"base_crop_label": "బేస్ పంట",
|
680 |
+
"location_label": "స్థానం",
|
681 |
+
"weather_conditions_label": "ప్రస్తుత వాతావరణ పరిస్థితులు:",
|
682 |
+
"water_availability_label": "నీటి లభ్యత స్థితి",
|
683 |
+
"temperature_label": "ఉష్ణోగ్రత",
|
684 |
+
"humidity_label": "తేమ",
|
685 |
+
"soil_type_label": "నేల రకం",
|
686 |
+
"suggested_partners_title": "సూచించబడిన అంతరపంట భాగస్వాములు:",
|
687 |
+
"note_guidelines": "{} కోసం సంభావ్య అంతరపంట భాగస్వాములు క్రింద ఇవ్వబడ్డాయి, అంచనా వేసిన లక్షణాలతో.\n*గమనిక: ఇవి సాధారణ మార్గదర్శకాలు. స్థానిక నేల పరిస్థితులు, నిర్దిష్ట పంట రకాలు మరియు వివరణాత్మక వాతావరణ డేటా వాస్తవ ఫలితాలను గణనీయంగా ప్రభావితం చేయవచ్చు.*",
|
688 |
+
"table_headers": [
|
689 |
+
"అంతరపంట భాగస్వామి",
|
690 |
+
"నష్టం",
|
691 |
+
"పంట కోత సంక్లిష్టత",
|
692 |
+
"మార్కెట్ సామర్థ్యం",
|
693 |
+
"మొత్తం అనుకూలత",
|
694 |
+
],
|
695 |
+
"error_api_missing": "## ⚠️ API కీ లేదు!\nవాతావరణ ఆధారిత సిఫార్సులను ప్రారంభించడానికి ఓపెన్వెదర్మ్యాప్ API కీని పొందండి మరియు పైథాన్ కోడ్లోని `'YOUR_OPENWEATHER_API_KEY'` ను మీ అసలు కీతో భర్తీ చేయండి.",
|
696 |
+
"error_location_not_found": "## ⚠️ లోపం: '{}' కోసం కోఆర్డినేట్లను కనుగొనలేకపోయాము. దయచేసి స్పెల్లింగ్ను తనిఖీ చేయండి.",
|
697 |
+
"no_suggestions_found": "### {} కోసం ఎటువంటి అంతరపంట సూచనలు కనుగొనబడలేదు.",
|
698 |
+
"unknown": "తెలియదు",
|
699 |
+
"unknown_weather_data": "తెలియదు (వాతావరణ డేటా అందుబాటులో లేదు)",
|
700 |
+
"high": "ఎక్కువ",
|
701 |
+
"medium": "మధ్యస్థ",
|
702 |
+
"low": "తక్కువ",
|
703 |
+
"suitable": "అనుకూలం",
|
704 |
+
"partially_suitable": "పాక్షికంగా అనుకూలం",
|
705 |
+
"not_suitable": "అనుకూలం కాదు",
|
706 |
+
"crop_names": {
|
707 |
+
"Barnyard Millet": "ఊదలు",
|
708 |
+
"Finger Millet": "రాగులు",
|
709 |
+
"Foxtail Millet": "కొర్రలు",
|
710 |
+
"Kodo Millet": "అరికలు",
|
711 |
+
"Little Millet": "సామలు",
|
712 |
+
"Pearl Millet": "సజ్జలు",
|
713 |
+
"Proso Millet": "వరిగలు",
|
714 |
+
"Maize": "మొక్కజొన్న",
|
715 |
+
"Cowpea": "బొబ్బర్లు",
|
716 |
+
"Green Gram": "పెసలు",
|
717 |
+
"Pigeon Pea": "కందులు",
|
718 |
+
"Groundnut": "వేరుశెనగ",
|
719 |
+
"Soybean": "సోయాబీన్",
|
720 |
+
"Field Bean": "చిక్కుడు",
|
721 |
+
"Black Gram": "మినుములు",
|
722 |
+
"Sesame": "నువ్వులు",
|
723 |
+
"Horse Gram": "ఉలవలు",
|
724 |
+
"Castor": "ఆముదము",
|
725 |
+
"Cluster Bean": "గోరుచిక్కుడు",
|
726 |
+
"Moth Bean": "ఉలవలు",
|
727 |
+
"Pumpkin": "గుమ్మడికాయ",
|
728 |
+
},
|
729 |
+
"soil_types": {
|
730 |
+
"Sandy": "ఇసుక",
|
731 |
+
"Loamy": "గరుకు",
|
732 |
+
"Clay": "బంకమట్టి",
|
733 |
+
"Sandy Loam": "ఇసుక గరుకు",
|
734 |
+
"Clay Loam": "బంకమట్టి గరుకు",
|
735 |
+
"Lateritic": "ఎర్రమట్టి",
|
736 |
+
"Alluvial": "మెట్ట",
|
737 |
+
},
|
738 |
+
},
|
739 |
+
"Marathi": {
|
740 |
+
"title": "🌾 आंतरपीक ऑप्टिमायझर 🌾",
|
741 |
+
"description": 'हे साधन तुम्हाला सामान्य भारतीय बाजरी आणि मक्यासाठी योग्य आंतरपीक भागीदार शोधण्यात मदत करते. हे तुमच्या निर्दिष्ट स्थानावर (ओपनवेदरमॅप एपीआय वापरून) आधारित सध्याच्या पाण्याची उपलब्धता, तापमान, आर्द्रता आणि तुमच्या मातीच्या प्रकाराचा विचार करते आणि प्रत्येक संयोजनासाठी धोका, काढणीची गुंतागुंत आणि बाजारपेठेतील संभाव्यता याबद्दल अंतर्दृष्टी प्रदान करते.\n\n**सूचना:**\n1. ड्रॉपडाउनमधून तुमचे मुख्य आधार पीक निवडा.\n2. तुमच्या शेतीच्या स्थानासाठी शहर आणि देश प्रविष्ट करा (उदा. `धमपूर, भारत`).\n3. तुमच्या मातीचा प्रकार निवडा.\n4. सूचना मिळवण्यासाठी "आंतरपीक ऑप्टिमाइझ करा" वर क्लिक करा.\n\n**टीप:** हे एक सरलीकृत मॉडेल आहे. वास्तविक शेती पद्धतींसाठी तपशीलवार स्थानिक ज्ञान, माती परीक्षण आणि तज्ञांचा सल्ला आवश्यक आहे.',
|
742 |
+
"api_key_warning": "\n\n**⚠️ ओपनवेदरमॅप एपीआय की सेट नाही!** हवामान-आधारित उपयुक्तता मर्यादित असेल. कृपया कोडमधील `'YOUR_OPENWEATHER_API_KEY'` ला तुमच्या वास्तविक कीने बदला.",
|
743 |
+
"select_base_crop": "आधार पीक निवडा",
|
744 |
+
"enter_location": "स्थान प्रविष्ट करा (शहर, देश)",
|
745 |
+
"select_soil_type": "मातीचा प्रकार निवडा",
|
746 |
+
"optimize_button": "आंतरपीक ऑप्टिमाइझ करा",
|
747 |
+
"results_title": "🌱 आंतरपीक ऑप्टिमायझर परिणाम",
|
748 |
+
"base_crop_label": "आधार पीक",
|
749 |
+
"location_label": "स्थान",
|
750 |
+
"weather_conditions_label": "सध्याची हवामानाची स्थिती:",
|
751 |
+
"water_availability_label": "पाण्याची उपलब्धता स्थिती",
|
752 |
+
"temperature_label": "तापमान",
|
753 |
+
"humidity_label": "आर्द्रता",
|
754 |
+
"soil_type_label": "मातीचा प्रकार",
|
755 |
+
"suggested_partners_title": "शिफारस केलेले आंतरपीक भागीदार:",
|
756 |
+
"note_guidelines": "{} साठी संभाव्य आंतरपीक भागीदार खाली दिले आहेत, अंदाजित वैशिष्ट्यांसह.\n*टीप: हे सामान्य मार्गदर्शक तत्त्वे आहेत. स्थानिक मातीची स्थिती, विशिष्ट पिकांच्या जाती आणि तपशीलवार हवामान डेटा वास्तविक परिणामांवर लक्षणीय परिणाम करू शकतात.*",
|
757 |
+
"table_headers": [
|
758 |
+
"आंतरपीक भागीदार",
|
759 |
+
"धोका",
|
760 |
+
"काढणीची गुंतागुंत",
|
761 |
+
"बाजार क्षमता",
|
762 |
+
"एकूण ���पयुक्तता",
|
763 |
+
],
|
764 |
+
"error_api_missing": "## ⚠️ एपीआय की गहाळ आहे!\nकृपया ओपनवेदरमॅप एपीआय की मिळवा आणि हवामान-आधारित शिफारसी सक्षम करण्यासाठी पायथन कोडमधील `'YOUR_OPENWEATHER_API_KEY'` ला तुमच्या वास्तविक कीने बदला.",
|
765 |
+
"error_location_not_found": "## ⚠️ त्रुटी: '{}' साठी निर्देशांक सापडले नाहीत. कृपया स्पेलिंग तपासा.",
|
766 |
+
"no_suggestions_found": "### {} साठी कोणतीही विशिष्ट आंतरपीक सूचना सापडली नाही.",
|
767 |
+
"unknown": "अज्ञात",
|
768 |
+
"unknown_weather_data": "अज्ञात (हवामान डेटा अनुपलब्ध)",
|
769 |
+
"high": "उच्च",
|
770 |
+
"medium": "मध्यम",
|
771 |
+
"low": "कमी",
|
772 |
+
"suitable": "योग्य",
|
773 |
+
"partially_suitable": "अंशतः योग्य",
|
774 |
+
"not_suitable": "अयोग्य",
|
775 |
+
"crop_names": {
|
776 |
+
"Barnyard Millet": "वरई",
|
777 |
+
"Finger Millet": "नाचणी",
|
778 |
+
"Foxtail Millet": "राळा",
|
779 |
+
"Kodo Millet": "कोदो",
|
780 |
+
"Little Millet": "लाही",
|
781 |
+
"Pearl Millet": "बाजरी",
|
782 |
+
"Proso Millet": "बटाटा",
|
783 |
+
"Maize": "मका",
|
784 |
+
"Cowpea": "चवळी",
|
785 |
+
"Green Gram": "मूग",
|
786 |
+
"Pigeon Pea": "तूर",
|
787 |
+
"Groundnut": "शेंगदाणा",
|
788 |
+
"Soybean": "सोयाबीन",
|
789 |
+
"Field Bean": "वाल",
|
790 |
+
"Black Gram": "उडीद",
|
791 |
+
"Sesame": "तीळ",
|
792 |
+
"Horse Gram": "कुळीथ",
|
793 |
+
"Castor": "एरंड",
|
794 |
+
"Cluster Bean": "गवार",
|
795 |
+
"Moth Bean": "मटकी",
|
796 |
+
"Pumpkin": "भोपळा",
|
797 |
+
},
|
798 |
+
"soil_types": {
|
799 |
+
"Sandy": "रेती",
|
800 |
+
"Loamy": "पोयटा",
|
801 |
+
"Clay": "चिकणमाती",
|
802 |
+
"Sandy Loam": "रेती पोयटा",
|
803 |
+
"Clay Loam": "चिकणमाती पोयटा",
|
804 |
+
"Lateritic": "जांभी मृदा",
|
805 |
+
"Alluvial": "गाळाची माती",
|
806 |
+
},
|
807 |
+
},
|
808 |
+
}
|
809 |
+
|
810 |
+
|
811 |
+
def translate_text(key, lang="English"):
|
812 |
+
"""Helper function to get translated text."""
|
813 |
+
return TRANSLATIONS.get(lang, TRANSLATIONS["English"]).get(key, key)
|
814 |
+
|
815 |
+
|
816 |
+
def translate_crop_name(crop_name, lang="English"):
|
817 |
+
"""Helper function to translate crop and partner names."""
|
818 |
+
return (
|
819 |
+
TRANSLATIONS.get(lang, TRANSLATIONS["English"])
|
820 |
+
.get("crop_names", {})
|
821 |
+
.get(crop_name, crop_name)
|
822 |
+
)
|
823 |
+
|
824 |
+
|
825 |
+
def translate_soil_type(soil_type, lang="English"):
|
826 |
+
"""Helper function to translate soil type names."""
|
827 |
+
return (
|
828 |
+
TRANSLATIONS.get(lang, TRANSLATIONS["English"])
|
829 |
+
.get("soil_types", {})
|
830 |
+
.get(soil_type, soil_type)
|
831 |
+
)
|
832 |
+
|
833 |
+
|
834 |
+
# --- Weather Fetching Functions ---
|
835 |
+
|
836 |
+
|
837 |
+
def get_coordinates(location: str) -> tuple[float, float, str] | None:
|
838 |
+
"""
|
839 |
+
Fetches latitude and longitude for a given location using OpenWeatherMap Geocoding API.
|
840 |
+
Returns (lat, lon, name) or None if not found.
|
841 |
+
"""
|
842 |
+
if not OPENWEATHER_API_KEY or OPENWEATHER_API_KEY == "YOUR_OPENWEATHER_API_KEY":
|
843 |
+
print("Warning: OpenWeatherMap API key not set. Cannot fetch weather data.")
|
844 |
+
return None
|
845 |
+
|
846 |
+
try:
|
847 |
+
params = {"q": location, "limit": 1, "appid": OPENWEATHER_API_KEY}
|
848 |
+
response = requests.get(GEOCODING_URL, params=params)
|
849 |
+
response.raise_for_status() # Raise an exception for HTTP errors (4xx or 5xx)
|
850 |
+
data = response.json()
|
851 |
+
|
852 |
+
if data:
|
853 |
+
return data[0]["lat"], data[0]["lon"], data[0]["name"]
|
854 |
+
else:
|
855 |
+
return None
|
856 |
+
except requests.exceptions.RequestException as e:
|
857 |
+
print(f"Error fetching coordinates for {location}: {e}")
|
858 |
+
return None
|
859 |
+
except json.JSONDecodeError as e:
|
860 |
+
print(f"Error decoding JSON response for coordinates: {e}")
|
861 |
+
return None
|
862 |
+
|
863 |
+
|
864 |
+
def get_weather_data(lat: float, lon: float) -> dict | None:
|
865 |
+
"""
|
866 |
+
Fetches current weather data for given coordinates using OpenWeatherMap API.
|
867 |
+
Returns weather data dictionary or None if an error occurs.
|
868 |
+
"""
|
869 |
+
if not OPENWEATHER_API_KEY or OPENWEATHER_API_KEY == "YOUR_OPENWEATHER_API_KEY":
|
870 |
+
print("Warning: OpenWeatherMap API key not set. Cannot fetch weather data.")
|
871 |
+
return None
|
872 |
+
|
873 |
+
try:
|
874 |
+
params = {
|
875 |
+
"lat": lat,
|
876 |
+
"lon": lon,
|
877 |
+
"appid": OPENWEATHER_API_KEY,
|
878 |
+
"units": "metric",
|
879 |
+
}
|
880 |
+
response = requests.get(WEATHER_URL, params=params)
|
881 |
+
response.raise_for_status() # Raise an exception for HTTP errors (4xx or 5xx)
|
882 |
+
data = response.json()
|
883 |
+
return data
|
884 |
+
except requests.exceptions.RequestException as e:
|
885 |
+
print(f"Error fetching weather data for {lat},{lon}: {e}")
|
886 |
+
return None
|
887 |
+
except json.JSONDecodeError as e:
|
888 |
+
print(f"Error decoding JSON response for weather: {e}")
|
889 |
+
return None
|
890 |
+
|
891 |
+
|
892 |
+
def assess_water_availability(weather_data: dict, lang="English") -> str:
|
893 |
+
"""
|
894 |
+
Assesses water availability based on current weather data (simplified).
|
895 |
+
Returns "High", "Medium", or "Low" (translated).
|
896 |
+
"""
|
897 |
+
if not weather_data:
|
898 |
+
return translate_text("unknown", lang)
|
899 |
+
|
900 |
+
rain_volume = weather_data.get("rain", {}).get(
|
901 |
+
"1h", 0
|
902 |
+
) # Rain volume for last 1 hour, in mm
|
903 |
+
# You might want to extend this to consider '3h' or daily forecasts for better accuracy
|
904 |
+
# For a real system, historical rainfall data would be much more robust.
|
905 |
+
|
906 |
+
if rain_volume > 2.0: # Arbitrary threshold for 'high' rainfall in last hour
|
907 |
+
return translate_text("high", lang)
|
908 |
+
elif rain_volume > 0.1: # Arbitrary threshold for 'medium' rainfall
|
909 |
+
return translate_text("medium", lang)
|
910 |
+
else:
|
911 |
+
return translate_text("low", lang)
|
912 |
+
|
913 |
+
|
914 |
+
def assess_overall_suitability(
|
915 |
+
current_temp,
|
916 |
+
current_humidity,
|
917 |
+
water_availability_status,
|
918 |
+
soil_type,
|
919 |
+
crop_params,
|
920 |
+
lang="English",
|
921 |
+
) -> str:
|
922 |
+
"""
|
923 |
+
Assesses overall suitability based on climate parameters and soil type.
|
924 |
+
Returns "Suitable", "Partially Suitable", or "Not Suitable" (translated).
|
925 |
+
"""
|
926 |
+
if (
|
927 |
+
current_temp is None
|
928 |
+
or current_humidity is None
|
929 |
+
or not soil_type
|
930 |
+
or not crop_params
|
931 |
+
):
|
932 |
+
return translate_text("unknown", lang)
|
933 |
+
|
934 |
+
temp_suitable = False
|
935 |
+
if isinstance(current_temp, (int, float)): # Ensure current_temp is a number
|
936 |
+
if crop_params.get("temp_min") <= current_temp <= crop_params.get("temp_max"):
|
937 |
+
temp_suitable = True
|
938 |
+
|
939 |
+
humidity_suitable = False
|
940 |
+
if isinstance(
|
941 |
+
humidity_suitable, (int, float)
|
942 |
+
): # Ensure current_humidity is a number
|
943 |
+
if (
|
944 |
+
crop_params.get("humidity_min")
|
945 |
+
<= current_humidity
|
946 |
+
<= crop_params.get("humidity_max")
|
947 |
+
):
|
948 |
+
humidity_suitable = True
|
949 |
+
|
950 |
+
soil_suitable = False
|
951 |
+
if soil_type in crop_params.get("soil_preference", []):
|
952 |
+
soil_suitable = True
|
953 |
+
|
954 |
+
# Combine suitability factors (simplified logic)
|
955 |
+
suitability_score = 0
|
956 |
+
if temp_suitable:
|
957 |
+
suitability_score += 1
|
958 |
+
if humidity_suitable:
|
959 |
+
suitability_score += 1
|
960 |
+
if soil_suitable:
|
961 |
+
suitability_score += 1
|
962 |
+
|
963 |
+
# Water availability status directly impacts. High = +1, Medium = +0.5, Low = -1 (or similar)
|
964 |
+
if water_availability_status == translate_text("high", lang):
|
965 |
+
suitability_score += 1
|
966 |
+
elif water_availability_status == translate_text("medium", lang):
|
967 |
+
suitability_score += 0.5
|
968 |
+
else: # Low water availability
|
969 |
+
suitability_score -= 1 # Penalize for low water
|
970 |
+
|
971 |
+
if suitability_score >= 3:
|
972 |
+
return translate_text("suitable", lang)
|
973 |
+
elif suitability_score >= 1:
|
974 |
+
return translate_text("partially_suitable", lang)
|
975 |
+
else:
|
976 |
+
return translate_text("not_suitable", lang)
|
977 |
+
|
978 |
+
|
979 |
+
# --- Main Intercrop Optimization Logic ---
|
980 |
+
|
981 |
+
|
982 |
+
def intercrop_optimizer(
|
983 |
+
base_crop: str, location: str, selected_language: str, selected_soil_type: str
|
984 |
+
):
|
985 |
+
"""
|
986 |
+
Suggests intercropping options based on base crop, location, weather, soil type, and selected language.
|
987 |
+
"""
|
988 |
+
lang_data = TRANSLATIONS.get(selected_language, TRANSLATIONS["English"])
|
989 |
+
|
990 |
+
if not OPENWEATHER_API_KEY or OPENWEATHER_API_KEY == "YOUR_OPENWEATHER_API_KEY":
|
991 |
+
return gr.update(value=lang_data["error_api_missing"]), gr.update(
|
992 |
+
value=[], headers=lang_data["table_headers"]
|
993 |
+
)
|
994 |
+
|
995 |
+
location_info = get_coordinates(location)
|
996 |
+
if not location_info:
|
997 |
+
return gr.update(
|
998 |
+
value=lang_data["error_location_not_found"].format(location)
|
999 |
+
), gr.update(value=[], headers=lang_data["table_headers"])
|
1000 |
+
|
1001 |
+
lat, lon, found_location_name = location_info
|
1002 |
+
weather_data = get_weather_data(lat, lon)
|
1003 |
+
|
1004 |
+
current_temp = None
|
1005 |
+
current_humidity = None
|
1006 |
+
|
1007 |
+
if not weather_data:
|
1008 |
+
water_availability_status = lang_data["unknown_weather_data"]
|
1009 |
+
temp_celsius = lang_data["unknown"]
|
1010 |
+
humidity_status = lang_data["unknown"]
|
1011 |
+
else:
|
1012 |
+
water_availability_status = assess_water_availability(
|
1013 |
+
weather_data, selected_language
|
1014 |
+
)
|
1015 |
+
temp_value = weather_data.get("main", {}).get("temp")
|
1016 |
+
current_temp = round(temp_value, 2) if temp_value is not None else None
|
1017 |
+
temp_celsius = (
|
1018 |
+
f"{current_temp}°C" if current_temp is not None else lang_data["unknown"]
|
1019 |
+
)
|
1020 |
+
|
1021 |
+
humidity_value = weather_data.get("main", {}).get("humidity")
|
1022 |
+
current_humidity = humidity_value if humidity_value is not None else None
|
1023 |
+
humidity_status = (
|
1024 |
+
f"{current_humidity}%"
|
1025 |
+
if current_humidity is not None
|
1026 |
+
else lang_data["unknown"]
|
1027 |
+
)
|
1028 |
+
|
1029 |
+
# Get suggested intercrop partners for the base crop
|
1030 |
+
suggestions = INTERCROP_RULES.get(base_crop, [])
|
1031 |
+
|
1032 |
+
if not suggestions:
|
1033 |
+
return gr.update(
|
1034 |
+
value=lang_data["no_suggestions_found"].format(
|
1035 |
+
translate_crop_name(base_crop, selected_language)
|
1036 |
+
)
|
1037 |
+
), gr.update(value=[], headers=lang_data["table_headers"])
|
1038 |
+
|
1039 |
+
# Prepare output table
|
1040 |
+
headers = [
|
1041 |
+
translate_text(header_key, selected_language)
|
1042 |
+
for header_key in [
|
1043 |
+
"Intercrop Partner",
|
1044 |
+
"Risk",
|
1045 |
+
"Harvest Complexity",
|
1046 |
+
"Market Potential",
|
1047 |
+
"Overall Suitability",
|
1048 |
+
]
|
1049 |
+
]
|
1050 |
+
data = []
|
1051 |
+
|
1052 |
+
for s in suggestions:
|
1053 |
+
# For simplicity, we'll adjust 'Risk' based on water availability.
|
1054 |
+
current_risk_en = s["risk"]
|
1055 |
+
current_risk_translated = translate_text(
|
1056 |
+
current_risk_en.lower(), selected_language
|
1057 |
+
)
|
1058 |
+
|
1059 |
+
if water_availability_status == lang_data["low"] and current_risk_en == "Low":
|
1060 |
+
current_risk_translated = translate_text("medium", selected_language)
|
1061 |
+
elif (
|
1062 |
+
water_availability_status == lang_data["high"]
|
1063 |
+
and current_risk_en == "Medium"
|
1064 |
+
):
|
1065 |
+
current_risk_translated = translate_text("low", selected_language)
|
1066 |
+
|
1067 |
+
# Assess overall suitability
|
1068 |
+
overall_suitability = assess_overall_suitability(
|
1069 |
+
current_temp,
|
1070 |
+
current_humidity,
|
1071 |
+
water_availability_status,
|
1072 |
+
selected_soil_type,
|
1073 |
+
s, # Pass the entire partner's parameters
|
1074 |
+
selected_language,
|
1075 |
+
)
|
1076 |
+
|
1077 |
+
data.append(
|
1078 |
+
[
|
1079 |
+
translate_crop_name(s["partner"], selected_language),
|
1080 |
+
current_risk_translated,
|
1081 |
+
(
|
1082 |
+
translate_text(s["harvest_complexity"].lower(), selected_language)
|
1083 |
+
if s["harvest_complexity"].lower() in ["low", "medium", "high"]
|
1084 |
+
else s["harvest_complexity"]
|
1085 |
+
),
|
1086 |
+
(
|
1087 |
+
translate_text(s["market_potential"].lower(), selected_language)
|
1088 |
+
if s["market_potential"].lower() in ["low", "medium", "high"]
|
1089 |
+
else s["market_potential"]
|
1090 |
+
),
|
1091 |
+
overall_suitability,
|
1092 |
+
]
|
1093 |
+
)
|
1094 |
+
|
1095 |
+
markdown_output = f"""
|
1096 |
+
# {lang_data["results_title"]}
|
1097 |
+
|
1098 |
+
## {lang_data["base_crop_label"]}: **{translate_crop_name(base_crop, selected_language)}**
|
1099 |
+
## {lang_data["location_label"]}: **{found_location_name}**
|
1100 |
+
## {lang_data["soil_type_label"]}: **{translate_soil_type(selected_soil_type, selected_language)}**
|
1101 |
+
### {lang_data["weather_conditions_label"]}
|
1102 |
+
- **{lang_data["water_availability_label"]}:** {water_availability_status}
|
1103 |
+
- **{lang_data["temperature_label"]}:** {temp_celsius}
|
1104 |
+
- **{lang_data["humidity_label"]}:** {humidity_status}
|
1105 |
+
|
1106 |
+
---
|
1107 |
+
|
1108 |
+
## {lang_data["suggested_partners_title"]}
|
1109 |
+
|
1110 |
+
{lang_data["note_guidelines"].format(translate_crop_name(base_crop, selected_language))}
|
1111 |
+
|
1112 |
+
"""
|
1113 |
+
# Create a DataFrame for structured output
|
1114 |
+
df_output = gr.DataFrame(
|
1115 |
+
value=data,
|
1116 |
+
headers=headers,
|
1117 |
+
row_count=(len(data), "fixed"),
|
1118 |
+
col_count=(len(headers), "fixed"),
|
1119 |
+
)
|
1120 |
+
|
1121 |
+
return gr.update(value=markdown_output), gr.update(value=data, headers=headers)
|
1122 |
+
|
1123 |
+
|
1124 |
+
# --- Gradio Interface ---
|
1125 |
+
|
1126 |
+
if __name__ == "__main__":
|
1127 |
+
LANGUAGES = list(TRANSLATIONS.keys())
|
1128 |
+
|
1129 |
+
initial_description_text = TRANSLATIONS["English"]["description"]
|
1130 |
+
if not OPENWEATHER_API_KEY or OPENWEATHER_API_KEY == "YOUR_OPENWEATHER_API_KEY":
|
1131 |
+
initial_description_text += TRANSLATIONS["English"]["api_key_warning"]
|
1132 |
+
|
1133 |
+
with gr.Blocks() as demo:
|
1134 |
+
title_output = gr.Markdown(TRANSLATIONS["English"]["title"])
|
1135 |
+
description_output = gr.Markdown(initial_description_text)
|
1136 |
+
|
1137 |
+
with gr.Row():
|
1138 |
+
language_selector = gr.Dropdown(
|
1139 |
+
choices=LANGUAGES,
|
1140 |
+
label="Select Language / भाषा चुनें",
|
1141 |
+
value="English",
|
1142 |
+
interactive=True,
|
1143 |
+
)
|
1144 |
+
base_crop_input = gr.Dropdown(
|
1145 |
+
choices=BASE_CROPS,
|
1146 |
+
label=TRANSLATIONS["English"]["select_base_crop"],
|
1147 |
+
value="Maize",
|
1148 |
+
interactive=True,
|
1149 |
+
)
|
1150 |
+
location_input = gr.Textbox(
|
1151 |
+
label=TRANSLATIONS["English"]["enter_location"],
|
1152 |
+
placeholder="e.g., Delhi, India",
|
1153 |
+
value="Delhi, India",
|
1154 |
+
interactive=True,
|
1155 |
+
)
|
1156 |
+
soil_type_input = gr.Dropdown(
|
1157 |
+
choices=SOIL_TYPES,
|
1158 |
+
label=TRANSLATIONS["English"]["select_soil_type"],
|
1159 |
+
value="Loamy", # Default soil type
|
1160 |
+
interactive=True,
|
1161 |
+
)
|
1162 |
+
|
1163 |
+
optimize_button = gr.Button(
|
1164 |
+
TRANSLATIONS["English"]["optimize_button"], variant="primary"
|
1165 |
+
)
|
1166 |
+
|
1167 |
+
output_markdown = gr.Markdown()
|
1168 |
+
output_dataframe = gr.DataFrame(
|
1169 |
+
headers=TRANSLATIONS["English"]["table_headers"],
|
1170 |
+
row_count=0,
|
1171 |
+
col_count=5,
|
1172 |
+
interactive=False,
|
1173 |
+
)
|
1174 |
+
|
1175 |
+
def update_ui_language(lang):
|
1176 |
+
lang_data = TRANSLATIONS.get(lang, TRANSLATIONS["English"])
|
1177 |
+
updated_description = lang_data["description"]
|
1178 |
+
if (
|
1179 |
+
not OPENWEATHER_API_KEY
|
1180 |
+
or OPENWEATHER_API_KEY == "YOUR_OPENWEATHER_API_KEY"
|
1181 |
+
):
|
1182 |
+
updated_description += lang_data["api_key_warning"]
|
1183 |
+
|
1184 |
+
# Update crop choices and values to be translated
|
1185 |
+
translated_base_crops = [
|
1186 |
+
translate_crop_name(crop, lang) for crop in BASE_CROPS
|
1187 |
+
]
|
1188 |
+
translated_soil_types = [
|
1189 |
+
translate_soil_type(soil, lang) for soil in SOIL_TYPES
|
1190 |
+
]
|
1191 |
+
|
1192 |
+
return (
|
1193 |
+
gr.update(value=lang_data["title"]),
|
1194 |
+
gr.update(value=updated_description),
|
1195 |
+
gr.update(
|
1196 |
+
choices=BASE_CROPS, label=lang_data["select_base_crop"]
|
1197 |
+
), # Keep internal choices as English for logic
|
1198 |
+
gr.update(label=lang_data["enter_location"]),
|
1199 |
+
gr.update(
|
1200 |
+
choices=SOIL_TYPES, label=lang_data["select_soil_type"]
|
1201 |
+
), # Keep internal choices as English for logic
|
1202 |
+
gr.update(value=lang_data["optimize_button"]),
|
1203 |
+
gr.update(value=""),
|
1204 |
+
gr.update(value=[], headers=lang_data["table_headers"]),
|
1205 |
+
)
|
1206 |
+
|
1207 |
+
language_selector.change(
|
1208 |
+
fn=update_ui_language,
|
1209 |
+
inputs=language_selector,
|
1210 |
+
outputs=[
|
1211 |
+
title_output,
|
1212 |
+
description_output,
|
1213 |
+
base_crop_input,
|
1214 |
+
location_input,
|
1215 |
+
soil_type_input, # Added soil_type_input to be updated
|
1216 |
+
optimize_button,
|
1217 |
+
output_markdown,
|
1218 |
+
output_dataframe,
|
1219 |
+
],
|
1220 |
+
)
|
1221 |
+
|
1222 |
+
optimize_button.click(
|
1223 |
+
fn=intercrop_optimizer,
|
1224 |
+
inputs=[
|
1225 |
+
base_crop_input,
|
1226 |
+
location_input,
|
1227 |
+
language_selector,
|
1228 |
+
soil_type_input,
|
1229 |
+
], # Pass soil type as input
|
1230 |
+
outputs=[output_markdown, output_dataframe],
|
1231 |
+
)
|
1232 |
+
|
1233 |
+
demo.launch()
|