From 5b0ec40bda1296d38b235b5c598adf718c8e6c70 Mon Sep 17 00:00:00 2001 From: anitagraser Date: Sat, 7 Oct 2023 15:00:27 +0200 Subject: [PATCH] add panel app --- apps/panel-test.ipynb | 125 +++++++++++++++++++++++++++++++++++++++++ binder/environment.yml | 2 +- 2 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 apps/panel-test.ipynb diff --git a/apps/panel-test.ipynb b/apps/panel-test.ipynb new file mode 100644 index 0000000..2163e9b --- /dev/null +++ b/apps/panel-test.ipynb @@ -0,0 +1,125 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "9f6a6099-ce19-4c11-9dd3-191a8aab35d5", + "metadata": {}, + "outputs": [], + "source": [ + "from os.path import exists\n", + "from urllib.request import urlretrieve\n", + "import geopandas as gpd\n", + "import pandas as pd\n", + "import hvplot.pandas\n", + "\n", + "from holoviews import opts\n", + "opts.defaults(opts.Overlay(active_tools=['wheel_zoom'], frame_width=500, frame_height=400))\n", + "\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "\n", + "def get_gdf_from_wfs(layer):\n", + " \"\"\"\n", + " Get geopandas.GeoDataFrame from data.wien.gv.at WFS service based on layer name\n", + " \n", + " Parameters\n", + " ----------\n", + " layer : string\n", + " WFS layer name \n", + " \"\"\"\n", + " file = f'{layer}.json'\n", + " url = f\"https://data.wien.gv.at/daten/geo?service=WFS&request=GetFeature&version=1.1.0&typeName=ogdwien:{layer}&srsName=EPSG:4326&outputFormat=json\"\n", + " if not exists(file):\n", + " try:\n", + " urlretrieve(url, file)\n", + " except:\n", + " from pyodide.http import open_url\n", + " url_contents = open_url(url)\n", + " file = url_contents.read()\n", + " return gpd.read_file(file)\n", + "\n", + "def plot_with_buffer(gdf, buffer_size, *args, **kwargs):\n", + " \"\"\"\n", + " Convenience function for plotting a GeoPandas point GeoDataFrame using point markers plus buffer polygons\n", + " \n", + " Parameters\n", + " ----------\n", + " gdf : geopandas.GeoDataFrame\n", + " point GeoDataFrame to plot\n", + " buffer_size : numeric\n", + " size of the buffer in meters (measured in EPSG:31287)\n", + " \"\"\"\n", + " buffered = gdf.to_crs('epsg:31287').buffer(buffer_size)\n", + " buffered = gdf.copy().set_geometry(buffered).to_crs('epsg:4326')\n", + " \n", + " plot = ( buffered.hvplot(geo=True, tiles='OSM', alpha=0.5, line_width=0, *args, **kwargs) * \n", + " gdf.hvplot(geo=True, hover_cols='all') \n", + " ).opts(active_tools=['wheel_zoom'])\n", + " \n", + " #plot = buffered.explore(height=500)\n", + " #plot = gdf.explore(m=plot)\n", + " \n", + " return plot\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ae0d7813-1f97-467c-8590-8dcad78a843a", + "metadata": {}, + "outputs": [], + "source": [ + "import panel as pn\n", + "\n", + "pn.extension(sizing_mode=\"stretch_width\", template=\"fast\")\n", + "pn.state.template.param.update(site=\"Panel in the Browser\", title=\"Data.Wien.gv.at Viewer\")\n", + "\n", + "wfs_layer = pn.widgets.TextInput(name=\"WFS Layer (e.g. RADGRAETZELOGD, SCOOTERABSTELLOGD, ...): \", \n", + " value=\"RADGRAETZELOGD\")\n", + "buffer_size = pn.widgets.IntSlider(start=100, end=1000, name=\"Buffer size (meters)\")\n", + "\n", + "def pipeline(wfs_layer, buffer_size):\n", + " gdf = get_gdf_from_wfs(wfs_layer)\n", + " return plot_with_buffer(gdf, buffer_size)\n", + "\n", + "pn.Column(\n", + " \"For a full list of WFS layers, see https://www.data.gv.at/auftritte/?organisation=stadt-wien&formatFilter%5B0%5D=WFS\",\n", + " wfs_layer,\n", + " \"Move the slider below to change the buffer size\",\n", + " buffer_size,\n", + " pn.bind(pipeline, wfs_layer, buffer_size),\n", + ").servable()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a328dd5a-6961-43c1-9f02-9827de3e03a6", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "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.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/binder/environment.yml b/binder/environment.yml index 531a23e..7cfae61 100644 --- a/binder/environment.yml +++ b/binder/environment.yml @@ -3,7 +3,7 @@ channels: - conda-forge - default dependencies: - - python=3.7 + - python=3.10 - numpy - cython - matplotlib