From 3a54eeb77cc9c689f9c84605d20467544678ecff Mon Sep 17 00:00:00 2001 From: Eric Duminil Date: Mon, 22 Jul 2024 15:22:39 +0200 Subject: [PATCH] Displaying Wurzburg open data trees on map --- .../output/wuerzburg_trees.html | 803 ++++++++++++++++++ .../parse_open_data.py | 31 +- .../parse_wurzburg_open_data/requirements.txt | 1 + 3 files changed, 830 insertions(+), 5 deletions(-) create mode 100644 python_scripts/parse_wurzburg_open_data/output/wuerzburg_trees.html diff --git a/python_scripts/parse_wurzburg_open_data/output/wuerzburg_trees.html b/python_scripts/parse_wurzburg_open_data/output/wuerzburg_trees.html new file mode 100644 index 0000000..25e2117 --- /dev/null +++ b/python_scripts/parse_wurzburg_open_data/output/wuerzburg_trees.html @@ -0,0 +1,803 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/python_scripts/parse_wurzburg_open_data/parse_open_data.py b/python_scripts/parse_wurzburg_open_data/parse_open_data.py index d3c7871..7e684ac 100644 --- a/python_scripts/parse_wurzburg_open_data/parse_open_data.py +++ b/python_scripts/parse_wurzburg_open_data/parse_open_data.py @@ -9,10 +9,13 @@ from pathlib import Path import requests import shutil import pandas as pd +import folium from rich import print SCRIPT_DIR = Path(__file__).resolve().parent INPUT_DIR = SCRIPT_DIR / 'input' +OUTPUT_DIR = SCRIPT_DIR / 'output' +OUTPUT_DIR.mkdir(exist_ok=True) INPUT_FILE = INPUT_DIR / 'wuerzburg_trees.parquet' INPUT_URL = "https://opendata.wuerzburg.de/api/explore/v2.1/catalog/datasets/sls-klimabaeume/exports/parquet?lang=en&timezone=Europe%2FBerlin" @@ -34,12 +37,30 @@ else: df = pd.read_parquet(INPUT_FILE, engine='fastparquet') -print(df) - -interesting_columns = ['tree_number', 'species_latin', 'latitude', 'longitude'] +interactive_map = folium.Map() species = 'species_latin' coordinates = ['latitude', 'longitude'] -df[interesting_columns].drop_duplicates().groupby(species).apply(print) +interesting_columns = ['tree_number', 'species_latin', 'latitude', 'longitude'] +lat_min, lon_min, lat_max, lon_max = df[coordinates].agg(['min', 'max']).stack().values +interactive_map.fit_bounds([(lat_min, lon_min), (lat_max, lon_max)]) + +for same, grouped_df in df[interesting_columns].drop_duplicates().groupby(species): + for row in grouped_df.itertuples(): + folium.Circle( + location=[row.latitude, row.longitude], + tooltip=row.species_latin, + radius=50, # [m] + color="black", + weight=1, + fill_opacity=0.9, + opacity=1, + fill_color="green", + fill=False, # gets overridden by fill_color + popup=f"Tree #{row.tree_number} ({row.species_latin})", + ).add_to(interactive_map) + +output_map = OUTPUT_DIR / INPUT_FILE.with_suffix('.html').name +interactive_map.save(output_map) -df[interesting_columns].drop_duplicates().groupby(coordinates).apply(print) +print(f"{output_map} has been written.") diff --git a/python_scripts/parse_wurzburg_open_data/requirements.txt b/python_scripts/parse_wurzburg_open_data/requirements.txt index 5a331f5..bcb66a2 100644 --- a/python_scripts/parse_wurzburg_open_data/requirements.txt +++ b/python_scripts/parse_wurzburg_open_data/requirements.txt @@ -2,3 +2,4 @@ pandas requests fastparquet folium +rich -- GitLab