In [4]:
using GMT, RemoteS

# Tell GMT to display the images in VSCode
ENV["DISPLAY_IN_VSC"] = "a";

Definições:

  • Um tile é sempre uma imagem com 256 x 256 pixeis
  • Cada tile tem dois nomes únicos. Um baseado num esquema que se chama uma àrvore de quadrados e constituido apenas pelos algarismos 0,1,2 e 3. O número total de algarismos do nome indica o seu nível de zoom. No outro esquema, chamado XYZ, o nome é construido a partir do número da linha e da coluna de uma certa matriz (mais abixo veremos exemplos).
  • A área coberta por um tile depende do seu nível de zoom. Por exemplo, ao nível 21, um tile cobre um rectângulo com o lado vertical com ~15 m.
  • gratícula, ou se quisermos, malha, são as linhas horizontais e verticais (a vermelho nas imagens seguintes) que delimitam cada tile.
  • Uma imagem devolvida pela função mosaic é constituida por um ou uma junção de vários tiles colados lado-a-lado.

Uma imagem com um zoom de nível 14 cobre uma área rectangular com perto de 2 km de lado N-S. Vejamos um exemplo da zona das Gambelas.

In [5]:
I14 = mosaic(-7.966902, 37.042682, provider=:goog, zoom=14);
In [6]:
viz(I14)
No description has been provided for this image

Esta imagem tem uma resolução muito baixa e apenas servirá para nos guiar. Um aspecto muito interessante destas imagens (imagens dos TileMapServers) é que cada tile tem dois nomes únicos que podemos ver nos atributos se usarmos a opção mesh=true

In [7]:
D14 = mosaic(-7.966902, 37.042682, zoom=14, mesh=true)
Comment:	["Zoom level = 15"]
Attribute table
┌────────────────┬──────────────┐
│       quadtree │          XYZ │
├────────────────┼──────────────┤
│ 03311032210321 │ 7829,6374,14 │
└────────────────┴──────────────┘
BoundingBox: [-7.97607421875, -7.9541015625, 37.03763967977139, 37.05517710666082]
PROJ: +proj=longlat +datum=WGS84 +units=m +no_defs
Header:	 -W

5×2 GMTdataset{Float64, 2}
 Row │      Lon      Lat 
─────┼───────────────────
   1 │ -7.97607  37.0376
   2 │ -7.97607  37.0552
   3 │ -7.9541   37.0552
   4 │ -7.9541   37.0376
   5 │ -7.97607  37.0376

Os nomes deste tile são "03311032210321" e "7829,6374,14" que em si têm codificado as coordenadas da imagen. No que se segue, vamos usar a codificação XYZ. O 14 no nome representa o nível de zoom (o X e o Y são as linhas e colunas de uma certa matriz).

Podemos então usar estes nomes para pedir mais imagens (ou mais gratículas) à função mosaic. Vamos começar por pedir as gratículas do nível 15 e sobrepô-las à imagem I14.

In [8]:
D15 = mosaic("7829,6374,14", zoom=1, mesh=true)
Vector{GMTdataset{Float64, 2}} with 6 segments
Showing first segment. To see other segments just type its element number. e.g. D[2]

Comment:	["Zoom level = 16"]
Attribute table
┌─────┬─────────────────┬────────────────┐
│ Row │ quadtree        │ XYZ            │
├─────┼─────────────────┼────────────────┤
│   1 │ 033110322103210 │ 15658,12748,15 │
│   2 │ 033110322103212 │ 15658,12749,15 │
│   3 │ 033110322103230 │ 15658,12750,15 │
│   4 │ 033110322103211 │ 15659,12748,15 │
│   5 │ 033110322103213 │ 15659,12749,15 │
│   6 │ 033110322103231 │ 15659,12750,15 │
└─────┴─────────────────┴────────────────┘
BoundingBox: [-7.97607421875, -7.965087890625, 37.046408899699564, 37.05517710666082]
Global BoundingBox: [-7.97607421875, -7.9541015625, 37.02886944696474, 37.05517710666082]
PROJ: +proj=longlat +datum=WGS84 +units=m +no_defs
Header:	 -W

5×2 GMTdataset{Float64, 2}
 Row │      Lon      Lat 
─────┼───────────────────
   1 │ -7.97607  37.0464
   2 │ -7.97607  37.0552
   3 │ -7.96509  37.0552
   4 │ -7.96509  37.0464
   5 │ -7.97607  37.0464

Podemos ver que agora temos 4 quadrados pois aumentar um nível de zoom divide a área por dois e como pedimos os mesmos limites temos 4 vezes mais quadrados. Notem bem a novidade the agora termos usado "7829,6374,14", zoom=1. Ou seja, como delimitador da região usámos o nome to tile I14, e como zoom usámos 1, que significa adicionar 1 ao nível determinado pelo uso do nome 7829,6374,14.

Vejamos o que se obtem sobrepondo a gratícula e a image I14. E vamos usar mais uma novidade que é a de dizer que queremos os nomes dos tiles impressos na figura.

In [9]:
viz(I14, plot=(data=D15, lc=:red, lw=0.5, labels="attrib=XYZ"))
No description has been provided for this image

E agora podemos aplicar este princípio para obter uma imagem exactamente da mesma zona mas com un nível de zoom superior. Por exemplo para obter uma imagem de nível 15, fazemos:

In [11]:
I15 = mosaic("7829,6374,14", provider=:google, zoom=1);
viz(I15, plot=(data=D15, lc=:red, lw=0.5, labels="attrib=XYZ"))
No description has been provided for this image

Estão a ver que para chegarmos ao nível 19 é só continuar o processo, mas com cuidado porque a cada nível a mais quadruplicamos o número de tiles. Como exemplo vamos ver o que dá a gratícula do nível 17 sobreposta na imagem I15

In [12]:
D17 = mosaic("7829,6374,14", zoom=3, mesh=true);
viz(I15, plot=(data=D17, lc=:red, lw=0.5, labels="attrib=XYZ"))
No description has been provided for this image

Ou seja, para se chegar ao nível 19 basta-nos dar o nome de um tile 17 e somar 2 ao zoom. Por exemplo, para obtermos uma imagem semelhante à que usámos nas aulas vamos usar o tile "62634,50997,17" como base.

In [13]:
I17_19 = mosaic("62634,50997,17", zoom=2, provider=:goog);
viz(I17_19)