JAPOŃSKA MAPA TOPOGRAFICZNA NA ŚCIANĘ W 10 MINUT

JAPOŃSKA MAPA TOPOGRAFICZNA NA ŚCIANĘ W 10 MINUT

Kiedyś obiecałem sobie, że nie zawiśnie na ścianie w moim mieszkaniu żadna mapa. No bo wiecie, ileż można, poza tym przynoszenie pracy do domu jest niezdrowe. Przysłowie japońskich górali mówi: nigdy nie mów nigdy, więc stało się, przygotowałem sobie plik z pewną mapą topograficzną do wydruku.

Trafiłem ostatnio na ten artykuł. Jeśli wybieracie się do Japonii na treking czy inne wycieczki, to tam jest opisane jak w telefonie włączyć sobie japońską mapę topograficzną. Mapa jest udostępniana przez Geospatial Information Authority of Japan (GSI) czyli taki ichniejszy GUGiK. Uwaga, uwaga, jest dostępna całkowicie za darmo! Uwierzycie? Chyba będę jak Katon Starszy, każdy wpis będę kończył słowami „Poza tym uważam, że polską geodezję należy zaorać” 😉

Koniec podśmiechujek, wracamy do tematu. Mapę GSI można zobaczyć po adresem: https://maps.gsi.go.jp. Jest ona ogólnie dostępna, można ją sobie pobrać np. w formacie A3 albo wydrukować w lokalnej placówce pocztowej. Instrukcja jak przebrnąć przez krzaczki, gdzie co kliknąć żeby dojść do wydruku, znajduje się w zalinkowanym na początku artykule. Ponieważ mapa wygląda całkiem przyjemnie i nie ma na niej ani jednej łacińskiej litery postanowiłem sobie ją wydrukować i powiesić na ścianie. No ale wydruk dostępny przez stronę jest tylko w formacie A3, a to trochę mało jak na fancy japońską mapę. Robienie zrzutów ekranowych i ręczne klejenie jest słabym pomysłem. Ponieważ jest udostępniana w postaci kafelków XYZ można pobrać jej dowolny fragment i skleić w jeden plik graficzny. Oto jak to zrobić.

Na początek musimy się dowiedzieć jak zorganizowane są kafle takiej mapy. Po zajrzeniu w konsolę przeglądarki widać, że taki kafelek

ma taki adres: https://maps.gsi.go.jp/xyz/std/15/29265/12345.png

Ogólnie adres ma taką postać https://maps.gsi.go.jp/xyz/std/zoom/x/y.png Znaczy to, że w folderze ‚zoom’ mamy podfoldery ‚x’ (kolumny), w których znajdują się ‚y’ (wiersze) czyli pliki z kafelkiem. Szczegóły tutaj.

Jesteśmy na dobrej drodze, tylko musimy najpierw nauczyć się tłumaczyć współrzędne (bierzemy np. z paska adresu) na numery kafelków. W powyższym artykule znajdziecie funkcje, które to liczą, wykorzystałem jedną z nich. Taka wiedza w zupełności wystarczy aby pobrać tonę kafli z największego zoomu (najwięcej szczegółów) i wytapetować sobie sypialnie mapą góry Fuji 😉 Istnieje kilka wersji mapy, z cieniowaniem, bez, z angielskimi etykietami itd. Pod tym adresem znajdziecie adresy wersji. Są one w innej domenie ale działają.

Ostatnim krokiem jest sklejenie tego zyliona kafli w jeden plik graficzny i przygotowanie do wydruku. Kafle mają rozmiar 256×256 pikseli, zakładając jakość wydruku na 300 czy 600 dpi i robiąc serię skomplikowanych obliczeń dojdziecie do tego ile kolumn i wierszy powinniście pobrać aby zadrukować np. kartkę A0.

Poniżej skrypt pythona, który realizuje to zadanie.

import math
import os
import shutil
import urllib
import Image

def deg2num(lat_deg, lon_deg, zoom):
  lat_rad = math.radians(lat_deg)
  n = 2.0 ** zoom
  xtile = int((lon_deg + 180.0) / 360.0 * n)
  ytile = int((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) / math.pi) / 2.0 * n)
  return (xtile, ytile)

#zoom
zoom = 16

#bbox
#left lower
lat_min = 34.637163
lon_min = 135.475992
#right upper
lat_max = 34.737163
lon_max = 135.575992

def tile_range(lat_min, lon_min, lat_max, lon_max, zoom):
    x_min, y_max = deg2num(lat_min,lon_min,zoom)
    x_max, y_min = deg2num(lat_max,lon_max,zoom)
    return (x_min, x_max, y_min, y_max, zoom)

x_min, x_max, y_min, y_max, zoom = tile_range(lat_min, lon_min, lat_max, lon_max, zoom)

#folders structure & download
dir_path = os.path.dirname(os.path.realpath(__file__))
#print(dir_path)
shutil.rmtree(str(zoom), ignore_errors=True)
os.makedirs(str(zoom))
os.chdir(str(zoom))
zoom_dir = os.path.join(dir_path,str(zoom))
#print(zoom_dir)

#image creation
img_size_x = (x_max - x_min)*256 #tile size is 256
img_size_y = (y_max - y_min)*256 
#print (img_size_x, img_size_y)

new_img = Image.new('RGB', (img_size_x,img_size_y))
i = 0
j = 0

for x in range(x_min,x_max):
    print(x)
    os.makedirs(str(x))
    os.chdir(str(x))
    s_url = 'https://maps.gsi.go.jp/xyz/std/' + str(zoom) + '/' +str(x) + '/'
    for y in range(y_min, y_max):
        print(i,j)
        t_url = s_url + str(y) + '.png'
        fname = str(y) + '.png'
        print(t_url, fname)
        urllib.urlretrieve(t_url, fname)
        img = Image.open(fname)
        new_img.paste(img, (i,j))
        j += 256
    os.chdir(zoom_dir)
    i += 256
    j = 0
new_img.save("out.png")

W skrypcie należy ustawić zmienne zoom i współrzędne bboxa. Na wyjściu dostajemy plik out.png, który znajduje się w folderze zoomu. Teraz pozostaje ładnie opracować ramkę w programie graficznym i gotowe. Kafle nie pobierają się szybko więc zacznijcie od jakiegoś malutkiego fragmentu np. 5×5 kafli. Poza tym serwery same się nie utrzymają, korzystajcie rozważnie 😉

 

Related Posts