/
latency_countrymap.py
125 lines (97 loc) · 3.42 KB
/
latency_countrymap.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
from collections import defaultdict
import argparse
import logging
import os
import folium
import geopandas
import pandas
import pkg_resources
from atlas_tools.measurement import ping_measure
from atlas_tools.util import base_parser, atlas_parser, ping_parser, start_logger, check_ping_args
SHAPEFILE_DIR = 'countries'
SHAPEFILE_NAME = 'ne_50m_admin_0_countries.shp'
logger = logging.getLogger(__name__)
def _handle_data(ping_results):
states_array = defaultdict(list)
for (_, _, _, _, region, _, _, rtt) in ping_results:
states_array[region].append(rtt)
states = dict()
for country, rtt_list in states_array.items():
states[country] = min(int(sum(rtt_list) / len(rtt_list)), 120)
return states
def _choose_color(feature, dataframe, linear):
iso = feature['properties']['iso_a2']
if iso in dataframe.index:
return linear(dataframe.at[iso, 'Latency'])
else:
return 'lightgrey'
def _draw_countrymap(cut_countries, fname):
logger.info('Drawing the countrymap')
resource_dir = pkg_resources.resource_filename(__package__, SHAPEFILE_DIR)
resource_fname = os.path.join(resource_dir, SHAPEFILE_NAME)
df_shapefile_countries = geopandas.GeoDataFrame.from_file(resource_fname)
dataframe = pandas.DataFrame(
data=list(cut_countries.items()),
columns=['iso_a2', 'Latency'],
)
dataframe.set_index('iso_a2', inplace=True)
linear = folium.LinearColormap(
['green', 'yellow', 'red'], vmin=0., vmax=120.
).to_step(6)
countrymap = folium.Map(
location=[20, 20],
zoom_start=3, min_zoom=2, max_zoom=8,
tiles='Mapbox Bright'
)
folium.GeoJson(
df_shapefile_countries,
style_function=lambda feature: {
'fillColor': _choose_color(feature, dataframe, linear),
'color': 'black',
'weight': 1,
'fillOpacity': 0.6
},
highlight_function=lambda feature: {
'fillColor': _choose_color(feature, dataframe, linear),
'color': 'black',
'weight': 3,
'fillOpacity': 0.7,
'dashArray': '5, 5'
}
).add_to(countrymap)
countrymap.add_child(linear)
countrymap.save(fname)
def create_countrymap(fname, atlas_key, target, country=None,
probe_limit=None, timeout=None, measurements_list=None):
pings = ping_measure(
atlas_key, target,
country=country,
probe_limit=probe_limit,
timeout=timeout,
measurements_list=measurements_list
)
cut_countries = _handle_data(pings.results)
_draw_countrymap(cut_countries, fname)
def main():
parser = argparse.ArgumentParser(
parents=[base_parser(), atlas_parser(), ping_parser()],
description='create a world map which shows target latencies (RTT) from different countries'
)
parser.add_argument(
'-f', '--filename',
help="output HTML filename (default: 'countrymap_<target>.html')"
)
args = parser.parse_args()
check_ping_args(parser, args)
if args.filename is None:
args.filename = 'countrymap_%s.html' % args.target
start_logger('atlas_tools', verbose=args.verbose)
create_countrymap(
args.filename, args.key, args.target,
country=args.country,
probe_limit=args.probe_number,
timeout=args.timeout,
measurements_list=args.msms
)
if __name__ == '__main__':
main()