Ruotare la mappa: differenze tra le versioni

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca
(Creata pagina con "=Ruotare la mappa della MapView= E' opportuno ricordare che il Controllo ''MapView'' è formato da un Oggetto "Figlio" ''Panel'', il quale è a sua volta ha un Oggetto "Figlio...")
 
Nessun oggetto della modifica
 
(29 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
=Ruotare la mappa della MapView=
=Ruotare la mappa della MapView=
===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'':
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'':
  <FONT Size=4>MapView</font>
  <FONT Size=4>MapView</font>
Riga 6: Riga 7:
  <FONT Size=3>⬇</font> <FONT Size=1>genitore di una</font>
  <FONT Size=3>⬇</font> <FONT Size=1>genitore di una</font>
  <FONT Size=2>DrawingArea</font>
  <FONT Size=2>DrawingArea</font>
Per ottenere la rotazione della mappa, mostrata dalla ''MapView'', agiremo sul predetto Oggetto ''DrawingArea''.
Per ottenere la rotazione della mappa, mostrata dalla ''MapView'', agiremo sul predetto Oggetto ''DrawingArea'', usando all'interno del ''Risponditore'' dell'Evento "_Draw()" di ''MapView'' le risorse della Classe ''Paint'' ed in particolare i Metodi ".Translate()" e ".Rotate()".


Mostriamo un esempio pratico, nel quale cliccando con il tasto sinistro o con quello centrale del mouse si avvierà la rotazione continua della mappa sino a quando non si cliccherà con il tasto destro del mouse.
===Esempio pratico di rotazione della mappa usando la MapView===
Mostriamo un esempio pratico, nel quale, cliccando con il tasto sinistro o con quello centrale del mouse, si avvierà la rotazione continua della mappa sino a quando non si cliccherà con il tasto destro del mouse.
<BR>Ovviamente è necessario attivare anche il Componente ''gb.map''.
  Private MapView1 As MapView
  Private MapView1 As MapView
  Private DrawingArea1 As DrawingArea
  Private DrawingArea1 As DrawingArea
  Private c As Short
  Private c As Short
   
   
  '''Public''' Sub _new()
  Public Sub _new()
   
   
   Dim mp As New MapPoint(41.89018, 12.49230)
   Dim mp As New MapPoint(41.89018, 12.49230)
Riga 31: Riga 34:
   End With
   End With
   
   
  '''End'''
  End
   
   
  '''Public''' Sub Form_Open()
   
Public Sub Form_Open()
   
   
   Dim pn As Panel
   Dim pn As Panel
Riga 40: Riga 44:
   DrawingArea1 = pn.Children[0]
   DrawingArea1 = pn.Children[0]
   
   
  '''End'''
  End
   
   
  '''Public''' Sub MapView1_Draw()
   
Public Sub MapView1_Draw()
   
   
   With Paint
   With Paint
     .Begin(DrawingArea1)
     .Begin(DrawingArea1)
     .Translate(Me.W / 2, Me.H / 2)
<FONT Color=gray>' ''Imposta il punto di rotazione della mappa al centro del "Form" contenitore della "MapView":''</font>
     .Rotate(Rad(c))
     <FONT Color=#B22222>.Translate</font>(Me.W / 2, Me.H / 2)
     <FONT Color=#B22222>.Rotate</font>(Rad(c))
  <FONT Color=gray>' ''L'uso del Metodo ".Scale()" consente alla mappa durante la sua rotazione di comprire interamente il "Form":''</font>
  <FONT Color=gray>' ''L'uso del Metodo ".Scale()" consente alla mappa durante la sua rotazione di comprire interamente il "Form":''</font>
     .Scale(1.15, 1.15)
     .Scale(1.13, 1.13)
     With MapView1.Map
     With MapView1.Map
       .Width = Paint.W
       .Width = Paint.W
       .Height = Paint.H
       .Height = Paint.H
<FONT Color=gray>' ''Compie gli aggiustamenti, affinché il punto di rotazione sia il centro della mappa mostrata:''</font>
       Paint.Translate(-(.Width / 2), -(.Height / 2))
       Paint.Translate(-(.Width / 2), -(.Height / 2))
       .Draw()
       .Draw()
Riga 59: Riga 66:
   End With
   End With
   
   
  Me.Refresh()
End
   
   
'''End'''
   
   
  '''Public''' Sub MapView1_Mouseup()
  Public Sub MapView1_Mouseup()
   
   
   While (Not Mouse.Right)
   While Not Mouse.Right And Object.IsValid(MapView1)
    MapView1.Refresh
<FONT Color=gray>' ''Imposta di quanti gradi ruoterà ogni volta la mappa mostrata:''</font>
     c += 10
     c += 10
     If c == 360 Then c = 0
     If c == 360 Then c = 0
     Wait 0.5
     Wait 0.5
    If Not Object.IsValid(MapView1) Then Break
    MapView1.Refresh
   Wend
   Wend
   
   
  '''End'''
  End




=Ruotare la mappa usando una DrawingArea=
=Ruotare la mappa usando una DrawingArea=
In questo caso useremo soltanto una ''DrawingArea'' <SUP>&#091;[[#Note|nota 1]]&#093;</sup> per mostrare la mappa e agiremo all'interno del suo Evento "_Draw()" per ruotare la mappa:
In questo caso useremo soltanto una ''DrawingArea'' <SUP>&#091;[[#Note|nota 1]]&#093;</sup>, per mostrare la mappa, servendoci del suo Evento "_Draw()" per ruotarla.
<BR>Ovviamente è necessario attivare anche il Componente ''gb.map''. <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
<BR>Per far apparire la mappa e farla ruotare si dovrà cliccare sulla superficie del programma.
  Private DrawingArea1 As DrawingArea
  Private DrawingArea1 As DrawingArea
  Private mappa As Map
  Private mappa As Map
Riga 87: Riga 95:
  Private cpx As New Point
  Private cpx As New Point
   
   
  '''Public''' Sub _new()
  Public Sub _new()
   
   
   With mappa = New Map
   With mappa = New Map
     .AddTile("GoogleMaps", "https&#058;//khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "908"]).SubDomains = ["0", "1", "2"]
     .AddTile("GoogleMaps", "https&#058;//khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "999"]).SubDomains = ["0", "1", "2"]
     .Center = mp
     .Center = mp
     .Zoom = 15
     .Zoom = 15
Riga 106: Riga 114:
   End With
   End With
   
   
  '''End'''  
  End
Public Sub Form_Arrange()
  Dim b As Byte
<FONT Color=gray>' ''Il ciclo consente di far mostrare la mappa sulla "DrawingArea" alla prima apertura del "Form":''</font>
  Repeat
    DrawingArea1.Refresh
    Wait 0.01
    Inc b
  Until b == 40
End
   
   
  '''Public''' Sub DrawingArea1_Mouseup()
  Public Sub DrawingArea1_Mouseup()
   
   
   While (Not Mouse.Right) And Object.IsValid(DrawingArea1)
   While (Not Mouse.Right) And Object.IsValid(DrawingArea1)
<FONT Color=gray>' ''Imposta di quanti gradi ruoterà ogni volta la mappa mostrata:''</font>
     c += 10
     c += 10
     If c == 360 Then c = 0
     If c == 360 Then c = 0
Riga 117: Riga 141:
   Wend
   Wend
   
   
  '''End'''
  End
   
   
  '''Public''' Sub DrawingArea1_Draw()
   
Public Sub DrawingArea1_Draw()
   
   
   With Paint
   With Paint
     .Translate(Me.W / 2, Me.H / 2)
<FONT Color=gray>' ''Imposta il punto di rotazione della mappa al centro del "Form" contenitore della "DrawingARea":''</font>
     <FONT Color=#B22222>.Translate</font>(Me.W / 2, Me.H / 2)
     .Rotate(Rad(c))
     .Rotate(Rad(c))
     With mappa
     With mappa
Riga 128: Riga 154:
       .Width = Paint.W
       .Width = Paint.W
       .Height = Paint.H
       .Height = Paint.H
       Paint.Translate(-(.Width / 2), -(.Height / 2))
<FONT Color=gray>' ''Compie gli aggiustamenti, affinché il punto di rotazione sia il centro della mappa mostrata:''</font>
       Paint<FONT Color=#B22222>.Translate</font>(-(.Width / 2), -(.Height / 2))
       .Draw()
       .Draw()
     End With
     End With
     .End
     .End
   End With
   End With
 
End
   
   
  Me.Refresh()
   
   
  '''End'''
  <FONT Color=gray><S>Public Sub DrawingArea1_MouseDown()   
'''Public''' Sub DrawingArea1_MouseDown()   
   
   
   pt = Point(Mouse.X, Mouse.Y)
   pt = Point(Mouse.X, Mouse.Y)
Riga 150: Riga 176:
   cpx = Geo.MapPointToPixel(mappa.Center, mappa.Zoom)
   cpx = Geo.MapPointToPixel(mappa.Center, mappa.Zoom)
   
   
  '''End'''
  End</s></font>
   
   
  '''Public''' Sub DrawingArea1_MouseMove()   
   
Public Sub DrawingArea1_MouseMove()   
   
   
   Dim pix As New Point(cpx.X, cpx.Y)
   Dim pix As New Point(cpx.X, cpx.Y)
Riga 162: Riga 189:
   mappa.Center.Lat = Geo.PixelToMapPoint(pix, mappa.Zoom).Lat
   mappa.Center.Lat = Geo.PixelToMapPoint(pix, mappa.Zoom).Lat
   mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon
   mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon
 
'''End'''
   
   
  '''Public''' Sub DrawingArea1_MouseWheel()
  End
Public Sub DrawingArea1_MouseWheel()
   
   
  <FONT Color=gray>' ''Impedisce che si vada oltre il massimo livello di zoom della mappa:''</font>
  <FONT Color=gray>' ''Impedisce che si vada oltre il massimo livello di zoom della mappa:''</font>
Riga 179: Riga 207:
   Me.Text = "Zoom: " & CStr(mappa.Zoom)
   Me.Text = "Zoom: " & CStr(mappa.Zoom)
   
   
  '''End'''
  End






=Note=
=Note=
[1] Vedere al riguardo la seguente pagina: [[Utilizzare una DrawingArea o una ImageView con gb.map anziché una MapView]]


[1] Vedere al riguardo la seguente pagina: [[Utilizzare una DrawingArea o una ImageView con gb.map anziché una MapView]]
[2] Qualora la mappa non appaia, verificare la versione GoogleMap, ed eventualmente modificarla in questo punto del codice: ["version": "999"].

Versione attuale delle 00:59, 27 lug 2025

Ruotare la mappa della MapView

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

Per ottenere la rotazione della mappa, mostrata dalla MapView, agiremo sul predetto Oggetto DrawingArea, usando all'interno del Risponditore dell'Evento "_Draw()" di MapView le risorse della Classe Paint ed in particolare i Metodi ".Translate()" e ".Rotate()".

Esempio pratico di rotazione della mappa usando la MapView

Mostriamo un esempio pratico, nel quale, cliccando con il tasto sinistro o con quello centrale del mouse, si avvierà la rotazione continua della mappa sino a quando non si cliccherà con il tasto destro del mouse.
Ovviamente è necessario attivare anche il Componente gb.map.

Private MapView1 As MapView
Private DrawingArea1 As DrawingArea
Private c As Short

Public Sub _new()

 Dim mp As New MapPoint(41.89018, 12.49230)

 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
 End With
 With MapView1 = New MapView(Me) As "MapView1"
   .X = 0
   .Y = 0
   .W = Me.W
   .H = Me.H
   .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

End


Public Sub Form_Open()

 Dim pn As Panel

 pn = MapView1.Children[0]
 DrawingArea1 = pn.Children[0]

End


Public Sub MapView1_Draw()

 With Paint
   .Begin(DrawingArea1)
' Imposta il punto di rotazione della mappa al centro del "Form" contenitore della "MapView":
   .Translate(Me.W / 2, Me.H / 2)
   .Rotate(Rad(c))
' L'uso del Metodo ".Scale()" consente alla mappa durante la sua rotazione di comprire interamente il "Form":
   .Scale(1.13, 1.13)
   With MapView1.Map
     .Width = Paint.W
     .Height = Paint.H
' Compie gli aggiustamenti, affinché il punto di rotazione sia il centro della mappa mostrata:
     Paint.Translate(-(.Width / 2), -(.Height / 2))
     .Draw()
   End With
   .End
 End With

End


Public Sub MapView1_Mouseup()

 While Not Mouse.Right And Object.IsValid(MapView1)
   MapView1.Refresh
' Imposta di quanti gradi ruoterà ogni volta la mappa mostrata:
   c += 10
   If c == 360 Then c = 0
   Wait 0.5
 Wend

End


Ruotare la mappa usando una DrawingArea

In questo caso useremo soltanto una DrawingArea [nota 1], per mostrare la mappa, servendoci del suo Evento "_Draw()" per ruotarla.
Ovviamente è necessario attivare anche il Componente gb.map. [nota 2]
Per far apparire la mappa e farla ruotare si dovrà cliccare sulla superficie del programma.

Private DrawingArea1 As DrawingArea
Private mappa As Map
Private mp As New MapPoint(41.9, 12.5)
Private c As Short
Private mx As Integer
Private my As Integer
Private pt As New Point
Private cpx As New Point

Public Sub _new()

 With mappa = New Map
   .AddTile("GoogleMaps", "https://khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "999"]).SubDomains = ["0", "1", "2"]
   .Center = mp
   .Zoom = 15
 End With
 With Me  
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Text = "Zoom: " & CStr(mappa.Zoom)
 End With
 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
' Il ridimensionamento della "DrawingArea" come figura di quadrato, avente ciascun lato uguale alla diagonale del "Form", consente alla mappa durante la sua rotazione di comprire interamente il "Form":
   .W = Sqr((Me.W ^ 2) + (Me.H ^ 2))
   .H = .W
   .Background = Color.Yellow
 End With

End


Public Sub Form_Arrange()

 Dim b As Byte

' Il ciclo consente di far mostrare la mappa sulla "DrawingArea" alla prima apertura del "Form":
 Repeat
   DrawingArea1.Refresh
   Wait 0.01
   Inc b
 Until b == 40

End


Public Sub DrawingArea1_Mouseup()

 While (Not Mouse.Right) And Object.IsValid(DrawingArea1)
' Imposta di quanti gradi ruoterà ogni volta la mappa mostrata:
   c += 10
   If c == 360 Then c = 0
   DrawingArea1.Refresh
   Wait 0.5
 Wend

End


Public Sub DrawingArea1_Draw()

 With Paint
' Imposta il punto di rotazione della mappa al centro del "Form" contenitore della "DrawingARea":
   .Translate(Me.W / 2, Me.H / 2)
   .Rotate(Rad(c))
   With mappa
     .Center = mp
     .Width = Paint.W
     .Height = Paint.H
' Compie gli aggiustamenti, affinché il punto di rotazione sia il centro della mappa mostrata:
     Paint.Translate(-(.Width / 2), -(.Height / 2))
     .Draw()
   End With
   .End
 End With
 
End


Public Sub DrawingArea1_MouseDown()  

 pt = Point(Mouse.X, Mouse.Y)

 Me.Text = "Lat. " & Format(mappa.PixelToMapPointRel(pt).Lat, "0.000000") & 
           "   Lon. " & Format(mappa.PixelToMapPointRel(pt).Lon, "0.000000") &
           "  -  Zoom: " & CStr(mappa.Zoom)

 mx = pt.X  
 my = pt.Y
 cpx = Geo.MapPointToPixel(mappa.Center, mappa.Zoom)

End


Public Sub DrawingArea1_MouseMove()  

 Dim pix As New Point(cpx.X, cpx.Y)

 pix.X += mx - Mouse.X
 pix.Y += my - Mouse.Y

' Le seguenti righe di comando consentono uno spostamento morbido e uniforme della mappa per ciascun livello di zoom:
 mappa.Center.Lat = Geo.PixelToMapPoint(pix, mappa.Zoom).Lat
 mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon

End


Public Sub DrawingArea1_MouseWheel()

' Impedisce che si vada oltre il massimo livello di zoom della mappa:
 If mappa.Zoom + Mouse.Delta > mappa.MaxZoom Then Return 

' Pone al centro della mappa il punto ove si è ruotata la rotellina:
 pt = Point(Mouse.X, Mouse.Y)
 mp.Lat = mappa.PixelToMapPointRel(pt).Lat
 mp.Lon = mappa.PixelToMapPointRel(pt).Lon

' Valuta il verso della rotazione della rotellina e modifica lo zoom della mappa:
 mappa.Zoom += Mouse.Delta
 Me.Text = "Zoom: " & CStr(mappa.Zoom)

End


Note

[1] Vedere al riguardo la seguente pagina: Utilizzare una DrawingArea o una ImageView con gb.map anziché una MapView

[2] Qualora la mappa non appaia, verificare la versione GoogleMap, ed eventualmente modificarla in questo punto del codice: ["version": "999"].