{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "extensions": { "jupyter_dashboards": { "version": 1, "views": { "grid_default": {}, "report_default": {} } } } }, "outputs": [], "source": [ "import json\n", "import copy\n", "from ipyleaflet import Map, GeoJSON, Layer" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "m = Map(center=[53.88, 27.45], zoom=3, name=\"Base map\")\n", "m" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "extensions": { "jupyter_dashboards": { "version": 1, "views": { "grid_default": {}, "report_default": {} } } } }, "outputs": [], "source": [ "# geojson layer with hover handler\n", "with open(\"./europe_110.geo.json\", \"r\") as f:\n", " data = json.load(f)\n", "\n", "for feature in data[\"features\"]:\n", " feature[\"properties\"][\"style\"] = {\n", " \"color\": \"grey\",\n", " \"weight\": 1,\n", " \"fillColor\": \"grey\",\n", " \"fillOpacity\": 0.2,\n", " }\n", "\n", "selected_set = set()\n", "selected_layer = None\n", "\n", "\n", "def convert_selected_set_to_geojson(selected_set):\n", " geojson = {\"type\": \"FeatureCollection\", \"features\": []}\n", " geojson[\"features\"] = [\n", " feature\n", " for feature in data[\"features\"]\n", " if feature[\"properties\"][\"iso_a3\"] in selected_set\n", " ]\n", " for feature in data[\"features\"]:\n", " feature[\"properties\"][\"style\"] = {\n", " \"color\": \"yellow\",\n", " \"weight\": 2,\n", " \"fillColor\": \"grey\",\n", " \"fillOpacity\": 0.2,\n", " }\n", " return geojson\n", "\n", "\n", "def selected_onclick_handler(event=None, id=None, properties=None, **args):\n", " global selected_layer\n", " if properties is None:\n", " return\n", " cid = properties[\"iso_a3\"]\n", " selected_set.remove(cid)\n", " if selected_layer is not None:\n", " m.remove_layer(selected_layer)\n", " selected_layer = GeoJSON(\n", " data=convert_selected_set_to_geojson(selected_set),\n", " name=\"Selected EU Countries\",\n", " hover_style={\"fillColor\": \"yellow\"},\n", " )\n", " selected_layer.on_click(selected_onclick_handler)\n", " m.add(selected_layer)\n", "\n", "\n", "def geojson_onclick_handler(event=None, id=None, properties=None, **args):\n", " global selected_layer\n", " if properties is None:\n", " return\n", " cid = properties[\"iso_a3\"]\n", " selected_set.add(cid)\n", " if selected_layer is not None:\n", " m.remove_layer(selected_layer)\n", " selected_layer = GeoJSON(\n", " data=convert_selected_set_to_geojson(selected_set),\n", " name=\"Selected EU Countries\",\n", " hover_style={\"fillColor\": \"yellow\"},\n", " )\n", " selected_layer.on_click(selected_onclick_handler)\n", " m.add(selected_layer)\n", "\n", "\n", "geojson_layer = GeoJSON(\n", " data=data, name=\"EU Countries\", hover_style={\"fillColor\": \"red\"}\n", ")\n", "geojson_layer.on_click(geojson_onclick_handler)\n", "m.add(geojson_layer)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "extensions": { "jupyter_dashboards": { "activeView": "grid_default", "version": 1, "views": { "grid_default": { "cellMargin": 10, "defaultCellHeight": 20, "maxColumns": 12, "name": "grid", "type": "grid" }, "report_default": { "name": "report", "type": "report" } } } }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.5" } }, "nbformat": 4, "nbformat_minor": 4 }