File size: 4,916 Bytes
7be6dc6 8f4d406 2ee470b 8f4d406 7be6dc6 8f4d406 7be6dc6 8f4d406 033af54 8f4d406 7be6dc6 8f4d406 d38f151 033af54 d38f151 7be6dc6 8f4d406 7be6dc6 8f4d406 d38f151 8f4d406 7be6dc6 d38f151 e3d2211 7be6dc6 2ee470b 7be6dc6 2ee470b ed946ba 8f4d406 7be6dc6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
from flask import Flask, render_template, request, jsonify, Response
import requests
from bs4 import BeautifulSoup
from flask import stream_with_context
app = Flask(__name__)
# Internal mapping of crops to pests (for the form)
CROP_TO_PESTS = {
"Sorgum": ["FallArmyWorm"],
"Maize": ["FallArmyWorm"],
"Rice": ["Blast", "GallMidge", "YSB", "PlantHopper", "BlueBeetle", "BacterialLeafBlight"],
"Cotton": ["Thrips", "Whitefly", "PinkBollworm", "Jassid", "BollRot", "AmericanBollworm"],
"Soybean": ["Girdlebeetle", "H.armigera", "Semilooper", "Spodoptera", "StemFLy"],
"Tur": ["Wilt", "Webbed_Leaves", "Pod_damage"],
"Sugarcane": ["FallArmyGrub", "WhiteGrub"],
"Gram": ["H.armigera", "Wilt"]
}
# Fixed year options for the form
YEARS = ["2024-25", "2023-24", "2022-23", "2021-22"]
# Map our internal crop names to the external page's crop values.
CROP_MAPPING = {
"Cotton": "1",
"Gram": "4",
"Maize": "7",
"Rice": "3",
"Sorghum": "6",
"Soybean": "2",
"Sugarcane": "8",
"Tur": "5",
"Sorgum": "6" # Adjust if needed
}
# Map our internal pest names to external page values per crop.
PEST_MAPPING = {
"Cotton": {
"FallArmyWorm": "71"
},
"Gram": {
"H.armigera": "72",
"Wilt": "73"
},
"Maize": {
"FallArmyWorm": "74"
},
"Rice": {
"Blast": "75",
"GallMidge": "76",
"YSB": "77",
"PlantHopper": "78",
"BlueBeetle": "79",
"BacterialLeafBlight": "80"
},
"Soybean": {
"Girdlebeetle": "81",
"H.armigera": "82",
"Semilooper": "83",
"Spodoptera": "84",
"StemFLy": "85"
},
"Tur": {
"Wilt": "86",
"Webbed_Leaves": "87",
"Pod_damage": "88"
},
"Sugarcane": {
"FallArmyGrub": "89",
"WhiteGrub": "90"
},
"Sorgum": {
"FallArmyWorm": "91"
}
}
# Parameter codes and labels for the final image URL
PARAMS = {
"Mint": "Min Temperature",
"Maxt": "Max Temperature",
"RH": "Relative Humidity",
"RF": "Rainfall",
"PR": "Pest Report"
}
@app.route('/')
def index():
# Read query parameters (if provided)
crop = request.args.get('crop', '')
pest = request.args.get('pest', '')
year = request.args.get('year', '')
week = request.args.get('week', '')
param = request.args.get('param', '')
image_url = ""
if crop and pest and year and week and param:
# Build the external image URL (using HTTP)
base_url = f"http://www.icar-crida.res.in:8080/naip/gisimages/{crop}/{year}/{pest}_"
external_image_url = f"{base_url}{param}{week}.jpg"
# Instead of using the external HTTP URL directly, we build our proxy URL
image_url = f"/proxy-image?url={external_image_url}"
return render_template('index.html',
crops=list(CROP_TO_PESTS.keys()),
crop_to_pests=CROP_TO_PESTS,
years=YEARS,
params=PARAMS,
selected_crop=crop,
selected_pest=pest,
selected_year=year,
selected_week=week,
selected_param=param,
image_url=image_url)
@app.route('/fetch_weeks')
def fetch_weeks():
crop = request.args.get('crop', '')
pest = request.args.get('pest', '')
year = request.args.get('year', '')
ext_crop = CROP_MAPPING.get(crop, '')
ext_pest = ""
if crop in PEST_MAPPING and pest in PEST_MAPPING[crop]:
ext_pest = PEST_MAPPING[crop][pest]
payload = {
"country": ext_crop,
"city": ext_pest,
"sowing": year
}
weeks = []
try:
response = requests.get("http://www.icar-crida.res.in:8080/naip/gismaps.jsp", params=payload, timeout=10)
soup = BeautifulSoup(response.text, 'html.parser')
week_options = soup.select('select[name="week"] option')
weeks = [opt.get('value') for opt in week_options if opt.get('value') and "Select" not in opt.get('value')]
if not weeks:
weeks = [str(i) for i in range(1, 53)]
except Exception as e:
weeks = [str(i) for i in range(1, 53)]
return jsonify({"weeks": weeks})
@app.route('/proxy-image')
def proxy_image():
external_url = request.args.get('url')
if not external_url:
return "Missing URL", 400
try:
# Use streaming so that the response is sent in chunks
resp = requests.get(external_url, timeout=10, stream=True)
return Response(
stream_with_context(resp.iter_content(chunk_size=1024)),
mimetype=resp.headers.get('Content-Type', 'image/jpeg')
)
except Exception as e:
return str(e), 500
if __name__ == '__main__':
app.run(debug=True) |