Sentinel_One / tools /mapping_utils.py
BARBASTE Paul
Initial commit
dd370c5
import requests
import folium
COUNTRIES_AND_CITIES = {
"Afghanistan": ["Kabul", "Kandahar", "Herat", "Mazar-i-Sharif", "Jalalabad"],
"Albania": ["Tirana", "Durrës", "Vlorë", "Shkodër", "Fier"],
"Algeria": ["Algiers", "Oran", "Constantine", "Annaba", "Blida"],
"Argentina": ["Buenos Aires", "Córdoba", "Rosario", "Mendoza", "La Plata"],
"Armenia": ["Yerevan", "Gyumri", "Vanadzor", "Vagharshapat", "Hrazdan"],
"Australia": [
"Sydney",
"Melbourne",
"Brisbane",
"Perth",
"Adelaide",
"Gold Coast",
"Newcastle",
"Canberra",
"Sunshine Coast",
"Wollongong",
],
"Austria": ["Vienna", "Graz", "Linz", "Salzburg", "Innsbruck"],
"Azerbaijan": ["Baku", "Ganja", "Sumqayit", "Mingachevir", "Lankaran"],
"Bahrain": ["Manama", "Riffa", "Muharraq", "Hamad Town", "A'ali"],
"Bangladesh": ["Dhaka", "Chittagong", "Sylhet", "Rajshahi", "Khulna"],
"Belarus": ["Minsk", "Gomel", "Mogilev", "Vitebsk", "Grodno"],
"Belgium": ["Brussels", "Antwerp", "Ghent", "Charleroi", "Liège"],
"Bolivia": ["La Paz", "Santa Cruz", "Cochabamba", "Sucre", "Oruro"],
"Bosnia and Herzegovina": ["Sarajevo", "Banja Luka", "Tuzla", "Zenica", "Mostar"],
"Brazil": [
"São Paulo",
"Rio de Janeiro",
"Brasília",
"Salvador",
"Fortaleza",
"Belo Horizonte",
"Manaus",
"Curitiba",
"Recife",
"Goiânia",
],
"Bulgaria": ["Sofia", "Plovdiv", "Varna", "Burgas", "Ruse"],
"Cambodia": ["Phnom Penh", "Siem Reap", "Battambang", "Sihanoukville", "Poipet"],
"Canada": [
"Toronto",
"Montreal",
"Vancouver",
"Calgary",
"Edmonton",
"Ottawa",
"Winnipeg",
"Quebec City",
"Hamilton",
"Kitchener",
],
"Chile": ["Santiago", "Valparaíso", "Concepción", "La Serena", "Antofagasta"],
"China": [
"Shanghai",
"Beijing",
"Chongqing",
"Tianjin",
"Guangzhou",
"Shenzhen",
"Wuhan",
"Dongguan",
"Chengdu",
"Nanjing",
],
"Colombia": ["Bogotá", "Medellín", "Cali", "Barranquilla", "Cartagena"],
"Croatia": ["Zagreb", "Split", "Rijeka", "Osijek", "Zadar"],
"Czech Republic": ["Prague", "Brno", "Ostrava", "Plzen", "Liberec"],
"Denmark": ["Copenhagen", "Aarhus", "Odense", "Aalborg", "Esbjerg"],
"Ecuador": ["Quito", "Guayaquil", "Cuenca", "Santo Domingo", "Machala"],
"Egypt": ["Cairo", "Alexandria", "Giza", "Shubra El Kheima", "Port Said"],
"Estonia": ["Tallinn", "Tartu", "Narva", "Pärnu", "Kohtla-Järve"],
"Ethiopia": ["Addis Ababa", "Dire Dawa", "Mekelle", "Adama", "Awassa"],
"Finland": ["Helsinki", "Espoo", "Tampere", "Vantaa", "Oulu"],
"France": [
"Paris",
"Lyon",
"Marseille",
"Toulouse",
"Nice",
"Nantes",
"Strasbourg",
"Montpellier",
"Bordeaux",
"Lille",
],
"Georgia": ["Tbilisi", "Batumi", "Kutaisi", "Rustavi", "Gori"],
"Germany": [
"Berlin",
"Hamburg",
"Munich",
"Cologne",
"Frankfurt",
"Stuttgart",
"Düsseldorf",
"Dortmund",
"Essen",
"Leipzig",
],
"Ghana": ["Accra", "Kumasi", "Tamale", "Takoradi", "Cape Coast"],
"Greece": ["Athens", "Thessaloniki", "Patras", "Heraklion", "Larissa"],
"Hungary": ["Budapest", "Debrecen", "Szeged", "Miskolc", "Pécs"],
"Iceland": ["Reykjavik", "Kópavogur", "Hafnarfjörður", "Akureyri", "Reykjanesbær"],
"India": [
"Mumbai",
"Delhi",
"Bangalore",
"Hyderabad",
"Chennai",
"Kolkata",
"Ahmedabad",
"Pune",
"Surat",
"Jaipur",
],
"Indonesia": [
"Jakarta",
"Surabaya",
"Bandung",
"Bekasi",
"Medan",
"Tangerang",
"Depok",
"Semarang",
"Palembang",
"Makassar",
],
"Iran": ["Tehran", "Mashhad", "Isfahan", "Karaj", "Shiraz"],
"Iraq": ["Baghdad", "Basra", "Mosul", "Erbil", "Najaf"],
"Ireland": ["Dublin", "Cork", "Limerick", "Galway", "Waterford"],
"Israel": ["Jerusalem", "Tel Aviv", "Haifa", "Rishon LeZion", "Petah Tikva"],
"Italy": [
"Rome",
"Milan",
"Naples",
"Turin",
"Palermo",
"Genoa",
"Bologna",
"Florence",
"Bari",
"Catania",
],
"Japan": [
"Tokyo",
"Osaka",
"Yokohama",
"Nagoya",
"Sapporo",
"Fukuoka",
"Kobe",
"Kawasaki",
"Kyoto",
"Saitama",
],
"Jordan": ["Amman", "Zarqa", "Irbid", "Russeifa", "Wadi as-Ser"],
"Kazakhstan": ["Almaty", "Nur-Sultan", "Shymkent", "Aktobe", "Taraz"],
"Kenya": ["Nairobi", "Mombasa", "Kisumu", "Nakuru", "Eldoret"],
"Kuwait": ["Kuwait City", "Al Ahmadi", "Hawalli", "As Salimiyah", "Sabah as Salim"],
"Latvia": ["Riga", "Daugavpils", "Liepāja", "Jelgava", "Jūrmala"],
"Lebanon": ["Beirut", "Tripoli", "Sidon", "Tyre", "Nabatieh"],
"Lithuania": ["Vilnius", "Kaunas", "Klaipėda", "Šiauliai", "Panevėžys"],
"Luxembourg": [
"Luxembourg City",
"Esch-sur-Alzette",
"Differdange",
"Dudelange",
"Ettelbruck",
],
"Malaysia": ["Kuala Lumpur", "George Town", "Ipoh", "Shah Alam", "Petaling Jaya"],
"Mexico": [
"Mexico City",
"Guadalajara",
"Monterrey",
"Puebla",
"Tijuana",
"León",
"Juárez",
"Torreón",
"Querétaro",
"Mérida",
],
"Morocco": ["Casablanca", "Rabat", "Fez", "Marrakech", "Agadir"],
"Nepal": ["Kathmandu", "Pokhara", "Lalitpur", "Bharatpur", "Biratnagar"],
"Netherlands": [
"Amsterdam",
"Rotterdam",
"The Hague",
"Utrecht",
"Eindhoven",
"Tilburg",
"Groningen",
"Almere",
"Breda",
"Nijmegen",
],
"New Zealand": ["Auckland", "Wellington", "Christchurch", "Hamilton", "Tauranga"],
"Nigeria": ["Lagos", "Abuja", "Kano", "Ibadan", "Port Harcourt"],
"Norway": [
"Oslo",
"Bergen",
"Trondheim",
"Stavanger",
"Drammen",
"Fredrikstad",
"Kristiansand",
"Sandnes",
"Tromsø",
"Sarpsborg",
],
"Pakistan": ["Karachi", "Lahore", "Faisalabad", "Rawalpindi", "Multan"],
"Peru": ["Lima", "Arequipa", "Trujillo", "Chiclayo", "Huancayo"],
"Philippines": ["Manila", "Quezon City", "Davao", "Cebu City", "Zamboanga"],
"Poland": ["Warsaw", "Kraków", "Łódź", "Wrocław", "Poznań"],
"Portugal": ["Lisbon", "Porto", "Vila Nova de Gaia", "Amadora", "Braga"],
"Qatar": ["Doha", "Al Rayyan", "Umm Salal", "Al Wakrah", "Al Khor"],
"Romania": ["Bucharest", "Cluj-Napoca", "Timișoara", "Iași", "Constanța"],
"Russia": [
"Moscow",
"Saint Petersburg",
"Novosibirsk",
"Yekaterinburg",
"Kazan",
"Nizhny Novgorod",
"Chelyabinsk",
"Samara",
"Omsk",
"Rostov-on-Don",
],
"Saudi Arabia": ["Riyadh", "Jeddah", "Mecca", "Medina", "Dammam"],
"Serbia": ["Belgrade", "Novi Sad", "Niš", "Kragujevac", "Subotica"],
"Singapore": ["Singapore"],
"Slovakia": ["Bratislava", "Košice", "Prešov", "Žilina", "Banská Bystrica"],
"Slovenia": ["Ljubljana", "Maribor", "Celje", "Kranj", "Velenje"],
"South Africa": [
"Cape Town",
"Johannesburg",
"Durban",
"Pretoria",
"Port Elizabeth",
],
"South Korea": [
"Seoul",
"Busan",
"Incheon",
"Daegu",
"Daejeon",
"Gwangju",
"Suwon",
"Ulsan",
"Changwon",
"Goyang",
],
"Spain": [
"Madrid",
"Barcelona",
"Valencia",
"Seville",
"Zaragoza",
"Málaga",
"Murcia",
"Palma",
"Las Palmas",
"Bilbao",
],
"Sri Lanka": [
"Colombo",
"Dehiwala-Mount Lavinia",
"Moratuwa",
"Sri Jayawardenepura Kotte",
"Negombo",
],
"Sweden": [
"Stockholm",
"Gothenburg",
"Malmö",
"Uppsala",
"Västerås",
"Örebro",
"Linköping",
"Helsingborg",
"Jönköping",
"Norrköping",
],
"Switzerland": [
"Zurich",
"Geneva",
"Basel",
"Bern",
"Lausanne",
"Winterthur",
"Lucerne",
"St. Gallen",
"Lugano",
"Biel/Bienne",
],
"Thailand": ["Bangkok", "Chiang Mai", "Pattaya", "Phuket", "Hat Yai"],
"Turkey": [
"Istanbul",
"Ankara",
"Izmir",
"Bursa",
"Adana",
"Gaziantep",
"Konya",
"Antalya",
"Kayseri",
"Mersin",
],
"Ukraine": ["Kyiv", "Kharkiv", "Odesa", "Dnipro", "Donetsk"],
"United Arab Emirates": ["Dubai", "Abu Dhabi", "Sharjah", "Al Ain", "Ajman"],
"United Kingdom": [
"London",
"Birmingham",
"Manchester",
"Leeds",
"Liverpool",
"Sheffield",
"Bristol",
"Glasgow",
"Leicester",
"Edinburgh",
],
"United States": [
"New York",
"Los Angeles",
"Chicago",
"Houston",
"Phoenix",
"Philadelphia",
"San Antonio",
"San Diego",
"Dallas",
"San Jose",
],
"Uruguay": ["Montevideo", "Salto", "Paysandú", "Las Piedras", "Rivera"],
"Venezuela": ["Caracas", "Maracaibo", "Valencia", "Barquisimeto", "Maracay"],
"Vietnam": ["Ho Chi Minh City", "Hanoi", "Da Nang", "Bien Hoa", "Hue"],
}
US_STATES = [
"Alabama",
"Alaska",
"Arizona",
"Arkansas",
"California",
"Colorado",
"Connecticut",
"Delaware",
"Florida",
"Georgia",
"Hawaii",
"Idaho",
"Illinois",
"Indiana",
"Iowa",
"Kansas",
"Kentucky",
"Louisiana",
"Maine",
"Maryland",
"Massachusetts",
"Michigan",
"Minnesota",
"Mississippi",
"Missouri",
"Montana",
"Nebraska",
"Nevada",
"New Hampshire",
"New Jersey",
"New Mexico",
"New York",
"North Carolina",
"North Dakota",
"Ohio",
"Oklahoma",
"Oregon",
"Pennsylvania",
"Rhode Island",
"South Carolina",
"South Dakota",
"Tennessee",
"Texas",
"Utah",
"Vermont",
"Virginia",
"Washington",
"West Virginia",
"Wisconsin",
"Wyoming",
"District of Columbia",
]
def get_coordinates_from_dropdown(country: str, city: str, state: str = None) -> tuple:
"""Get coordinates using dropdown selections"""
if not country or not city:
return None, "Please select both country and city."
if country == "United States" and state:
query = f"{city}, {state}, United States"
else:
query = f"{city}, {country}"
try:
url = "https://nominatim.openstreetmap.org/search"
params = {"q": query, "format": "json", "limit": 1}
headers = {"User-Agent": "ClimateRiskTool/1.0"}
response = requests.get(url, params=params, headers=headers, timeout=10)
data = response.json()
if data:
lat = float(data[0]["lat"])
lon = float(data[0]["lon"])
return (
lat,
lon,
), f"✅ Location found: {data[0].get('display_name', query)}"
else:
return None, f"❌ Location '{city}' not found in {country}."
except Exception as e:
return None, f"❌ Error looking up location: {str(e)}"
def create_risk_map(
lat: float, lon: float, city: str, country: str, risk_analysis: dict = None
) -> str:
import folium
# Carte centrée sur la ville
m = folium.Map(location=[lat, lon], zoom_start=10, tiles="OpenStreetMap")
# Définition du popup de risque
marker_color = "blue"
popup_html = f"<b>{city}, {country}</b><br>Lat: {lat:.4f}<br>Lon: {lon:.4f}"
# S'il y a des risques, complète le popup et change la couleur du marker
if risk_analysis and isinstance(risk_analysis, dict):
risks = risk_analysis.get("risk_analysis", {})
popup_html += "<br><b>Risks for this location:</b><br>"
max_level = 0
for risk_name, risk_data in risks.items():
if isinstance(risk_data, dict):
risk_level = risk_data.get("risk_level", 0)
max_level = max(max_level, risk_level)
if risk_level > 80:
emoji = "🔴"
elif risk_level > 60:
emoji = "🟠"
elif risk_level > 40:
emoji = "🟡"
elif risk_level > 20:
emoji = "🟢"
else:
emoji = "⚪"
popup_html += f"{emoji} <b>{risk_name.title()}:</b> {risk_level}/100<br>"
# Couleur du marker selon le risque max détecté
if max_level > 80:
marker_color = "red"
elif max_level > 60:
marker_color = "orange"
elif max_level > 40:
marker_color = "lightgreen"
elif max_level > 20:
marker_color = "green"
else:
marker_color = "blue"
# Création du marker principal
marker = folium.Marker(
[lat, lon],
popup=popup_html,
tooltip=f"Risks for {city}",
icon=folium.Icon(color=marker_color, icon="info-sign"),
)
marker.add_to(m)
# Script pour ouvrir automatiquement le popup à l’affichage
script = f"""
<script>
var marker = {marker.get_name()};
marker.openPopup();
</script>
"""
m.get_root().html.add_child(folium.Element(script))
# Légende
legend_html = """
<div style="position: fixed;
top: 10px; right: 10px; width: 280px; height: auto;
background-color: white; border: 2px solid grey; z-index: 9999;
font-size: 13px; padding: 12px; border-radius: 10px;
box-shadow: 0 4px 8px rgba(0,0,0,0.1);">
<h4 style="margin: 0 0 10px 0;">🗺️ Legend</h4>
<div><span style="color:red;">🔴</span> High risk<br>
<span style="color:orange;">🟠</span> Moderate risk<br>
<span style="color:yellow;">🟡</span> Mild risk<br>
<span style="color:green;">🟢</span> Low risk</div>
</div>
"""
m.get_root().html.add_child(folium.Element(legend_html))
return m._repr_html_()
def get_city_suggestions(country: str) -> str:
"""Return city suggestions for selected country"""
if country in COUNTRIES_AND_CITIES:
cities = COUNTRIES_AND_CITIES[country]
return f"💡 Popular cities in {country}: {', '.join(cities[:8])}..."
return ""