Differenze tra le versioni di "Scalare la dimensione della mappa in una Mapview"

Da Gambas-it.org - Wikipedia.
 
(7 versioni intermedie di uno stesso utente non sono mostrate)
Riga 17: Riga 17:
  
 
Mostriamo un esempio pratico, nel quale cliccando con il tasto destro del mouse si avrà un aumento della dimensione dell'immagine della mappa, cliccando con il tasto centrale, si avrà invece una diminuizione di quella dimensione. Se si mantiene premuto su uno dei due tasti citati, si otterrà un aumento o una diminuizione graduale, ma continua, dell'immagine.
 
Mostriamo un esempio pratico, nel quale cliccando con il tasto destro del mouse si avrà un aumento della dimensione dell'immagine della mappa, cliccando con il tasto centrale, si avrà invece una diminuizione di quella dimensione. Se si mantiene premuto su uno dei due tasti citati, si otterrà un aumento o una diminuizione graduale, ma continua, dell'immagine.
<BR>Il codice è impostato in modo tale che il rapporto scalare non sia inferiore a 0.30 rispetto alle dimensioni normali dello zoom corrente. Va rilevato che una riduzione del rapporto scalare comporta una riduzione della mappa visibile, così da renderla inferiore alla ''DrawingArea''. Per far sì che l'area della mappa visibile compra comunque sempre l'intera ''DrawingArea'', è necessario aumentare la sua dimensione assegnando una valore superiore all'area disegnabile alle Proprietà "Paint.Width" e "paint.Height" nella routine di disegno "MapView1_Draw()". Da precisare che, sebbene un'espansione della dimensione dell'area della mappa visibile consenta rapporti di scala molto inferiori all'unità, ciò comporta un rallentamento progressivo del caricamento delle tessere della mappa e della loro visualizzazione sulla ''DrawingArea''.
+
<BR>Il codice è impostato in modo tale che il rapporto scalare non sia inferiore a 0.70 rispetto alle dimensioni normali dello zoom corrente. Va rilevato che una riduzione del rapporto scalare comporta in alcuni livelli di zoom una riduzione della mappa visibile, così da renderla inferiore alla ''DrawingArea''.
 
  Private MapView1 As MapView
 
  Private MapView1 As MapView
 
  Private DrawingArea1 As DrawingArea
 
  Private DrawingArea1 As DrawingArea
 
  Private s As Single = 1.0
 
  Private s As Single = 1.0
 +
Private z As Byte
 
  Public bo As Boolean
 
  Public bo As Boolean
 
   
 
   
Riga 37: Riga 38:
 
     .Map.Center = mp
 
     .Map.Center = mp
 
   End With
 
   End With
 +
 +
  z = 15
 
   
 
   
 
  '''End'''
 
  '''End'''
Riga 44: Riga 47:
 
   Dim pn As Panel
 
   Dim pn As Panel
 
   
 
   
 +
  Me.Title = "Rapporto scalare: 1.00"
 
   pn = MapView1.Children[0]
 
   pn = MapView1.Children[0]
 
   DrawingArea1 = pn.Children[0]
 
   DrawingArea1 = pn.Children[0]
Riga 56: Riga 60:
 
     <FONT Color=#B22222>.Scale</font>(s, s)
 
     <FONT Color=#B22222>.Scale</font>(s, s)
 
     With MapView1.Map
 
     With MapView1.Map
<FONT Color=gray>' ''Triplica la dimensione della mappa visibile:''</font>
+
       .Width = Paint.W
       .Width = Paint.W * 3
+
       .Height = Paint.H
       .Height = Paint.H * 3
 
 
       Paint.Translate(-(.Width / 2), -(.Height / 2))
 
       Paint.Translate(-(.Width / 2), -(.Height / 2))
 
       .Draw()
 
       .Draw()
Riga 75: Riga 78:
 
     If Mouse.Middle Then  
 
     If Mouse.Middle Then  
 
       s -= 0.01
 
       s -= 0.01
  <FONT Color=gray>' ''Impedisce che si scenda ad un rapporto scalare inferiore a 0,30:''</font>
+
  <FONT Color=gray>' ''Impedisce che si scenda ad un rapporto scalare inferiore a 0,70:''</font>
       If s < 0.3 Then s = 0.3
+
       If s < 0.7 Then s = 0.7
 
     Endif  
 
     Endif  
 
     If Mouse.Right Then s += 0.01
 
     If Mouse.Right Then s += 0.01
 
     MapView1.Refresh
 
     MapView1.Refresh
 
     Wait 0.01
 
     Wait 0.01
 +
    Me.Title = Format(s, "Rapporto scalare: 0.00")
 
   Until bo == True
 
   Until bo == True
 
   
 
   
Riga 88: Riga 92:
 
   
 
   
 
   bo = True
 
   bo = True
 +
 +
<FONT Color=gray>' ''Se si cambia zoom della mappa, viene annullato l'effetto del Metodo "Scale()", riportando la visualizzazione alla normale dimensione del nuovo zoom corrente:''</font>
 +
  If z <> MapView1.Map.Zoom Then
 +
    Me.Title = "Rapporto scalare: 1.00"
 +
    s = 1.0
 +
    z = MapView1.Map.Zoom
 +
    MapView1.Refresh
 +
  Endif
 +
 +
'''End'''
 +
 +
'''Public''' Sub MapView1_MouseWheel()
 +
 +
<FONT Color=gray>' ''Se si cambia zoom della mappa, viene annullato l'effetto del Metodo "Scale()", riportando la visualizzazione alla normale dimensione del nuovo zoom corrente:''</font>
 +
  Me.Title = "Rapporto scalare: 1.00"
 +
  s = 1.0
 +
  z = MapView1.Map.Zoom
 +
  MapView1.Refresh
 
   
 
   
 
  '''End'''
 
  '''End'''
Se modifichiamo, come segue:
 
.Translate(Me.W - 200, 100)
 
la riga presente immediatamente dopo ".Begin(DrawingArea1)", riducendo la dimensione dellimmagine della mappa, si otterrà una sorta di finestra in alto a destra, mostrandosi al di sotto comunque inalterata l'immagine originaria della mappa.
 
<BR>La finestra in alto a destra avrà, sì, una dimensione scalata ridotta, ma nel contempo mostrerà un'area più ampia di quella visibile sottostante inalterata originaria.
 
<BR>Spostando una delle due mappe mostrate, muovendo il puntatore del mouse mentre si tiene cliccato il tasto sinistro, si procurerà lo spostamento anche dell'altra mappa visualizzata.
 

Versione attuale delle 17:13, 31 gen 2022

Premessa

E' opportuno ricordare che il Controllo MapView è formato da un Oggetto "Figlio" Panel, il quale è a sua volta ha un Oggetto "Figlio" che è una DrawingArea:

MapView
 genitore di un
Panel
 genitore di una
DrawingArea

Ingrandire o rimpicciolire l'immagine di una mappa mostrata in una MapView

Per ottenere diverse dimensioni visuali della mappa, si utilizza, come è noto, la Proprietà ".Zoom" della Classe Map del Componente gb.map.
Tale Proprietà mostra le tessere della mappa corrispondenti ad un livello di zoom, ossia create con quello specifico livello di zoom di immagine rappresentata.

Stante impostato un livello di zoom, è possibile agire sull'immagine della mappa mostrata modificandone la dimensione, ingrandendo i rimpicciolendo l'immagine dell'intera mappa (come se si applicasse un ulteriore zoom al livello di zoom corrente, al quale la mappa è mostrata).
Ovviamente la qualità - soprattutto ingrandendo l'immagine - tenderà a perdere definizione.

Per procedere a tale variazione della dimensione dell'immagine della mappa mostrata, si utilizzerà il Metodo ".Scale()" della CLasse Paint, da applicarsi alla DrawingArea, "Figlia" del Controllo Panel a sua volta "Figlio" della MapView.

Mostriamo un esempio pratico, nel quale cliccando con il tasto destro del mouse si avrà un aumento della dimensione dell'immagine della mappa, cliccando con il tasto centrale, si avrà invece una diminuizione di quella dimensione. Se si mantiene premuto su uno dei due tasti citati, si otterrà un aumento o una diminuizione graduale, ma continua, dell'immagine.
Il codice è impostato in modo tale che il rapporto scalare non sia inferiore a 0.70 rispetto alle dimensioni normali dello zoom corrente. Va rilevato che una riduzione del rapporto scalare comporta in alcuni livelli di zoom una riduzione della mappa visibile, così da renderla inferiore alla DrawingArea.

Private MapView1 As MapView
Private DrawingArea1 As DrawingArea
Private s As Single = 1.0
Private z As Byte
Public bo As Boolean

Public Sub _new()

 Dim mp As New MapPoint(41.89018, 12.49230)

 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
 End With
 With MapView1 = New MapView(Me) As "MapView1"
   .Map.AddTile("GoogleMap", "https://mt0.google.com/vt/lyrs=s&hl=&x={x}&y={y}&z={z}")
   .Map.Zoom = 15 
   .Map.Center = mp
 End With

 z = 15

End

Public Sub Form_Open()

 Dim pn As Panel

 Me.Title = "Rapporto scalare: 1.00"
 pn = MapView1.Children[0]
 DrawingArea1 = pn.Children[0]

End

Public Sub MapView1_Draw()

 With Paint
   .Begin(DrawingArea1)
   .Translate(Me.W / 2, Me.H / 2)
   .Scale(s, s)
   With MapView1.Map
     .Width = Paint.W
     .Height = Paint.H
     Paint.Translate(-(.Width / 2), -(.Height / 2))
     .Draw()
   End With
   .End
 End With

 Me.Refresh()

End

Public Sub MapView1_MouseDown()

 bo = False
 Repeat 
   If Mouse.Middle Then 
     s -= 0.01
' Impedisce che si scenda ad un rapporto scalare inferiore a 0,70:
     If s < 0.7 Then s = 0.7
   Endif 
   If Mouse.Right Then s += 0.01
   MapView1.Refresh
   Wait 0.01
   Me.Title = Format(s, "Rapporto scalare: 0.00")
 Until bo == True

End

Public Sub MapView1_MouseUp()

 bo = True

' Se si cambia zoom della mappa, viene annullato l'effetto del Metodo "Scale()", riportando la visualizzazione alla normale dimensione del nuovo zoom corrente:
 If z <> MapView1.Map.Zoom Then 
   Me.Title = "Rapporto scalare: 1.00"
   s = 1.0
   z = MapView1.Map.Zoom
   MapView1.Refresh
 Endif

End

Public Sub MapView1_MouseWheel()

' Se si cambia zoom della mappa, viene annullato l'effetto del Metodo "Scale()", riportando la visualizzazione alla normale dimensione del nuovo zoom corrente:
 Me.Title = "Rapporto scalare: 1.00"
 s = 1.0
 z = MapView1.Map.Zoom
 MapView1.Refresh

End