#!/usr/bin/python3 import os import urllib.request from html.parser import HTMLParser COMMON_PREFIX = "http://viewfinderpanoramas.org/" COMMON_SUFFIX = ".zip" def fetch_new_map(): fetch_to_file(COMMON_PREFIX + "Coverage%20map%20viewfinderpanoramas_org3.htm", "coverage-dem3.html") fetch_to_file(COMMON_PREFIX + "Coverage%20map%20viewfinderpanoramas_org1.htm", "coverage-dem1.html") def fetch_to_file(url, fname): if os.path.exists(fname): return req = urllib.request.urlopen(url) assert req.getcode() == 200, req.read() with open(fname, "w") as f: f.write(req.read().decode("utf-8")) fetch_new_map() class CoverageDEM3MapParser(HTMLParser): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.coords_to_link = {} self.image_scale = 0 @staticmethod def _get_attr(attrs, attrname): return next(val for key, val in attrs if key == attrname) def handle_starttag(self, tag, attrs): if tag == "area": coordattr = self._get_attr(attrs, "coords") coords = tuple(int(c) for c in coordattr.split(", ")) assert len(coords) == 4, "Unexpected tag: %s, %s" % (tag, attrs) link = self._get_attr(attrs, "href") assert link.startswith(COMMON_PREFIX) link = link[len(COMMON_PREFIX):] assert link.endswith(COMMON_SUFFIX) link = link[:-len(COMMON_SUFFIX)] self.coords_to_link[coords] = link if tag == "img": width = int(self._get_attr(attrs, "width")) height = int(self._get_attr(attrs, "height")) assert width == 2 * height self.image_scale = width / 360 def populate_links(fname, lats_to_link): parser = CoverageDEM3MapParser() with open(fname) as f: parser.feed(f.read()) scale = parser.image_scale for coords in parser.coords_to_link: xmin, ymin, xmax, ymax = coords for x in range(int(xmin / scale), int(xmax / scale)): for y in range(int(ymin / scale) + 1, int(ymax / scale) + 1): lats_to_link[90 - y, x - 180] = parser.coords_to_link[coords] def self_test_dem3(lats_to_link): lat = 44 while lat <= 47: lng = 0 while lng <= 5: assert "L31" in lats_to_link[lat, lng] lng += 1 lat += 1 def self_test_dem1(lats_to_link): assert "TATRA" in lats_to_link[49, 19] for lat, lng in lats_to_link: assert -90 <= lat <= 89 assert -180 <= lng <= 179, lng def write_db(dest, lats_to_link): with open(dest, "w") as f: for lat in range(-90, 90): for lng in range(-180, 180): if (lat, lng) in lats_to_link: print("%d %d %s" % (lat, lng, lats_to_link.get((lat, lng))), file=f) lats_to_link = {} populate_links("coverage-dem3.html", lats_to_link) self_test_dem3(lats_to_link) populate_links("coverage-dem1.html", lats_to_link) self_test_dem1(lats_to_link) write_db("tiles.dat", lats_to_link)