Added ability to use quad-key sources in mapview

This commit is contained in:
Mark Qvist 2023-10-26 18:54:34 +02:00
parent fe8db4b950
commit 0a2a87775e
2 changed files with 37 additions and 61 deletions

View File

@ -89,6 +89,21 @@ class Downloader:
response.raise_for_status() response.raise_for_status()
return callback, (url, response) return callback, (url, response)
def __to_quad(self, x, y, z):
quad_key = []
i = z
while i > 0:
digit = 0
mask = 1 << (i-1)
if (x & mask) != 0:
digit += 1
if (y & mask) != 0:
digit += 2
quad_key.append(str(digit))
i -= 1
return "".join(quad_key)
def _load_tile(self, tile): def _load_tile(self, tile):
if tile.state == "done": if tile.state == "done":
return return
@ -97,9 +112,16 @@ class Downloader:
# Logger.debug("Downloader: use cache {}".format(cache_fn)) # Logger.debug("Downloader: use cache {}".format(cache_fn))
return tile.set_source, (cache_fn,) return tile.set_source, (cache_fn,)
tile_y = tile.map_source.get_row_count(tile.zoom) - tile.tile_y - 1 tile_y = tile.map_source.get_row_count(tile.zoom) - tile.tile_y - 1
if tile.map_source.quad_key:
uri = tile.map_source.url.format(
q=self.__to_quad(tile.tile_x,tile_y,tile.zoom), s=choice(tile.map_source.subdomains)
)
else:
uri = tile.map_source.url.format( uri = tile.map_source.url.format(
z=tile.zoom, x=tile.tile_x, y=tile_y, s=choice(tile.map_source.subdomains) z=tile.zoom, x=tile.tile_x, y=tile_y, s=choice(tile.map_source.subdomains)
) )
# Logger.debug("Downloader: download(tile) {}".format(uri)) # Logger.debug("Downloader: download(tile) {}".format(uri))
response = requests.get(uri, headers={'User-agent': USER_AGENT}, timeout=5) response = requests.get(uri, headers={'User-agent': USER_AGENT}, timeout=5)
try: try:

View File

@ -23,7 +23,7 @@ class MapSource:
""" """
attribution_osm = 'Maps & Data © [i][ref=http://www.osm.org/copyright]OpenStreetMap contributors[/ref][/i]' attribution_osm = 'Maps & Data © [i][ref=http://www.osm.org/copyright]OpenStreetMap contributors[/ref][/i]'
attribution_thunderforest = 'Maps © [i][ref=http://www.thunderforest.com]Thunderforest[/ref][/i], Data © [i][ref=http://www.osm.org/copyright]OpenStreetMap contributors[/ref][/i]' attribution_ve = 'Maps © [i][ref=http://www.virtualearth.net]VirtualEarth[/ref][/i]'
# list of available providers # list of available providers
# cache_key: (is_overlay, minzoom, maxzoom, url, attribution) # cache_key: (is_overlay, minzoom, maxzoom, url, attribution)
@ -35,6 +35,13 @@ class MapSource:
"http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
attribution_osm, attribution_osm,
), ),
"ve": (
0,
0,
19,
"http://ecn.t3.tiles.virtualearth.net/tiles/a{q}.jpeg?g=1",
attribution_ve,
),
"osm-hot": ( "osm-hot": (
0, 0,
0, 0,
@ -42,63 +49,6 @@ class MapSource:
"http://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png", "http://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png",
"", "",
), ),
"osm-de": (
0,
0,
18,
"http://{s}.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png",
"Tiles @ OSM DE",
),
"osm-fr": (
0,
0,
20,
"http://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png",
"Tiles @ OSM France",
),
"cyclemap": (
0,
0,
17,
"http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png",
"Tiles @ Andy Allan",
),
"thunderforest-cycle": (
0,
0,
19,
"http://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png",
attribution_thunderforest,
),
"thunderforest-transport": (
0,
0,
19,
"http://{s}.tile.thunderforest.com/transport/{z}/{x}/{y}.png",
attribution_thunderforest,
),
"thunderforest-landscape": (
0,
0,
19,
"http://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png",
attribution_thunderforest,
),
"thunderforest-outdoors": (
0,
0,
19,
"http://{s}.tile.thunderforest.com/outdoors/{z}/{x}/{y}.png",
attribution_thunderforest,
),
# no longer available
# "mapquest-osm": (0, 0, 19, "http://otile{s}.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.jpeg", "Tiles Courtesy of Mapquest", {"subdomains": "1234", "image_ext": "jpeg"}),
# "mapquest-aerial": (0, 0, 19, "http://oatile{s}.mqcdn.com/tiles/1.0.0/sat/{z}/{x}/{y}.jpeg", "Tiles Courtesy of Mapquest", {"subdomains": "1234", "image_ext": "jpeg"}),
# more to add with
# https://github.com/leaflet-extras/leaflet-providers/blob/master/leaflet-providers.js
# not working ?
# "openseamap": (0, 0, 19, "http://tiles.openseamap.org/seamark/{z}/{x}/{y}.png",
# "Map data @ OpenSeaMap contributors"),
} }
def __init__( def __init__(
@ -111,6 +61,7 @@ class MapSource:
image_ext="png", image_ext="png",
attribution="© OpenStreetMap contributors", attribution="© OpenStreetMap contributors",
subdomains="abc", subdomains="abc",
quad_key = False,
**kwargs **kwargs
): ):
if cache_key is None: if cache_key is None:
@ -124,6 +75,7 @@ class MapSource:
self.image_ext = image_ext self.image_ext = image_ext
self.attribution = attribution self.attribution = attribution
self.subdomains = subdomains self.subdomains = subdomains
self.quad_key = quad_key
self.cache_fmt = "{cache_key}_{zoom}_{tile_x}_{tile_y}.{image_ext}" self.cache_fmt = "{cache_key}_{zoom}_{tile_x}_{tile_y}.{image_ext}"
self.dp_tile_size = min(dp(self.tile_size), self.tile_size * 2) self.dp_tile_size = min(dp(self.tile_size), self.tile_size * 2)
self.default_lat = self.default_lon = self.default_zoom = None self.default_lat = self.default_lon = self.default_zoom = None
@ -132,6 +84,7 @@ class MapSource:
@staticmethod @staticmethod
def from_provider(key, **kwargs): def from_provider(key, **kwargs):
quad_key = kwargs.get('quad_key', False)
provider = MapSource.providers[key] provider = MapSource.providers[key]
cache_dir = kwargs.get('cache_dir', CACHE_DIR) cache_dir = kwargs.get('cache_dir', CACHE_DIR)
options = {} options = {}
@ -145,6 +98,7 @@ class MapSource:
url=url, url=url,
cache_dir=cache_dir, cache_dir=cache_dir,
attribution=attribution, attribution=attribution,
quad_key=quad_key,
**options **options
) )