Autore Topic: Verificare le tessere dei livelli delle "Map tiles"  (Letto 553 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Verificare le tessere dei livelli delle "Map tiles"
« il: 26 Gennaio 2020, 19:07:36 »
Le "Map tiles", che si usano sul web (come Google Maps), sono formate, per ciascun livello di zoom, da molteplici tessere (tiles) che insieme offrono la rappresentazione corrente della mappa.

Il seguente semplice codice consente di vedere ogni singola tessera utilizzata da Google Maps usata nel livello di zoom prescelto.
E' necessario attivare il Componente grafico che rende disponibile la Classe "WebView", come ad esempio gb.qt5.webkit. Quindi non gb.map.
(La tessera di partenza mostra la foce del fiume Tevere ad un livello di zoom = 12).
Per vedere le tessere contigue a quella corrente visibile (quindi per spostarsi sul territorio), è necessario modificare i valori dei parametri x e y delle tiles, variandoli direttamente dagli SpinBox laterali, oppure cliccando sulle parti visibili di colore arancione del Panel, come segue: se si clicca sulla parte sinistra, sarà mostrata la tessera contigua a sinistra della tessera corrente; se si clicca sulla parte superiore, sarà mostrata la tessera contigua al di sopra della tessera corrente; e così via per le restanti due parti del Panel arancione.

Codice: [Seleziona]
Private WebView1 As WebView
Private Panel1 As Panel
Private SpinBox1 As SpinBox
Private SpinBox2 As SpinBox
Private SpinBox3 As SpinBox
Private pn2 As Panel
Private eti As Label
Private zm As Byte


Public Sub Form_Open()

  With Me
    .Center
    .W = 580
    .H = 500
    .X = (Screen.AvailableWidth / 2) - (Me.W / 2)
    .Y = Screen.AvailableHeight * 0.1
  End With
  With Panel1 = New Panel(Me) As "Panel1"
    .X = 100
    .Y = 50
    .W = 350
    .H = 350
    .Background = Color.Orange
  End With
  With eti = New Label(Me)
    .X = Panel1.X
    .Y = Panel1.Y + Panel1.H
    .W = Panel1.W
    .H = 20
    .Alignment = Align.Center
  End With
  With SpinBox1 = New SpinBox(Me) As "SpinBox1"
    .X = Me.W * 0.82
    .Y = Me.H * 0.5
    .W = 80
    .H = 35
    .MaxValue = 10000000
  End With
  With SpinBox2 = New SpinBox(Me) As "SpinBox2"
    .X = Me.W * 0.82
    .Y = Me.H * 0.6
    .W = 80
    .H = 35
    .MaxValue = 10000000
  End With
  With SpinBox3 = New SpinBox(Me) As "SpinBox3"
    .X = Me.W * 0.82
    .Y = Me.H * 0.7
    .W = 80
    .H = 35
    .Value = 12
    .MaxValue = 24
    .MinValue = 1
  End With
 
  With SpinBox1
    .MinValue = 1
    .Value = 2187
  End With
  With SpinBox2
    .MinValue = 1
    .Value = 1524
  End With
 
  zm = SpinBox3.Value

End

Public Sub SpinBox1_Change()

  Ricarica()

End

Public Sub SpinBox2_Change()

  Ricarica()

End

Public Sub SpinBox3_Change()

  If SpinBox3.Value > zm Then
    SpinBox1.Value *= 2
    SpinBox2.Value *= 2
  Endif
  If SpinBox3.Value < zm Then
    SpinBox1.Value \= 2
    SpinBox2.Value \= 2
  Endif
 
  zm = SpinBox3.Value
 
  eti.Text = "Se l'immagine non è visibile, cliccare sul riquadro bianco."
 
  Ricarica()

End

Public Sub Panel1_MouseUp()

  If Mouse.X < WebView1.X Then SpinBox1.Value -= 1
 
  If Mouse.X > (WebView1.X + WebView1.W) Then SpinBox1.Value += 1
 
  If Mouse.Y < WebView1.Y Then SpinBox2.Value -= 1
 
  If Mouse.Y > (WebView1.Y + WebView1.H) Then SpinBox2.Value += 1
  Object.Lock(pn2)
  eti.Text = Null
 
End

Public Sub Panel2_MouseUp()
 
  Ricarica()
 
  Object.Lock(pn2)
  eti.Text = Null
 
End


Private Procedure Ricarica()
 
 If Object.IsValid(WebView1) Then WebView1.Delete
 With WebView1 = New WebView(Panel1) As "WebView1"
    .X = 50
    .Y = 50
    .W = 256
    .H = 256
    .Url = "https://mt1.google.com/vt/lyrs=s&x=" & CStr(SpinBox1.Value) & "&y=" & CStr(SpinBox2.Value) & "&z=" & CStr(SpinBox3.Value)
  End With
  With pn2 = New Panel(Panel1) As "Panel2"
    .X = WebView1.X
    .Y = WebView1.Y
    .W = WebView1.W
    .H = WebView1.H
    .Background = Color.Transparent
  End With
 
End
« Ultima modifica: 27 Gennaio 2020, 15:29:20 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Verificare le tessere dei livelli delle "Map tiles"
« Risposta #1 il: 27 Gennaio 2020, 15:42:19 »
Ora con un semplice codice proviamo a mostrare insieme tre tessere orizzontalmente contigue (è necessario attivare i Componenti gb.net e gb.net.curl):

Codice: [Seleziona]
Public Sub Form_Open()
 
  Dim tp As New HttpClient
  Dim ss As New String[]
  Dim iimm As New Image[]
  Dim img, im As Image
  Dim b As Byte
  Dim PictureBox1 As PictureBox
 
' Scarica tre immagini-tessere:
  ss.Push(tp.Download("https://mt1.google.com/vt/lyrs=s&x=2187&y=1524&z=12"))
  ss.Push(tp.Download("https://mt1.google.com/vt/lyrs=s&x=2188&y=1524&z=12"))
  ss.Push(tp.Download("https://mt1.google.com/vt/lyrs=s&x=2189&y=1524&z=12"))
  tp.Close

 
  im = New Image
  For b = 0 To ss.Max
    iimm.Push(im.FromString(ss[b]))
  Next
 
  img = New Image(iimm[0].W * iimm.Count, iimm[0].H)
 
  With Me
    .Center
    .W = img.W + 50
    .H = img.H + 50
  End With
 
  For b = 0 To ss.Max
    With Paint
      .Begin(img)
      .DrawImage(iimm[b], b * iimm[0].W, 0, iimm[0].W, iimm[0].H)
      .End
    End With
  Next
 
  With PictureBox1 = New PictureBox(Me)
    .X = 20
    .Y = 20
    .W = img.W
    .H = img.H
    .Image = img
  End With

End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »