The reason developed this module is that I want to update my geocaching profile with a colourful map. You can get a so-called pocket query of all the caches you have found. A pocket query results in a GPX-file.
Since a GPX-file is a XML-file, the data can be extracted with ElementTree:
import xml.etree.ElementTree as ET
# Set the location of the pocket-query file
pocket_query = '../data/pocket-query.gpx'
# Initialize a dict of countries
countries = {}
tree = ET.parse(pocket_query)
# Each wpt contains one country tag, loop over all the country tags
for country in tree.findall(".//{http://www.groundspeak.com/cache/1/0/1}country"):
# get the name of the country
# and increase the value of that country in the dict
countries[country.text] = countries.get(country.text, 0) + 1
max_value = countries[max(countries, key=countries.get)]
Define a function to generate a nice range of colours.
def color_from_value(val, max):
c = math.log(val) / math.log(max_value)
h = (1-c) * 120
# the paint property can also be hsl (hue, saturation, lightness)
return 'hsl(%d, %d%%, %d%%)' % (
h,
100,
37.5+12.5*math.cos(math.radians(h))
)
Use the data int the countries
dict
to generate a set of coloured layers
and use that in a style.
from mapboxutil import *
# define the name and id of the tileset
tileset_id = 'yourusername.t1ls3tid'
source_name = 'ne_10m_admin_0_countries-uniqid'
# Initialise the layer array with a grey landmass
layers = [
make_layer(source_name, make_paint('#CCC', '#CCC')),
]
# For each country append the coloured layer to the array
for (name, value) in countries.items():
layers.append(
make_layer(
source_name,
make_paint(
color_from_value(value, max_value),
'#CCC',
),
make_filter(name, 'NAME'),
)
)
# Make the style
style = make_style(
stylename,
add_sources([tileset_id]),
layers
Use the style to create a map:
# Set the keys in the global module variables
set_mapbox_token(
public_key = 'pk.aRandomString0f5ixtySevenUpperAndL0werCaseCharactersAndNumb3rsPo1nt.andThenYet1other22M0re',
secret_key = 'sk.aDiff3rentStr1ngWithRand0mUpperCaseAndLowerCaseCharactersAndNumbers.0fC0urseThese1sAreFak3',
)
# Check if there is already a style with the name
style_id = get_style_id_by_name(stylename, username=username)
if style_id:
# Update if the style already exists
style = update_style(username, style_id, style)
else:
# Create the style if it's not
style = create_style(username, style)
# Determine the url
url = mapbox_url(
username = username,
style = style['id'],
latitude = 20,
longitude = 10,
width = 640,
height = 560,
)
# Print the url
print(url)
This gives (for me) the following image: