import streamlit as st import cv2 import folium import geopandas as gpd import pandas as pd from PIL import Image import numpy as np from streamlit_folium import st_folium from typing import Dict, List import requests from time import sleep def process_image(image_path): # Read the image img = cv2.imread(image_path) # Apply image processing techniques (e.g., noise reduction, edge detection) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(gray, (5, 5), 0) edges = cv2.Canny(blur, 100, 200) # Dummy analysis results results = { 'Topography': 'Mountainous', 'Forestry Pattern': 'Dense Forest', 'Ocean Pattern': 'Calm', 'Geological Features': 'Mountains, Rivers' } return img, edges, results def display_images(images): # Generate captions for each pair of images captions = [] for i in range(0, len(images), 2): captions.append(f'Original Image {i//2 + 1}') captions.append(f'Processed Image {i//2 + 1}') # Display images st.image(images, caption=captions, width=300) def display_results(results): st.write("### Analysis Results") for key, value in results.items(): st.write(f"{key}: {value}") def export_results(results, export_format): results_df = pd.DataFrame(results) if export_format == "Excel (.xlsx)": results_df.to_excel('analysis_results.xlsx', index=False) st.success("Results exported to analysis_results.xlsx") elif export_format == "CSV (.csv)": results_df.to_csv('analysis_results.csv', index=False) st.success("Results exported to analysis_results.csv") elif export_format == "JSON (.json)": results_df.to_json('analysis_results.json', orient='records') st.success("Results exported to analysis_results.json") def create_map(location_name, latitude, longitude): map = folium.Map(location=[latitude, longitude], zoom_start=10) folium.Marker(location=[latitude, longitude], popup=location_name).add_to(map) return map def analyze_location(location_name, latitude, longitude): location_info = { 'Location Name': location_name, 'Latitude': latitude, 'Longitude': longitude, } # Get address data from Nominatim API nominatim_url = f"https://nominatim.openstreetmap.org/reverse?format=json&lat={latitude}&lon={longitude}&zoom=10" headers = {'User-Agent': 'DroneImageProcessor/1.0'} response = requests.get(nominatim_url, headers=headers) sleep(1) # Respect rate limiting if response.status_code == 200: osm_data = response.json() address = osm_data.get('address', {}) # Extract relevant information location_info.update({ 'Country': address.get('country', 'Unknown'), 'State/Region': address.get('state', address.get('region', 'Unknown')), 'City': address.get('city', address.get('town', address.get('village', 'Unknown'))), 'Land Use': address.get('landuse', 'Unknown'), }) # Get elevation data from OpenTopoData API elevation_url = f"https://api.opentopodata.org/v1/aster30m?locations={latitude},{longitude}" response = requests.get(elevation_url) sleep(1) # Respect rate limiting if response.status_code == 200: elevation_data = response.json() elevation = elevation_data['results'][0]['elevation'] location_info['Elevation'] = f"{elevation:.1f} meters" # Basic terrain classification based on elevation if elevation < 100: terrain = "Lowland" elif elevation < 500: terrain = "Hills" else: terrain = "Mountains" location_info['Terrain Type'] = terrain return location_info # Streamlit app st.title("Drone Image Processing") # Input for location details location_name = st.text_input("Location Name") latitude_deg = st.number_input("Latitude (degrees)", format="%f") latitude_dir = st.selectbox("Latitude Direction", ["N", "S"]) longitude_deg = st.number_input("Longitude (degrees)", format="%f") longitude_dir = st.selectbox("Longitude Direction", ["E", "W"]) # Convert latitude and longitude to decimal degrees latitude = latitude_deg if latitude_dir == "N" else -latitude_deg longitude = longitude_deg if longitude_dir == "E" else -longitude_deg # Enter button to find and display the location on the map if st.button("Enter"): map = create_map(location_name, latitude, longitude) location_info = analyze_location(location_name, latitude, longitude) st.write("### Location Information") for key, value in location_info.items(): st.write(f"{key}: {value}") st_folium(map, width=700, height=500) # File upload uploaded_files = st.file_uploader("Upload Images", type=["jpg", "jpeg", "png"], accept_multiple_files=True) if uploaded_files and location_name and latitude and longitude: images = [] results_list = [] for uploaded_file in uploaded_files: # Save the uploaded file to a temporary location with open(f"temp_{uploaded_file.name}", "wb") as f: f.write(uploaded_file.getbuffer()) # Process the image original_img, processed_img, results = process_image(f"temp_{uploaded_file.name}") # Append images and results images.append(original_img) images.append(processed_img) results_list.append(results) # Display images display_images(images) # Display results combined_results: Dict[str, List[Dict[str, str]]] = { 'Geological Analysis': [], 'Agricultural and Environmental Analysis': [], 'Urbanisation and Population Analysis': [] } for i, results in enumerate(results_list): st.write(f"### Results for Image {i+1}") display_results(results) combined_results['Geological Analysis'].append({ 'Topography': results['Topography'], 'Geological Features': results['Geological Features'] }) combined_results['Agricultural and Environmental Analysis'].append({ 'Forestry Pattern': results['Forestry Pattern'], 'Ocean Pattern': results['Ocean Pattern'] }) combined_results['Urbanisation and Population Analysis'].append({ 'Urbanisation Impact': 'Not implemented' }) # Export options st.sidebar.subheader("Export Options") export_format = st.sidebar.radio( "Export Format", ["Excel (.xlsx)", "CSV (.csv)", "JSON (.json)"] ) # Export results button if st.sidebar.button("Export Results"): export_results(combined_results, export_format) # Filter results st.write("### Filter Results") filter_option = st.selectbox("Select Analysis Type", ["Geological Analysis", "Agricultural and Environmental Analysis", "Urbanisation and Population Analysis"]) if filter_option == "Geological Analysis": st.write("### Geological Analysis Results") for i, results in enumerate(combined_results['Geological Analysis']): st.write(f"### Results for Image {i+1}") st.write(f"Topography: {results['Topography']}") st.write(f"Geological Features: {results['Geological Features']}") elif filter_option == "Agricultural and Environmental Analysis": st.write("### Agricultural and Environmental Analysis Results") for i, results in enumerate(combined_results['Agricultural and Environmental Analysis']): st.write(f"### Results for Image {i+1}") st.write(f"Forestry Pattern: {results['Forestry Pattern']}") st.write(f"Ocean Pattern: {results['Ocean Pattern']}") elif filter_option == "Urbanisation and Population Analysis": st.write("### Urbanisation and Population Analysis Results") for i, results in enumerate(combined_results['Urbanisation and Population Analysis']): st.write(f"### Results for Image {i+1}") st.write("Urbanisation and Population Analysis not implemented yet.")