Select Git revision
generate_map.py 1.97 KiB
import os
from bokeh.models import ColumnDataSource, WheelZoomTool, HoverTool
from bokeh.plotting import figure, save
import numpy as np
import pandas as pd
import xyzservices.providers as xyz
# Read in data
df = pd.read_csv('data/swift_users.txt', sep=r'\s+')
# Convert latitude & longitde to metcator coordinates
def wgs84_to_web_mercator(lon, lat):
k = 6378137
x = lon * (k * np.pi/180.0)
y = np.log(np.tan((90 + lat) * np.pi/360.0)) * k
return x, y
df["x"], df["y"] = wgs84_to_web_mercator(df["Longitude"], df["Latitude"])
# Set map bounds
min_lon, max_lon = -180, 180
min_lat, max_lat = -56, 70
min_x, min_y = wgs84_to_web_mercator(min_lon, min_lat)
max_x, max_y = wgs84_to_web_mercator(max_lon, max_lat)
# Create map
p = figure(
x_range=(min_x, max_x),
y_range=(min_y, max_y),
x_axis_type="mercator", y_axis_type="mercator",
title=None,
sizing_mode="scale_width",
aspect_ratio=1.9,
)
tile_provider = xyz.CartoDB.Voyager
p.add_tile(tile_provider)
# Plot users
for cat, color in [
('Community', 'blue'),
('Core', 'red'),
]:
source = ColumnDataSource(df[df['Category'] == cat])
p.scatter(x="x", y="y", size=15, fill_color=color, fill_alpha=0.8, source=source, line_color='black', line_width=2, legend_label=cat)
hover = HoverTool(tooltips=[
("Institute", "@Name"),
# ("Description", "@Description"),
])
p.add_tools(hover)
# Activate wheel zoom
for tool in p.tools:
if isinstance(tool, WheelZoomTool):
p.toolbar.active_scroll = tool
break
# Apply bounds to the plot ranges
p.x_range.bounds = (min_x, max_x)
p.y_range.bounds = (min_y, max_y)
# Zoom level limit
p.x_range.min_interval = 10**5.5
p.x_range.max_interval = max_x - min_x
p.y_range.min_interval = 10**5.5
p.y_range.max_interval = max_y - min_y
# Legend
p.legend.location = "top_left"
p.legend.label_text_font_size = "20pt"
# Save
os.makedirs('user_map', exist_ok=True)
save(p, 'user_map/swift_users.html', title='SWIFT Users', resources='inline')