Ruotare la mappa: differenze tra le versioni

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
Nessun oggetto della modifica
 
(19 versioni intermedie di uno stesso utente non sono mostrate)
Riga 10: Riga 10:


===Esempio pratico di rotazione della mappa usando la MapView===
===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.
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''.
<BR>Ovviamente è necessario attivare anche il Componente ''gb.map''.
  Private MapView1 As MapView
  Private MapView1 As MapView
Riga 16: Riga 16:
  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 34: 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 43: Riga 44:
   DrawingArea1 = pn.Children[0]
   DrawingArea1 = pn.Children[0]
   
   
  '''End'''
  End
   
   
  '''Public''' Sub MapView1_Draw()
  Public Sub MapView1_Draw()
   
   
   With Paint
   With Paint
Riga 53: Riga 55:
     <FONT Color=#B22222>.Rotate</font>(Rad(c))
     <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
Riga 64: Riga 66:
   End With
   End With
   
   
  '''End'''
  End
   
   
  '''Public''' Sub MapView1_Mouseup()
  Public Sub MapView1_Mouseup()
   
   
   While Not Mouse.Right And Object.IsValid(MapView1)
   While Not Mouse.Right And Object.IsValid(MapView1)
Riga 76: Riga 79:
   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''.
<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 91: 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 110: Riga 114:
   End With
   End With
   
   
  '''End'''
  End
   
   
  '''Public''' Sub Form_Arrange()
   
Public Sub Form_Arrange()
   
   
   Dim b As Byte
   Dim b As Byte
   
   
<FONT Color=gray>' ''Il ciclo consente di far mostrare la mappa sulla "DrawingArea" alla prima apertura del "Form":''</font>
   Repeat
   Repeat
     DrawingArea1.Refresh
     DrawingArea1.Refresh
     Wait 0.01
     Wait 0.01
     Inc b
     Inc b
   Until b == 10
   Until b == 40
   
   
  '''End'''
  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)
Riga 134: Riga 141:
   Wend
   Wend
   
   
  '''End'''
  End
   
   
  '''Public''' Sub DrawingArea1_Draw()
  Public Sub DrawingArea1_Draw()
   
   
   With Paint
   With Paint
Riga 153: Riga 161:
   End With
   End With
    
    
  '''End'''
  End
   
   
  '''Public''' Sub DrawingArea1_MouseDown()   
  <FONT Color=gray><S>Public Sub DrawingArea1_MouseDown()   
   
   
   pt = Point(Mouse.X, Mouse.Y)
   pt = Point(Mouse.X, Mouse.Y)
Riga 167: 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 179: 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 196: 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"].