{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Leaflet cluster map of talk locations\n",
"\n",
"Assuming you are working in a Linux or Windows Subsystem for Linux environment, you may need to install some dependencies. Assuming a clean installation, the following will be needed:\n",
"\n",
"```bash\n",
"sudo apt install jupyter\n",
"sudo apt install python3-pip\n",
"pip install python-frontmatter getorg --upgrade\n",
"```\n",
"\n",
"After which you can run this from the `_talks/` directory, via:\n",
"\n",
"```bash\n",
" jupyter nbconvert --to notebook --execute talkmap.ipynb --output talkmap_out.ipynb\n",
"```\n",
" \n",
"The `_talks/` directory contains `.md` files of all your talks. This scrapes the location YAML field from each `.md` file, geolocates it with `geopy/Nominatim`, and uses the `getorg` library to output data, HTML, and Javascript for a standalone cluster map."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2025-02-26T03:36:06.769536Z",
"iopub.status.busy": "2025-02-26T03:36:06.769131Z",
"iopub.status.idle": "2025-02-26T03:36:07.934020Z",
"shell.execute_reply": "2025-02-26T03:36:07.933257Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting python-frontmatter\r\n",
" Downloading python_frontmatter-1.1.0-py3-none-any.whl.metadata (4.1 kB)\r\n",
"Requirement already satisfied: getorg in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (0.3.1)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: PyYAML in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from python-frontmatter) (6.0.2)\r\n",
"Requirement already satisfied: geopy in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from getorg) (2.4.1)\r\n",
"Requirement already satisfied: pygithub in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from getorg) (2.6.1)\r\n",
"Requirement already satisfied: retrying in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from getorg) (1.3.4)\r\n",
"Requirement already satisfied: geographiclib<3,>=1.52 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from geopy->getorg) (2.0)\r\n",
"Requirement already satisfied: pynacl>=1.4.0 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from pygithub->getorg) (1.5.0)\r\n",
"Requirement already satisfied: requests>=2.14.0 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from pygithub->getorg) (2.32.3)\r\n",
"Requirement already satisfied: pyjwt>=2.4.0 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from pyjwt[crypto]>=2.4.0->pygithub->getorg) (2.10.1)\r\n",
"Requirement already satisfied: typing-extensions>=4.0.0 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from pygithub->getorg) (4.12.2)\r\n",
"Requirement already satisfied: urllib3>=1.26.0 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from pygithub->getorg) (2.3.0)\r\n",
"Requirement already satisfied: Deprecated in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from pygithub->getorg) (1.2.18)\r\n",
"Requirement already satisfied: six>=1.7.0 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from retrying->getorg) (1.17.0)\r\n",
"Requirement already satisfied: cryptography>=3.4.0 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from pyjwt[crypto]>=2.4.0->pygithub->getorg) (44.0.1)\r\n",
"Requirement already satisfied: cffi>=1.4.1 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from pynacl>=1.4.0->pygithub->getorg) (1.17.1)\r\n",
"Requirement already satisfied: charset-normalizer<4,>=2 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from requests>=2.14.0->pygithub->getorg) (3.4.1)\r\n",
"Requirement already satisfied: idna<4,>=2.5 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from requests>=2.14.0->pygithub->getorg) (3.10)\r\n",
"Requirement already satisfied: certifi>=2017.4.17 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from requests>=2.14.0->pygithub->getorg) (2025.1.31)\r\n",
"Requirement already satisfied: wrapt<2,>=1.10 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from Deprecated->pygithub->getorg) (1.17.2)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: pycparser in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from cffi>=1.4.1->pynacl>=1.4.0->pygithub->getorg) (2.22)\r\n",
"Downloading python_frontmatter-1.1.0-py3-none-any.whl (9.8 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Installing collected packages: python-frontmatter\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Successfully installed python-frontmatter-1.1.0\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Iywidgets and ipyleaflet support disabled. You must be in a Jupyter notebook to use this feature.\n",
"Error raised:\n",
"No module named 'ipyleaflet'\n",
"Check that you have enabled ipyleaflet in Jupyter with:\n",
" jupyter nbextension enable --py ipyleaflet\n"
]
}
],
"source": [
"# Start by installing the dependencies\n",
"!pip install python-frontmatter getorg --upgrade\n",
"import frontmatter\n",
"import glob\n",
"import getorg\n",
"from geopy import Nominatim\n",
"from geopy.exc import GeocoderTimedOut"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2025-02-26T03:36:07.936149Z",
"iopub.status.busy": "2025-02-26T03:36:07.935901Z",
"iopub.status.idle": "2025-02-26T03:36:07.939314Z",
"shell.execute_reply": "2025-02-26T03:36:07.938765Z"
}
},
"outputs": [],
"source": [
"# Collect the Markdown files\n",
"g = glob.glob(\"_talks/*.md\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true,
"execution": {
"iopub.execute_input": "2025-02-26T03:36:07.941580Z",
"iopub.status.busy": "2025-02-26T03:36:07.941049Z",
"iopub.status.idle": "2025-02-26T03:36:07.966143Z",
"shell.execute_reply": "2025-02-26T03:36:07.965594Z"
}
},
"outputs": [],
"source": [
"# Set the default timeout, in seconds\n",
"TIMEOUT = 5\n",
"\n",
"# Prepare to geolocate\n",
"geocoder = Nominatim(user_agent=\"academicpages.github.io\")\n",
"location_dict = {}\n",
"location = \"\"\n",
"permalink = \"\"\n",
"title = \"\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the event that this times out with an error, double check to make sure that the location is can be properly geolocated."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2025-02-26T03:36:07.968167Z",
"iopub.status.busy": "2025-02-26T03:36:07.967976Z",
"iopub.status.idle": "2025-02-26T03:36:11.603488Z",
"shell.execute_reply": "2025-02-26T03:36:11.602744Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Talk 2 on Relevant Topic in Your Field
London School of Testing; London, UK London, Greater London, England, United Kingdom\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Tutorial 1 on Relevant Topic in Your Field
UC-Berkeley Institute for Testing Science; Berkeley, CA, USA Berkeley, Alameda County, California, United States\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Conference Proceeding talk 3 on Relevant Topic in Your Field
Testing Institute of America 2014 Annual Conference; Los Angeles, CA, USA Los Angeles, Los Angeles County, California, United States\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Talk 1 on Relevant Topic in Your Field
UC San Francisco, Department of Testing; San Francisco, CA, USA San Francisco, California, United States\n"
]
}
],
"source": [
"# Perform geolocation\n",
"for file in g:\n",
" # Read the file\n",
" data = frontmatter.load(file)\n",
" data = data.to_dict()\n",
"\n",
" # Press on if the location is not present\n",
" if 'location' not in data:\n",
" continue\n",
"\n",
" # Prepare the description\n",
" title = data['title'].strip()\n",
" venue = data['venue'].strip()\n",
" location = data['location'].strip()\n",
" description = f\"{title}
{venue}; {location}\"\n",
"\n",
" # Geocode the location and report the status\n",
" try:\n",
" location_dict[description] = geocoder.geocode(location, timeout=TIMEOUT)\n",
" print(description, location_dict[description])\n",
" except ValueError as ex:\n",
" print(f\"Error: geocode failed on input {location} with message {ex}\")\n",
" except GeocoderTimedOut as ex:\n",
" print(f\"Error: geocode timed out on input {location} with message {ex}\")\n",
" except Exception as ex:\n",
" print(f\"An unhandled exception occurred while processing input {location} with message {ex}\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2025-02-26T03:36:11.605607Z",
"iopub.status.busy": "2025-02-26T03:36:11.605411Z",
"iopub.status.idle": "2025-02-26T03:36:11.613528Z",
"shell.execute_reply": "2025-02-26T03:36:11.612932Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"'Written map to talkmap/'"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Save the map\n",
"m = getorg.orgmap.create_map_obj()\n",
"getorg.orgmap.output_html_cluster_map(location_dict, folder_name=\"talkmap\", hashed_usernames=False)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python 3",
"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.9.21"
}
},
"nbformat": 4,
"nbformat_minor": 0
}