Spaces:
Runtime error
Runtime error
import folium | |
import gradio as gr | |
import os | |
from bs4 import BeautifulSoup | |
import simplekml | |
# Function to create the permaculture map | |
def create_permaculture_map(coordinates, output_dir="output"): | |
# Create base map | |
m = folium.Map( | |
location=coordinates, | |
zoom_start=18, | |
control_scale=True, | |
tiles="cartodbpositron" | |
) | |
# Add north arrow | |
north_arrow = """ | |
<div style="position: fixed; top: 10px; right: 10px; z-index: 1000; | |
font-size: 24px; font-weight: bold; color: black;">β N</div> | |
""" | |
m.get_root().html.add_child(folium.Element(north_arrow)) | |
# Add scale | |
folium.plugins.MousePosition().add_to(m) | |
# Add map elements | |
elements = { | |
"Building": {"loc": [0.0001, 0.0001], "color": "red", "icon": "home"}, | |
"Vegetation": {"loc": [-0.0001, -0.0001], "color": "green", "icon": "tree"}, | |
"Water Management": {"loc": [0.0003, -0.0003], "color": "blue", "icon": "tint"}, | |
"Energy": {"loc": [-0.0003, 0.0003], "color": "orange", "icon": "bolt"} | |
} | |
for name, props in elements.items(): | |
folium.Marker( | |
location=[coordinates[0] + props["loc"][0], | |
coordinates[1] + props["loc"][1]], | |
icon=folium.Icon(color=props["color"], icon=props["icon"]), | |
popup=name | |
).add_to(m) | |
# Add paths | |
folium.PolyLine( | |
locations=[ | |
[coordinates[0] - 0.0002, coordinates[1] - 0.0002], | |
[coordinates[0] + 0.0002, coordinates[1] + 0.0002] | |
], | |
color="brown", | |
weight=2, | |
popup="Path" | |
).add_to(m) | |
# Save map | |
os.makedirs(output_dir, exist_ok=True) | |
map_path = os.path.join(output_dir, "map.html") | |
m.save(map_path) | |
return map_path | |
# Gradio interface | |
def generate_map(lat, lon): | |
# Validate coordinates | |
if not (-90 <= lat <= 90) or not (-180 <= lon <= 180): | |
raise gr.Error("Invalid coordinates! Lat: -90 to 90, Lon: -180 to 180") | |
map_path = create_permaculture_map([lat, lon]) | |
with open(map_path, "r") as f: | |
html = f.read() | |
return f'<iframe srcdoc="{html}" width="100%" height="500"></iframe>' | |
# Create Gradio app | |
with gr.Blocks() as app: | |
gr.Markdown("# π± Permaculture Base Map Designer") | |
with gr.Row(): | |
with gr.Column(): | |
# Map location picker | |
map_picker = gr.Map(label="Click map to select location", height=300) | |
# Coordinate inputs | |
with gr.Row(): | |
lat_input = gr.Number(label="Latitude", value=45.5236) | |
lon_input = gr.Number(label="Longitude", value=-122.6750) | |
gr.Markdown("### Map Options") | |
gr.Button("Generate Map").click( | |
generate_map, | |
inputs=[lat_input, lon_input], | |
outputs=gr.HTML(label="Generated Map") | |
) | |
# Display generated map | |
with gr.Column(): | |
gr.HTML(label="Generated Map") | |
# Connect map clicks to coordinate inputs | |
def update_coords(map_data): | |
if map_data and map_data.get("features"): | |
lon, lat = map_data["features"][0]["geometry"]["coordinates"] | |
return lat, lon | |
return None, None | |
map_picker.select(update_coords, outputs=[lat_input, lon_input]) | |
# Launch app | |
if __name__ == "__main__": | |
app.launch() |