import folium
from folium.plugins import MarkerCluster, Draw, MousePosition
import json
import os
# File paths for persistence
MARKERS_FILE = "markers.json"
POLYGONS_FILE = "polygons.json"
MAP_FILE = "map.html"
# Global variable to store the map instance
#map_EWS = None
global map_EWS
# Load markers and polygons
def load_markers():
if os.path.exists(MARKERS_FILE):
with open(MARKERS_FILE, "r") as f:
try:
return json.load(f)
except json.JSONDecodeError:
return {}
return {}
def save_markers():
with open(MARKERS_FILE, "w") as f:
json.dump(markers, f, indent=4)
def load_polygons():
if os.path.exists(POLYGONS_FILE):
with open(POLYGONS_FILE, "r") as f:
try:
return json.load(f)
except json.JSONDecodeError:
return {}
return {}
def save_polygons():
with open(POLYGONS_FILE, "w") as f:
json.dump(polygons, f, indent=4)
markers = load_markers()
polygons = load_polygons()
# Start map (Called once at entry point)
def start_map(lat, lon, zoom):
global map_EWS
global current_lat, current_lon, current_zoom
current_lat, current_lon, current_zoom = lat, lon, zoom
print(f"📍 Starting new map at: lat={current_lat}, lon={current_lon}, zoom={current_zoom}")
regenerate_map()
# Regenerate map
def regenerate_map():
global map_EWS
map_EWS = folium.Map(location=[current_lat,current_lon], zoom_start=current_zoom,tiles="OpenStreetMap")
marker_cluster = MarkerCluster().add_to(map_EWS)
formatter = "function(num) {return L.Util.formatNum(num, 4) + ' ° ';};"
MousePosition(
position="bottomleft", separator=" | ", empty_string="NaN",
lng_first=False, num_digits=22, prefix="Coordinates:",
lat_formatter=formatter, lng_formatter=formatter
).add_to(map_EWS)
for marker_id, data in markers.items():
lat, lon, popup_text = data["lat"], data["lon"], data["popup_text"]
folium.Marker(
location=[lat, lon],
popup=f"{popup_text} (ID: {marker_id})",
tooltip=f"Marker {marker_id}"
).add_to(marker_cluster)
for polygon_id, data in polygons.items():
coordinates, label, color = data["coordinates"], data["label"], data["color"]
folium.Polygon(
locations=coordinates,
color=color,
weight=3,
fill=True,
fill_opacity=0.3,
fill_color=color,
popup=f"{label} (ID: {polygon_id})",
tooltip=f"Polygon {polygon_id}"
).add_to(map_EWS)
draw_options = {
"polyline": False,
"polygon": {
"shapeOptions": {
"color": "red",
"weight": 3,
"fillColor": "blue",
"fillOpacity": 0.3
}
},
"rectangle": False,
"circle": False,
"marker": False,
"circlemarker": False
}
Draw(export=True, position='topleft', filename='data.geojson', draw_options=draw_options, edit_options={'poly': {'allowIntersection': False}}).add_to(map_EWS)
save_map()
# Save map
def save_map():
global map_EWS, current_lat, current_lon, current_zoom
if map_EWS:
map_EWS.save(MAP_FILE)
print(f"✅ Map saved as {MAP_FILE}")
else:
print("❌ Error: map_EWS is not initialized.")
return MAP_FILE
# Marker functions
def add_marker(marker_id, lat, lon, popup_text):
if marker_id in markers:
print("Error: Marker ID already exists. Marker not added.")
return
markers[marker_id] = {"lat": lat, "lon": lon, "popup_text": popup_text}
save_markers()
regenerate_map()
return save_map()
def update_marker(marker_id, new_lat, new_lon, new_popup_text):
if marker_id not in markers:
print("Error: Marker not found. Position not updated.")
return
markers[marker_id] = {"lat": new_lat, "lon": new_lon, "popup_text": new_popup_text}
save_markers()
regenerate_map()
return save_map()
def remove_marker(marker_id):
if marker_id not in markers:
print("Error: Marker not found. Marker not removed.")
return
del markers[marker_id]
save_markers()
regenerate_map()
return save_map()
# Polygon functions
def add_polygon(polygon_id, coordinates, label="Polygon", border_color="red"):
valid_colors = {"blue", "red", "black", "green"}
if polygon_id in polygons:
print("Error: Polygon ID already exists. Polygon not added.")
return
if border_color not in valid_colors:
border_color = "red"
polygons[polygon_id] = {"coordinates": coordinates, "label": label, "color": border_color}
save_polygons()
regenerate_map()
return save_map()
def update_polygon(polygon_id, new_coordinates, new_label="Polygon", new_border_color="red"):
valid_colors = {"blue", "red", "black", "green"}
if polygon_id not in polygons:
print("Error: Polygon not found. Polygon not updated.")
return
polygons[polygon_id]= {"coordinates": new_coordinates, "label": new_label, "color": new_border_color}
save_polygons()
regenerate_map()
return save_map()
def remove_polygon(polygon_id):
if polygon_id not in polygons:
print("Error: Polygon not found. Polygon not removed.")
return
del polygons[polygon_id]
save_polygons()
regenerate_map()
return save_map()