|
from flask import Flask, render_template, request |
|
import folium |
|
from folium.plugins import HeatMapWithTime, FeatureGroupSubGroup, HeatMap |
|
import pandas as pd |
|
import os |
|
|
|
app = Flask(__name__) |
|
|
|
|
|
df = pd.read_csv('final_crop_historic_data_pkjk.csv') |
|
df.columns = ['State', 'District', 'Crop_Year', 'Season', 'Crop', 'Area', 'Production', 'Latitude', 'Longitude'] |
|
|
|
|
|
@app.route('/') |
|
def home(): |
|
return render_template('index.html', map_html="", selected_map="Home") |
|
|
|
|
|
@app.route('/prodction_analysis', methods=['GET', 'POST']) |
|
def production_analysis(): |
|
crop_options = df['Crop'].unique().tolist() |
|
selected_crop = request.form.get('crop_type') if request.method == 'POST' else None |
|
|
|
if not selected_crop: |
|
return render_template('index.html', map_html="", selected_map="Production Analysis", |
|
crop_options=crop_options, selected_crop=None) |
|
|
|
crop_data = df[df['Crop'] == selected_crop] |
|
|
|
if crop_data.empty: |
|
return render_template('index.html', map_html="", selected_map="No Data Available", |
|
crop_options=crop_options, selected_crop=selected_crop) |
|
|
|
time_index = crop_data['Crop_Year'].unique() |
|
heatmap_data = [ |
|
[[row['Latitude'], row['Longitude']] for _, row in crop_data[crop_data['Crop_Year'] == year].iterrows()] |
|
for year in time_index |
|
] |
|
|
|
m = folium.Map(location=[20.5937, 78.9629], zoom_start=5) |
|
heatmap = HeatMapWithTime( |
|
heatmap_data, |
|
index=[str(year) for year in time_index], |
|
auto_play=True, |
|
max_opacity=0.6 |
|
) |
|
heatmap.add_to(m) |
|
|
|
map_html = m._repr_html_() |
|
return render_template('index.html', map_html=map_html, selected_map="Production Heatmap Analysis", |
|
crop_options=crop_options, selected_crop=selected_crop) |
|
|
|
|
|
@app.route('/heatmap_analysis') |
|
def heatmap_analysis(): |
|
global df |
|
m = folium.Map(location=[20.5937, 78.9629], zoom_start=5) |
|
fg = folium.FeatureGroup(name="Crops") |
|
m.add_child(fg) |
|
df_sampled = df.sample(frac=0.005, random_state=42) |
|
for crop in df_sampled['Crop'].unique(): |
|
subgroup = FeatureGroupSubGroup(fg, crop) |
|
m.add_child(subgroup) |
|
crop_data = df_sampled[df_sampled['Crop'] == crop] |
|
|
|
heatmap_data = [[row['Latitude'], row['Longitude']] for _, row in crop_data.iterrows()] |
|
HeatMap(heatmap_data).add_to(subgroup) |
|
|
|
folium.LayerControl(collapsed=False).add_to(m) |
|
|
|
map_html = m._repr_html_() |
|
return render_template('index.html', map_html=map_html, selected_map="Crop Heatmap Analysis") |
|
|
|
|
|
@app.route('/season_analysis') |
|
def season_analysis(): |
|
global df |
|
|
|
|
|
m = folium.Map(location=[20.5937, 78.9629], zoom_start=5) |
|
|
|
|
|
df_sampled = df.sample(frac=0.005, random_state=42) |
|
|
|
|
|
top_crops = {} |
|
|
|
|
|
for _, row in df_sampled.iterrows(): |
|
lat_lon = (row['Latitude'], row['Longitude']) |
|
crop = row['Crop'] |
|
production = row['Production'] |
|
|
|
if lat_lon not in top_crops: |
|
top_crops[lat_lon] = {'Season': row['Season'], 'Crops': {}, 'Area': row['Area']} |
|
|
|
if crop not in top_crops[lat_lon]['Crops']: |
|
top_crops[lat_lon]['Crops'][crop] = 0 |
|
top_crops[lat_lon]['Crops'][crop] += production |
|
|
|
|
|
for location, data in top_crops.items(): |
|
top_crops[location]['Crops'] = sorted(data['Crops'].items(), key=lambda x: x[1], reverse=True)[:5] |
|
|
|
|
|
season_colors = { |
|
'Kharif': 'orange', |
|
'Rabi': 'green', |
|
'Winter': 'blue', |
|
'Autumn':'pink', |
|
'Rabi':'brown', |
|
'Summer':'yellow', |
|
'Whole Year':'Red' |
|
} |
|
|
|
for (latitude, longitude), data in top_crops.items(): |
|
season = data['Season'] |
|
top_crop_list = data['Crops'] |
|
area = data['Area'] |
|
|
|
|
|
top_crops_str = "<br>".join([f"{crop[0]}: {crop[1]}" for crop in top_crop_list]) |
|
|
|
|
|
folium.CircleMarker( |
|
location=[latitude, longitude], |
|
radius=7, |
|
color=season_colors.get(season, 'gray'), |
|
fill=True, |
|
fill_color=season_colors.get(season, 'gray'), |
|
fill_opacity=0.7, |
|
tooltip=(f"Latitude: {latitude}<br>" |
|
f"Longitude: {longitude}<br>" |
|
f"Season: {season}<br>" |
|
f"Area: {area}<br>" |
|
f"Top 5 Crops:<br>{top_crops_str}") |
|
).add_to(m) |
|
|
|
|
|
map_html = m._repr_html_() |
|
|
|
|
|
return render_template('index.html', map_html=map_html, selected_map="Season Analysis") |
|
|
|
|
|
@app.route('/crop_analysis') |
|
def crop_analysis(): |
|
global df |
|
df_sampled = df.sample(frac=0.005, random_state=42) |
|
m = folium.Map(location=[20.5937, 78.9629], zoom_start=5) |
|
|
|
for district in df_sampled['District'].unique(): |
|
district_data = df_sampled[df_sampled['District'] == district] |
|
top_crops = district_data.groupby('Crop')['Production'].sum().nlargest(5).index.tolist() |
|
lat, lon = district_data.iloc[0]['Latitude'], district_data.iloc[0]['Longitude'] |
|
|
|
folium.Marker( |
|
location=[lat, lon], |
|
popup=f"<b>District:</b> {district}<br><b>Top 5 Crops:</b> {', '.join(top_crops)}", |
|
icon=folium.Icon(icon='arrow-up', color='green') |
|
).add_to(m) |
|
|
|
map_html = m._repr_html_() |
|
return render_template('index.html', map_html=map_html, selected_map="District Crop Analysis") |
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
app.run(port=7860,host='0.0.0.0') |
|
|