{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "0", "metadata": {}, "outputs": [], "source": [ "# %pip install leafmap" ] }, { "cell_type": "code", "execution_count": null, "id": "1", "metadata": {}, "outputs": [], "source": [ "import json\n", "import duckdb\n", "import ipywidgets as widgets\n", "import leafmap.maplibregl as leafmap\n", "import matplotlib.pyplot as plt\n", "\n", "m = leafmap.Map(sidebar_visible=True, layer_manager_expanded=False, height=\"800px\")\n", "m.add_basemap(\"Esri.WorldImagery\", before_id=m.first_symbol_layer_id, visible=False)\n", "m.add_draw_control(controls=[\"polygon\", \"trash\"])\n", "m" ] }, { "cell_type": "code", "execution_count": null, "id": "2", "metadata": {}, "outputs": [], "source": [ "con = duckdb.connect()\n", "con.install_extension(\"httpfs\")\n", "con.install_extension(\"spatial\")\n", "con.install_extension(\"h3\", repository=\"community\")\n", "con.load_extension(\"httpfs\")\n", "con.load_extension(\"spatial\")\n", "con.load_extension(\"h3\")\n", "\n", "url = \"https://data.gishub.org/duckdb/h3_res4_geo.parquet\"\n", "\n", "con.sql(\n", " f\"CREATE TABLE IF NOT EXISTS h3_res4_geo AS SELECT * FROM read_parquet('{url}');\"\n", ")\n", "\n", "colormaps = sorted(plt.colormaps())\n", "\n", "checkbox = widgets.Checkbox(\n", " description=\"3D Map\",\n", " value=True,\n", " style={\"description_width\": \"initial\"},\n", " layout=widgets.Layout(width=\"initial\"),\n", ")\n", "outline_chk = widgets.Checkbox(\n", " description=\"Add Hexagon Outline\",\n", " value=False,\n", " style={\"description_width\": \"initial\"},\n", " layout=widgets.Layout(width=\"initial\"),\n", ")\n", "\n", "colormap_dropdown = widgets.Dropdown(\n", " options=colormaps,\n", " description=\"Colormap:\",\n", " value=\"inferno\",\n", " style={\"description_width\": \"initial\"},\n", ")\n", "class_slider = widgets.IntSlider(\n", " description=\"Class:\",\n", " min=1,\n", " max=10,\n", " step=1,\n", " value=5,\n", " style={\"description_width\": \"initial\"},\n", ")\n", "apply_btn = widgets.Button(description=\"Apply\")\n", "close_btn = widgets.Button(description=\"Close\")\n", "output_widget = widgets.Output()\n", "with output_widget:\n", " print(\"Draw a polygon on the map. Then, \\nclick on the 'Apply' button\")\n", "\n", "\n", "def on_apply_btn_click(change):\n", " with output_widget:\n", " try:\n", " output_widget.clear_output()\n", " if len(m.draw_features_selected) > 0:\n", " geojson = m.draw_features_selected[0][\"geometry\"]\n", " df = con.sql(\n", " f\"\"\"\n", " SELECT * EXCLUDE (geometry), ST_AsText(geometry) AS geometry FROM h3_res4_geo\n", " WHERE ST_Intersects(geometry, ST_GeomFromGeoJSON('{json.dumps(geojson)}'));\n", " \"\"\"\n", " ).df()\n", " gdf = leafmap.df_to_gdf(df)\n", " if \"H3 Hexagon\" in m.layer_dict:\n", " m.remove_layer(\"H3 Hexagon\")\n", "\n", " if outline_chk.value:\n", " outline_color = \"rgba(255, 255, 255, 255)\"\n", " else:\n", " outline_color = \"rgba(255, 255, 255, 0)\"\n", "\n", " if checkbox.value:\n", " m.add_data(\n", " gdf,\n", " column=\"building_count\",\n", " scheme=\"JenksCaspall\",\n", " cmap=colormap_dropdown.value,\n", " k=class_slider.value,\n", " outline_color=outline_color,\n", " name=\"H3 Hexagon\",\n", " before_id=m.first_symbol_layer_id,\n", " extrude=True,\n", " fit_bounds=False,\n", " add_legend=False,\n", " )\n", " else:\n", " m.add_data(\n", " gdf,\n", " column=\"building_count\",\n", " scheme=\"JenksCaspall\",\n", " cmap=colormap_dropdown.value,\n", " k=class_slider.value,\n", " outline_color=outline_color,\n", " name=\"H3 Hexagon\",\n", " before_id=m.first_symbol_layer_id,\n", " fit_bounds=False,\n", " add_legend=False,\n", " )\n", "\n", " m.remove_from_sidebar(name=\"Legend\")\n", " m.add_legend_to_sidebar(\n", " title=\"Building Count\",\n", " legend_dict=m.legend_dict,\n", " )\n", " except Exception as e:\n", " with output_widget:\n", " print(e)\n", "\n", "\n", "def on_close_btn_click(change):\n", " m.remove_from_sidebar(name=\"H3 Hexagonal Grid\")\n", "\n", "\n", "apply_btn.on_click(on_apply_btn_click)\n", "close_btn.on_click(on_close_btn_click)\n", "\n", "widget = widgets.VBox(\n", " [\n", " widgets.HBox([checkbox, outline_chk]),\n", " colormap_dropdown,\n", " class_slider,\n", " widgets.HBox([apply_btn, close_btn]),\n", " output_widget,\n", " ]\n", ")\n", "m.add_to_sidebar(widget, label=\"H3 Hexagonal Grid\", widget_icon=\"mdi-hexagon-multiple\")" ] } ], "metadata": { "kernelspec": { "display_name": "geo", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.9" } }, "nbformat": 4, "nbformat_minor": 5 }