krushimitravit commited on
Commit
d91c61a
·
verified ·
1 Parent(s): 08d5096

Upload 12 files

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ final_crop_historic_data_pkjk.csv filter=lfs diff=lfs merge=lfs -text
Dockerfile ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use an official Python runtime as a parent image
2
+ FROM python:3.9-slim
3
+
4
+ # Set the working directory
5
+ WORKDIR /app
6
+
7
+ # Copy the application files to the container
8
+ COPY . /app
9
+
10
+ # Install Python dependencies
11
+ RUN pip install --no-cache-dir -r requirements.txt
12
+
13
+
14
+ # Expose the Flask port (Hugging Face Spaces uses port 7860 by default)
15
+ EXPOSE 7860
16
+
17
+ # Command to run the Flask app
18
+ CMD ["python", "app.py"]
app.py ADDED
@@ -0,0 +1,170 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, render_template, request
2
+ import folium
3
+ from folium.plugins import HeatMapWithTime, FeatureGroupSubGroup, HeatMap
4
+ import pandas as pd
5
+ import os
6
+
7
+ app = Flask(__name__)
8
+
9
+ # Load the dataset
10
+ df = pd.read_csv('final_crop_historic_data_pkjk.csv')
11
+ df.columns = ['State', 'District', 'Crop_Year', 'Season', 'Crop', 'Area', 'Production', 'Latitude', 'Longitude']
12
+
13
+
14
+ @app.route('/')
15
+ def home():
16
+ crop_options = df['Crop'].unique().tolist()
17
+ return render_template('index.html', map_html="", selected_map="Home", crop_options=crop_options, selected_crop=None)
18
+
19
+
20
+ @app.route('/prodction_analysis', methods=['GET', 'POST'])
21
+ def production_analysis():
22
+ crop_options = df['Crop'].unique().tolist()
23
+ selected_crop = request.form.get('crop_type') if request.method == 'POST' else None
24
+
25
+ if not selected_crop:
26
+ return render_template('index.html', map_html="", selected_map="Production Analysis",
27
+ crop_options=crop_options, selected_crop=None)
28
+
29
+ crop_data = df[df['Crop'] == selected_crop]
30
+
31
+ if crop_data.empty:
32
+ return render_template('index.html', map_html="", selected_map="No Data Available",
33
+ crop_options=crop_options, selected_crop=selected_crop)
34
+
35
+ time_index = crop_data['Crop_Year'].unique()
36
+ heatmap_data = [
37
+ [[row['Latitude'], row['Longitude']] for _, row in crop_data[crop_data['Crop_Year'] == year].iterrows()]
38
+ for year in time_index
39
+ ]
40
+
41
+ m = folium.Map(location=[20.5937, 78.9629], zoom_start=5)
42
+ heatmap = HeatMapWithTime(
43
+ heatmap_data,
44
+ index=[str(year) for year in time_index],
45
+ auto_play=True,
46
+ max_opacity=0.6
47
+ )
48
+ heatmap.add_to(m)
49
+
50
+ map_html = m._repr_html_()
51
+ return render_template('index.html', map_html=map_html, selected_map="Production Heatmap Analysis",
52
+ crop_options=crop_options, selected_crop=selected_crop)
53
+
54
+
55
+ @app.route('/heatmap_analysis')
56
+ def heatmap_analysis():
57
+ global df # Declare df as global
58
+ m = folium.Map(location=[20.5937, 78.9629], zoom_start=5)
59
+ fg = folium.FeatureGroup(name="Crops")
60
+ m.add_child(fg)
61
+ df_sampled = df.sample(frac=0.005, random_state=42) # Use a different variable for sampled df
62
+ for crop in df_sampled['Crop'].unique():
63
+ subgroup = FeatureGroupSubGroup(fg, crop)
64
+ m.add_child(subgroup)
65
+ crop_data = df_sampled[df_sampled['Crop'] == crop]
66
+
67
+ heatmap_data = [[row['Latitude'], row['Longitude']] for _, row in crop_data.iterrows()]
68
+ HeatMap(heatmap_data).add_to(subgroup)
69
+
70
+ folium.LayerControl(collapsed=False).add_to(m)
71
+
72
+ map_html = m._repr_html_()
73
+ return render_template('analysis_base.html', map_html=map_html, selected_map="Crop Heatmap Analysis")
74
+
75
+
76
+ @app.route('/season_analysis')
77
+ def season_analysis():
78
+ global df # Declare df as global
79
+
80
+ # Initialize the map centered over India with an appropriate zoom level
81
+ m = folium.Map(location=[20.5937, 78.9629], zoom_start=5)
82
+
83
+ # Sample a fraction of the dataframe for performance
84
+ df_sampled = df.sample(frac=0.005, random_state=42)
85
+
86
+ # Create a dictionary to store top 5 crops for each location
87
+ top_crops = {}
88
+
89
+ # Collect the top crops for each unique location (Latitude, Longitude)
90
+ for _, row in df_sampled.iterrows():
91
+ lat_lon = (row['Latitude'], row['Longitude'])
92
+ crop = row['Crop']
93
+ production = row['Production']
94
+
95
+ if lat_lon not in top_crops:
96
+ top_crops[lat_lon] = {'Season': row['Season'], 'Crops': {}, 'Area': row['Area']}
97
+
98
+ if crop not in top_crops[lat_lon]['Crops']:
99
+ top_crops[lat_lon]['Crops'][crop] = 0
100
+ top_crops[lat_lon]['Crops'][crop] += production
101
+
102
+ # Limit to top 5 crops for each location
103
+ for location, data in top_crops.items():
104
+ top_crops[location]['Crops'] = sorted(data['Crops'].items(), key=lambda x: x[1], reverse=True)[:5]
105
+
106
+ # Add scatter points for each unique location with a different color for each season
107
+ season_colors = {
108
+ 'Kharif': 'orange',
109
+ 'Rabi': 'green',
110
+ 'Winter': 'blue',
111
+ 'Autumn':'pink',
112
+ 'Rabi':'brown',
113
+ 'Summer':'yellow',
114
+ 'Whole Year':'Red'
115
+ }
116
+
117
+ for (latitude, longitude), data in top_crops.items():
118
+ season = data['Season']
119
+ top_crop_list = data['Crops']
120
+ area = data['Area']
121
+
122
+ # Create a string for the top crops
123
+ top_crops_str = "<br>".join([f"{crop[0]}: {crop[1]}" for crop in top_crop_list])
124
+
125
+ # Add a scatter point to the map for each location
126
+ folium.CircleMarker(
127
+ location=[latitude, longitude],
128
+ radius=7, # Fixed radius for scatter points
129
+ color=season_colors.get(season, 'gray'), # Use season color or gray if not found
130
+ fill=True,
131
+ fill_color=season_colors.get(season, 'gray'),
132
+ fill_opacity=0.7,
133
+ tooltip=(f"Latitude: {latitude}<br>"
134
+ f"Longitude: {longitude}<br>"
135
+ f"Season: {season}<br>"
136
+ f"Area: {area}<br>"
137
+ f"Top 5 Crops:<br>{top_crops_str}")
138
+ ).add_to(m)
139
+
140
+ # Convert the map to HTML format for rendering
141
+ map_html = m._repr_html_()
142
+
143
+ # Render the map in the template
144
+ return render_template('analysis_base.html', map_html=map_html, selected_map="Season Analysis")
145
+
146
+
147
+ @app.route('/crop_analysis')
148
+ def crop_analysis():
149
+ global df # Declare df as global
150
+ df_sampled = df.sample(frac=0.005, random_state=42) # Use a different variable for sampled df
151
+ m = folium.Map(location=[20.5937, 78.9629], zoom_start=5)
152
+
153
+ for district in df_sampled['District'].unique():
154
+ district_data = df_sampled[df_sampled['District'] == district]
155
+ top_crops = district_data.groupby('Crop')['Production'].sum().nlargest(5).index.tolist()
156
+ lat, lon = district_data.iloc[0]['Latitude'], district_data.iloc[0]['Longitude']
157
+
158
+ folium.Marker(
159
+ location=[lat, lon],
160
+ popup=f"<b>District:</b> {district}<br><b>Top 5 Crops:</b> {', '.join(top_crops)}",
161
+ icon=folium.Icon(icon='arrow-up', color='green')
162
+ ).add_to(m)
163
+
164
+ map_html = m._repr_html_()
165
+ return render_template('analysis_base.html', map_html=map_html, selected_map="Geospatial Analysis")
166
+
167
+
168
+
169
+ if __name__ == '__main__':
170
+ app.run(port=7860,host='0.0.0.0',debug=True)
final_crop_historic_data_pkjk.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9cf39965597f1b461e1351928200036a07929f434420cc40e84d097f9226fc3a
3
+ size 311198769
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ gunicorn
2
+ flask
3
+ pandas
4
+ folium
templates/analysis_base.html ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>{{ selected_map }} - Crop Analysis</title>
7
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
9
+ <style>
10
+ body {
11
+ padding: 0;
12
+ background-color: #f8f9fa;
13
+ min-height: 100vh;
14
+ }
15
+
16
+ /* Hero Header */
17
+ .hero-header {
18
+ background-color: #1a5d3a;
19
+ color: white;
20
+ padding: 2rem 0 4rem 0;
21
+ box-shadow: 0 4px 20px rgba(26, 93, 58, 0.2);
22
+ }
23
+
24
+ .navbar {
25
+ background-color: transparent;
26
+ padding: 1rem 3rem;
27
+ }
28
+
29
+ .navbar-nav {
30
+ flex-direction: row;
31
+ justify-content: center;
32
+ width: 100%;
33
+ gap: 3rem;
34
+ list-style: none;
35
+ margin: 0;
36
+ padding: 0;
37
+ }
38
+
39
+ .nav-item {
40
+ padding: 0;
41
+ }
42
+
43
+ .nav-link {
44
+ color: white !important;
45
+ font-weight: 500;
46
+ font-size: 1rem;
47
+ padding: 0.5rem 1.5rem !important;
48
+ border-radius: 50px;
49
+ transition: all 0.3s ease;
50
+ border: 1px solid transparent;
51
+ text-decoration: none;
52
+ display: inline-block;
53
+ }
54
+
55
+ .nav-link:hover {
56
+ background-color: #ffffff;
57
+ color: #198754 !important;
58
+ border-color: #198754;
59
+ }
60
+
61
+ .nav-link i {
62
+ margin-right: 0.5rem;
63
+ }
64
+
65
+ .main-container {
66
+ background: white;
67
+ border-radius: 12px;
68
+ padding: 25px;
69
+ max-height: 1500px;
70
+ max-width: 1700px;
71
+ margin: -3rem auto 20px auto;
72
+ border: 3px solid #2e7d32;
73
+ box-shadow: 0 6px 20px rgba(46, 125, 50, 0.15);
74
+ }
75
+
76
+ .heading {
77
+ font-weight: bold;
78
+ color: #1b5e20;
79
+ margin-bottom: 20px;
80
+ }
81
+
82
+ #map-container {
83
+ margin-top: 10px;
84
+ margin-bottom: 20px;
85
+ height: 600px;
86
+ border: 3px solid #2e7d32;
87
+ border-radius: 8px;
88
+ overflow: hidden;
89
+ }
90
+ </style>
91
+ </head>
92
+ <body>
93
+ <!-- Navbar with Heading -->
94
+ <nav class="navbar navbar-expand-lg navbar-dark" style="background-color: #1a5d3a; padding: 1rem 3rem;">
95
+ <div class="container-fluid justify-content-center">
96
+ <h1 class="navbar-brand mb-0" style="font-size: 1.75rem; font-weight: 700;">Crop Production Analysis</h1>
97
+ </div>
98
+ </nav>
99
+
100
+ <!-- Hero Section with Navigation -->
101
+ <div class="hero-header">
102
+ <ul class="navbar-nav">
103
+ <li class="nav-item"><a class="nav-link" href="/prodction_analysis"><i class="bi bi-graph-up"></i> Production Analysis</a></li>
104
+ <li class="nav-item"><a class="nav-link" href="/heatmap_analysis"><i class="bi bi-map"></i> Heatmap Analysis</a></li>
105
+ <li class="nav-item"><a class="nav-link" href="/season_analysis"><i class="bi bi-calendar3"></i> Season Analysis</a></li>
106
+ <li class="nav-item"><a class="nav-link" href="/crop_analysis"><i class="bi bi-geo-alt"></i> Geospatial Analysis</a></li>
107
+ </ul>
108
+ </div>
109
+
110
+ <div class="main-container">
111
+ <h2 class="heading">{{ selected_map }}</h2>
112
+ <div id="map-container">
113
+ {{ map_html | safe }}
114
+ </div>
115
+ </div>
116
+
117
+ <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
118
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js"></script>
119
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
120
+ </body>
121
+ </html>
templates/crop_analysis.html ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Geospatial Analysis</title>
7
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap" rel="stylesheet">
12
+ <style>
13
+ * {
14
+ margin: 0;
15
+ padding: 0;
16
+ box-sizing: border-box;
17
+ }
18
+
19
+ body {
20
+ font-family: 'Outfit', sans-serif;
21
+ background-color: #f8f9fa;
22
+ min-height: 100vh;
23
+ padding: 0;
24
+ padding-bottom: 2rem;
25
+ }
26
+
27
+ /* Hero Header */
28
+ .hero-header {
29
+ background-color: #1a5d3a;
30
+ color: white;
31
+ padding: 2rem 0 4rem 0;
32
+ box-shadow: 0 4px 20px rgba(26, 93, 58, 0.2);
33
+ }
34
+
35
+ .navbar {
36
+ background-color: transparent;
37
+ padding: 1rem 3rem;
38
+ }
39
+
40
+ .navbar-nav {
41
+ flex-direction: row;
42
+ justify-content: center;
43
+ width: 100%;
44
+ gap: 3rem;
45
+ }
46
+
47
+ .nav-item {
48
+ padding: 0;
49
+ }
50
+
51
+ .nav-link {
52
+ color: white !important;
53
+ font-weight: 500;
54
+ font-size: 1rem;
55
+ padding: 0.5rem 1.5rem !important;
56
+ border-radius: 50px;
57
+ transition: all 0.3s ease;
58
+ border: 1px solid transparent;
59
+ }
60
+
61
+ .nav-link:hover {
62
+ background-color: #ffffff;
63
+ color: #198754 !important;
64
+ border-color: #198754;
65
+ }
66
+
67
+ /* Main Container */
68
+ .main-container {
69
+ max-width: 1400px;
70
+ margin: -3rem auto 3rem auto;
71
+ padding: 0 1.5rem;
72
+ }
73
+
74
+ .content-card {
75
+ background: #ffffff;
76
+ border-radius: 20px;
77
+ padding: 3rem;
78
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08);
79
+ border: none;
80
+ }
81
+
82
+ .heading {
83
+ font-weight: 700;
84
+ color: #212529;
85
+ font-size: 2rem;
86
+ margin-bottom: 2rem;
87
+ }
88
+
89
+ iframe {
90
+ width: 100%;
91
+ height: 600px;
92
+ border: 1px solid #dee2e6;
93
+ border-radius: 8px;
94
+ }
95
+ </style>
96
+ </head>
97
+ <body>
98
+ <!-- Navbar with Heading -->
99
+ <nav class="navbar navbar-expand-lg navbar-dark" style="background-color: #1a5d3a; padding: 1rem 3rem;">
100
+ <div class="container-fluid justify-content-center">
101
+ <h1 class="navbar-brand mb-0" style="font-size: 1.75rem; font-weight: 700;">Crop Production Analysis</h1>
102
+ </div>
103
+ </nav>
104
+
105
+ <!-- Hero Section with Navigation -->
106
+ <div class="hero-header">
107
+ <div class="container">
108
+ <ul class="navbar-nav">
109
+ <li class="nav-item"><a class="nav-link" href="/prodction_analysis"><i class="bi bi-graph-up"></i> Production Analysis</a></li>
110
+ <li class="nav-item"><a class="nav-link" href="/heatmap_analysis"><i class="bi bi-map"></i> Heatmap Analysis</a></li>
111
+ <li class="nav-item"><a class="nav-link" href="/season_analysis"><i class="bi bi-calendar3"></i> Season Analysis</a></li>
112
+ <li class="nav-item"><a class="nav-link" href="/crop_analysis"><i class="bi bi-geo-alt"></i> Geospatial Analysis</a></li>
113
+ </ul>
114
+ </div>
115
+ </div>
116
+
117
+ <!-- Floating Content Card -->
118
+ <div class="main-container">
119
+ <div class="content-card">
120
+ <h2 class="heading">🌾 Geospatial Analysis</h2>
121
+ <iframe src="{{ map_url }}"></iframe>
122
+ </div>
123
+ </div>
124
+
125
+ <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
126
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js"></script>
127
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
128
+ </body>
129
+ </html>
templates/heatmap.html ADDED
The diff for this file is too large to render. See raw diff
 
templates/index.html ADDED
@@ -0,0 +1,211 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Crop Production Analysis</title>
7
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap" rel="stylesheet">
12
+ <style>
13
+ * {
14
+ margin: 0;
15
+ padding: 0;
16
+ box-sizing: border-box;
17
+ }
18
+
19
+ body {
20
+ font-family: 'Outfit', sans-serif;
21
+ background-color: #f8f9fa;
22
+ min-height: 100vh;
23
+ padding: 0;
24
+
25
+ }
26
+
27
+ /* Curved Bottom Hero Header */
28
+ .hero-header {
29
+ background-color: #1a5d3a;
30
+ color: white;
31
+ padding: 2rem 0 4rem 0;
32
+
33
+ box-shadow: 0 4px 20px rgba(26, 93, 58, 0.2);
34
+ }
35
+
36
+ .navbar {
37
+ background-color: transparent;
38
+ padding: 1rem 3rem;
39
+ }
40
+
41
+ .navbar-nav {
42
+ flex-direction: row;
43
+ justify-content: center;
44
+ width: 100%;
45
+ gap: 3rem;
46
+ }
47
+
48
+ .nav-item {
49
+ padding: 0;
50
+ }
51
+
52
+ .nav-link {
53
+ color: white !important;
54
+ font-weight: 500;
55
+ font-size: 1rem;
56
+ padding: 0.5rem 1.5rem !important;
57
+ border-radius: 50px;
58
+ transition: all 0.3s ease;
59
+ border: 1px solid transparent;
60
+ }
61
+
62
+ .nav-link:hover {
63
+ background-color: #ffffff;
64
+ color: #198754 !important;
65
+ border-color: #198754;
66
+ }
67
+
68
+ /* Floating Card */
69
+ .main-container {
70
+ max-width: 1400px;
71
+ margin: -3rem auto 3rem auto;
72
+
73
+ }
74
+
75
+ .content-card {
76
+ background: #ffffff;
77
+ border-radius: 20px;
78
+ padding: 3rem;
79
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08);
80
+ border: 3px solid #198754;
81
+ }
82
+
83
+ .heading {
84
+ font-weight: bold;
85
+ color: #1b5e20;
86
+ margin-bottom: 20px;
87
+ }
88
+
89
+ /* Form Styles */
90
+ .form-group {
91
+ margin-bottom: 1.5rem;
92
+ }
93
+
94
+ .form-group label {
95
+ font-weight: 500;
96
+ color: #212529;
97
+ margin-bottom: 0.5rem;
98
+ display: block;
99
+ }
100
+
101
+ .form-control {
102
+ background-color: #f8f9fa;
103
+ border: 1px solid #dee2e6;
104
+ border-radius: 8px;
105
+ padding: 0.5rem 1rem;
106
+ font-family: 'Outfit', sans-serif;
107
+ font-weight: 400;
108
+ transition: all 0.3s ease;
109
+ }
110
+
111
+ .form-control:focus {
112
+ background-color: #ffffff;
113
+ border-color: #198754;
114
+ box-shadow: 0 0 0 4px rgba(25, 135, 84, 0.1);
115
+ outline: none;
116
+ }
117
+
118
+ /* Button Styles */
119
+ .btn-success {
120
+ background-color: #1a5d3a;
121
+ border: none;
122
+ border-radius: 8px;
123
+ padding: 0.75rem 2rem;
124
+ font-weight: 500;
125
+ font-size: 1rem;
126
+ color: white;
127
+ transition: all 0.3s ease;
128
+ display: inline-flex;
129
+ align-items: center;
130
+ gap: 0.5rem;
131
+ }
132
+
133
+ .btn-success:hover {
134
+ background-color: #143d2e;
135
+ transform: translateY(-2px);
136
+ box-shadow: 0 4px 12px rgba(26, 93, 58, 0.3);
137
+ }
138
+
139
+ .btn-success:focus {
140
+ box-shadow: 0 0 0 4px rgba(25, 135, 84, 0.2);
141
+ }
142
+
143
+ /* Map Container */
144
+ #map-container {
145
+ margin-top: 2rem;
146
+ height: 500px;
147
+ border: 1px solid #dee2e6;
148
+ border-radius: 8px;
149
+ overflow: hidden;
150
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
151
+ }
152
+
153
+ #map-container iframe {
154
+ width: 100%;
155
+ height: 100%;
156
+ border: none;
157
+ }
158
+ </style>
159
+ </head>
160
+ <body>
161
+ <!-- Navbar with Heading -->
162
+ <nav class="navbar navbar-expand-lg navbar-dark" style="background-color: #1a5d3a; padding: 1rem 3rem;">
163
+ <div class="container-fluid justify-content-center">
164
+ <h1 class="navbar-brand mb-0" style="font-size: 1.75rem; font-weight: 700;">Crop Production Analysis</h1>
165
+ </div>
166
+ </nav>
167
+
168
+ <!-- Hero Section with Navigation -->
169
+ <div class="hero-header">
170
+ <div class="container">
171
+ <ul class="navbar-nav">
172
+ <li class="nav-item"><a class="nav-link" href="/prodction_analysis"><i class="bi bi-graph-up"></i> Production Analysis</a></li>
173
+ <li class="nav-item"><a class="nav-link" href="/heatmap_analysis"><i class="bi bi-map"></i> Heatmap Analysis</a></li>
174
+ <li class="nav-item"><a class="nav-link" href="/season_analysis"><i class="bi bi-calendar3"></i> Season Analysis</a></li>
175
+ <li class="nav-item"><a class="nav-link" href="/crop_analysis"><i class="bi bi-geo-alt"></i> Geospatial Analysis</a></li>
176
+ </ul>
177
+ </div>
178
+ </div>
179
+
180
+ <!-- Floating Content Card -->
181
+ <div class="main-container">
182
+ <div class="content-card">
183
+
184
+ <form method="POST" action="/prodction_analysis">
185
+ <h1 class="heading">Crop Production Analysis</h1>
186
+ <div class="form-group">
187
+ <label for="crop_type">Select Crop Type:</label>
188
+ <select class="form-control" id="crop_type" name="crop_type">
189
+ <option value="">Select Crop</option>
190
+ {% for crop in crop_options %}
191
+ <option value="{{ crop }}" {% if crop == selected_crop %}selected{% endif %}>{{ crop }}</option>
192
+ {% endfor %}
193
+ </select>
194
+ </div>
195
+ <button type="submit" class="btn btn-success">
196
+ <i class="bi bi-search"></i>
197
+ Analyze
198
+ </button>
199
+ </form>
200
+
201
+ <div id="map-container">
202
+ {{ map_html | safe }}
203
+ </div>
204
+ </div>
205
+ </div>
206
+
207
+ <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
208
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js"></script>
209
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
210
+ </body>
211
+ </html>
templates/map.html ADDED
The diff for this file is too large to render. See raw diff
 
templates/prediction_analysis.html ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Production Analysis</title>
7
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap" rel="stylesheet">
12
+ <style>
13
+ * {
14
+ margin: 0;
15
+ padding: 0;
16
+ box-sizing: border-box;
17
+ }
18
+
19
+ body {
20
+ font-family: 'Outfit', sans-serif;
21
+ background-color: #f8f9fa;
22
+ min-height: 100vh;
23
+ padding: 0;
24
+ padding-bottom: 2rem;
25
+ }
26
+
27
+ /* Hero Header */
28
+ .hero-header {
29
+ background-color: #1a5d3a;
30
+ color: white;
31
+ padding: 2rem 0 4rem 0;
32
+ box-shadow: 0 4px 20px rgba(26, 93, 58, 0.2);
33
+ }
34
+
35
+ .navbar {
36
+ background-color: transparent;
37
+ padding: 1rem 3rem;
38
+ }
39
+
40
+ .navbar-nav {
41
+ flex-direction: row;
42
+ justify-content: center;
43
+ width: 100%;
44
+ gap: 3rem;
45
+ }
46
+
47
+ .nav-item {
48
+ padding: 0;
49
+ }
50
+
51
+ .nav-link {
52
+ color: white !important;
53
+ font-weight: 500;
54
+ font-size: 1rem;
55
+ padding: 0.5rem 1.5rem !important;
56
+ border-radius: 50px;
57
+ transition: all 0.3s ease;
58
+ border: 1px solid transparent;
59
+ }
60
+
61
+ .nav-link:hover {
62
+ background-color: #ffffff;
63
+ color: #198754 !important;
64
+ border-color: #198754;
65
+ }
66
+
67
+ /* Main Container */
68
+ .main-container {
69
+ max-width: 1400px;
70
+ margin: -3rem auto 3rem auto;
71
+ padding: 0 1.5rem;
72
+ }
73
+
74
+ .content-card {
75
+ background: #ffffff;
76
+ border-radius: 20px;
77
+ padding: 3rem;
78
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08);
79
+ border: none;
80
+ }
81
+
82
+ .heading {
83
+ font-weight: 700;
84
+ color: #212529;
85
+ font-size: 2rem;
86
+ margin-bottom: 2rem;
87
+ }
88
+
89
+ iframe {
90
+ width: 100%;
91
+ height: 600px;
92
+ border: 1px solid #dee2e6;
93
+ border-radius: 8px;
94
+ }
95
+ </style>
96
+ </head>
97
+ <body>
98
+ <!-- Navbar with Heading -->
99
+ <nav class="navbar navbar-expand-lg navbar-dark" style="background-color: #1a5d3a; padding: 1rem 3rem;">
100
+ <div class="container-fluid justify-content-center">
101
+ <h1 class="navbar-brand mb-0" style="font-size: 1.75rem; font-weight: 700;">Crop Production Analysis</h1>
102
+ </div>
103
+ </nav>
104
+
105
+ <!-- Hero Section with Navigation -->
106
+ <div class="hero-header">
107
+ <div class="container">
108
+ <ul class="navbar-nav">
109
+ <li class="nav-item"><a class="nav-link" href="/prodction_analysis"><i class="bi bi-graph-up"></i> Production Analysis</a></li>
110
+ <li class="nav-item"><a class="nav-link" href="/heatmap_analysis"><i class="bi bi-map"></i> Heatmap Analysis</a></li>
111
+ <li class="nav-item"><a class="nav-link" href="/season_analysis"><i class="bi bi-calendar3"></i> Season Analysis</a></li>
112
+ <li class="nav-item"><a class="nav-link" href="/crop_analysis"><i class="bi bi-geo-alt"></i> Geospatial Analysis</a></li>
113
+ </ul>
114
+ </div>
115
+ </div>
116
+
117
+ <!-- Floating Content Card -->
118
+ <div class="main-container">
119
+ <div class="content-card">
120
+ <h2 class="heading">📊 Production Analysis</h2>
121
+ <iframe src="{{ map_url }}"></iframe>
122
+ </div>
123
+ </div>
124
+
125
+ <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
126
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js"></script>
127
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
128
+ </body>
129
+ </html>
templates/production_heatmap.html ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Production Heatmap</title>
7
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap" rel="stylesheet">
12
+ <style>
13
+ * {
14
+ margin: 0;
15
+ padding: 0;
16
+ box-sizing: border-box;
17
+ }
18
+
19
+ body {
20
+ font-family: 'Outfit', sans-serif;
21
+ background-color: #f8f9fa;
22
+ min-height: 100vh;
23
+ padding: 0;
24
+ padding-bottom: 2rem;
25
+ }
26
+
27
+ /* Hero Header */
28
+ .hero-header {
29
+ background-color: #1a5d3a;
30
+ color: white;
31
+ padding: 2rem 0 4rem 0;
32
+ box-shadow: 0 4px 20px rgba(26, 93, 58, 0.2);
33
+ }
34
+
35
+ .navbar {
36
+ background-color: transparent;
37
+ padding: 1rem 3rem;
38
+ }
39
+
40
+ .navbar-nav {
41
+ flex-direction: row;
42
+ justify-content: center;
43
+ width: 100%;
44
+ gap: 3rem;
45
+ }
46
+
47
+ .nav-item {
48
+ padding: 0;
49
+ }
50
+
51
+ .nav-link {
52
+ color: white !important;
53
+ font-weight: 500;
54
+ font-size: 1rem;
55
+ padding: 0.5rem 1.5rem !important;
56
+ border-radius: 50px;
57
+ transition: all 0.3s ease;
58
+ border: 1px solid transparent;
59
+ }
60
+
61
+ .nav-link:hover {
62
+ background-color: #ffffff;
63
+ color: #198754 !important;
64
+ border-color: #198754;
65
+ }
66
+
67
+ /* Main Container */
68
+ .main-container {
69
+ max-width: 1400px;
70
+ margin: -3rem auto 3rem auto;
71
+ padding: 0 1.5rem;
72
+ }
73
+
74
+ .content-card {
75
+ background: #ffffff;
76
+ border-radius: 20px;
77
+ padding: 3rem;
78
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08);
79
+ border: none;
80
+ }
81
+
82
+ .heading {
83
+ font-weight: 700;
84
+ color: #212529;
85
+ font-size: 2rem;
86
+ margin-bottom: 2rem;
87
+ }
88
+
89
+ .scrollable {
90
+ max-height: 300px;
91
+ overflow-y: auto;
92
+ padding: 1rem;
93
+ background: #f8f9fa;
94
+ border: 1px solid #dee2e6;
95
+ border-radius: 8px;
96
+ margin-bottom: 1.5rem;
97
+ }
98
+
99
+ label {
100
+ color: #212529;
101
+ font-weight: 500;
102
+ font-size: 1rem;
103
+ }
104
+
105
+ input[type="checkbox"] {
106
+ accent-color: #198754;
107
+ margin-right: 8px;
108
+ width: 18px;
109
+ height: 18px;
110
+ cursor: pointer;
111
+ }
112
+
113
+ input[type="submit"] {
114
+ background-color: #1a5d3a;
115
+ color: white;
116
+ border: none;
117
+ padding: 0.75rem 2rem;
118
+ border-radius: 8px;
119
+ font-size: 1rem;
120
+ font-weight: 500;
121
+ font-family: 'Outfit', sans-serif;
122
+ cursor: pointer;
123
+ transition: all 0.3s ease;
124
+ }
125
+
126
+ input[type="submit"]:hover {
127
+ background-color: #143d2e;
128
+ transform: translateY(-2px);
129
+ box-shadow: 0 4px 12px rgba(26, 93, 58, 0.3);
130
+ }
131
+
132
+ iframe {
133
+ width: 100%;
134
+ height: 600px;
135
+ border: 1px solid #dee2e6;
136
+ border-radius: 8px;
137
+ margin-top: 1.5rem;
138
+ }
139
+ </style>
140
+ </head>
141
+ <body>
142
+ <!-- Navbar with Heading -->
143
+ <nav class="navbar navbar-expand-lg navbar-dark" style="background-color: #1a5d3a; padding: 1rem 3rem;">
144
+ <div class="container-fluid justify-content-center">
145
+ <h1 class="navbar-brand mb-0" style="font-size: 1.75rem; font-weight: 700;">Crop Production Analysis</h1>
146
+ </div>
147
+ </nav>
148
+
149
+ <!-- Hero Section with Navigation -->
150
+ <div class="hero-header">
151
+ <div class="container">
152
+ <ul class="navbar-nav">
153
+ <li class="nav-item"><a class="nav-link" href="/prodction_analysis"><i class="bi bi-graph-up"></i> Production Analysis</a></li>
154
+ <li class="nav-item"><a class="nav-link" href="/heatmap_analysis"><i class="bi bi-map"></i> Heatmap Analysis</a></li>
155
+ <li class="nav-item"><a class="nav-link" href="/season_analysis"><i class="bi bi-calendar3"></i> Season Analysis</a></li>
156
+ <li class="nav-item"><a class="nav-link" href="/crop_analysis"><i class="bi bi-geo-alt"></i> Geospatial Analysis</a></li>
157
+ </ul>
158
+ </div>
159
+ </div>
160
+
161
+ <!-- Floating Content Card -->
162
+ <div class="main-container">
163
+ <div class="content-card">
164
+ <h2 class="heading">🗺️ Production Heatmap</h2>
165
+ <form method="get">
166
+ <div class="scrollable">
167
+ <label>Select Crops:</label><br><br>
168
+ {% for crop in crops %}
169
+ <input type="checkbox" name="crops" value="{{ crop }}" {% if crop in selected_crops %}checked{% endif %}>
170
+ {{ crop }}<br>
171
+ {% endfor %}
172
+ </div>
173
+ <input type="submit" value="Update Heatmap">
174
+ </form>
175
+ <iframe src="{{ map_url }}"></iframe>
176
+ </div>
177
+ </div>
178
+
179
+ <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
180
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js"></script>
181
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
182
+ </body>
183
+ </html>
templates/seasonal_analysis.html ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Season Analysis</title>
7
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap" rel="stylesheet">
12
+ <style>
13
+ * {
14
+ margin: 0;
15
+ padding: 0;
16
+ box-sizing: border-box;
17
+ }
18
+
19
+ body {
20
+ font-family: 'Outfit', sans-serif;
21
+ background-color: #f8f9fa;
22
+ min-height: 100vh;
23
+ padding: 0;
24
+ padding-bottom: 2rem;
25
+ }
26
+
27
+ /* Hero Header */
28
+ .hero-header {
29
+ background-color: #1a5d3a;
30
+ color: white;
31
+ padding: 2rem 0 4rem 0;
32
+ box-shadow: 0 4px 20px rgba(26, 93, 58, 0.2);
33
+ }
34
+
35
+ .navbar {
36
+ background-color: transparent;
37
+ padding: 1rem 3rem;
38
+ }
39
+
40
+ .navbar-nav {
41
+ flex-direction: row;
42
+ justify-content: center;
43
+ width: 100%;
44
+ gap: 3rem;
45
+ }
46
+
47
+ .nav-item {
48
+ padding: 0;
49
+ }
50
+
51
+ .nav-link {
52
+ color: white !important;
53
+ font-weight: 500;
54
+ font-size: 1rem;
55
+ padding: 0.5rem 1.5rem !important;
56
+ border-radius: 50px;
57
+ transition: all 0.3s ease;
58
+ border: 1px solid transparent;
59
+ }
60
+
61
+ .nav-link:hover {
62
+ background-color: #ffffff;
63
+ color: #198754 !important;
64
+ border-color: #198754;
65
+ }
66
+
67
+ /* Main Container */
68
+ .main-container {
69
+ max-width: 1200px;
70
+ margin: -3rem auto 3rem auto;
71
+ padding: 0 1.5rem;
72
+ }
73
+
74
+ .content-card {
75
+ background: #ffffff;
76
+ border-radius: 20px;
77
+ padding: 3rem;
78
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08);
79
+ border: none;
80
+ text-align: center;
81
+ }
82
+
83
+ .heading {
84
+ font-weight: 700;
85
+ color: #212529;
86
+ font-size: 2rem;
87
+ margin-bottom: 2rem;
88
+ }
89
+
90
+ img {
91
+ max-width: 100%;
92
+ height: auto;
93
+ border: 1px solid #dee2e6;
94
+ border-radius: 8px;
95
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
96
+ }
97
+ </style>
98
+ </head>
99
+ <body>
100
+ <!-- Navbar with Heading -->
101
+ <nav class="navbar navbar-expand-lg navbar-dark" style="background-color: #1a5d3a; padding: 1rem 3rem;">
102
+ <div class="container-fluid justify-content-center">
103
+ <h1 class="navbar-brand mb-0" style="font-size: 1.75rem; font-weight: 700;">Crop Production Analysis</h1>
104
+ </div>
105
+ </nav>
106
+
107
+ <!-- Hero Section with Navigation -->
108
+ <div class="hero-header">
109
+ <div class="container">
110
+ <ul class="navbar-nav">
111
+ <li class="nav-item"><a class="nav-link" href="/prodction_analysis"><i class="bi bi-graph-up"></i> Production Analysis</a></li>
112
+ <li class="nav-item"><a class="nav-link" href="/heatmap_analysis"><i class="bi bi-map"></i> Heatmap Analysis</a></li>
113
+ <li class="nav-item"><a class="nav-link" href="/season_analysis"><i class="bi bi-calendar3"></i> Season Analysis</a></li>
114
+ <li class="nav-item"><a class="nav-link" href="/crop_analysis"><i class="bi bi-geo-alt"></i> Geospatial Analysis</a></li>
115
+ </ul>
116
+ </div>
117
+ </div>
118
+
119
+ <!-- Floating Content Card -->
120
+ <div class="main-container">
121
+ <div class="content-card">
122
+ <h2 class="heading">🌿 Season Analysis</h2>
123
+ <img src="{{ image_url }}" alt="Season Analysis">
124
+ </div>
125
+ </div>
126
+
127
+ <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
128
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js"></script>
129
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
130
+ </body>
131
+ </html>