Differenze tra le versioni di "Ruotare la mappa"
(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() | |
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 | |
− | + | ||
+ | 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 | |
− | + | ||
+ | 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. | + | .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 | |
− | + | ||
+ | Public Sub MapView1_Mouseup() | ||
While Not Mouse.Right And Object.IsValid(MapView1) | While Not Mouse.Right And Object.IsValid(MapView1) | ||
+ | MapView1.Refresh | ||
<FONT Color=gray>' ''Imposta di quanti gradi ruoterà ogni volta la mappa mostrata:''</font> | <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 | ||
− | |||
Wend | Wend | ||
− | + | End | |
=Ruotare la mappa usando una DrawingArea= | =Ruotare la mappa usando una DrawingArea= | ||
− | In questo caso useremo soltanto una ''DrawingArea'' <SUP>[[[#Note|nota 1]]]</sup> per mostrare la mappa | + | In questo caso useremo soltanto una ''DrawingArea'' <SUP>[[[#Note|nota 1]]]</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>[[[#Note|nota 2]]]</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() | |
With mappa = New Map | 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": " | + | .AddTile("GoogleMaps", "https://khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "991"]).SubDomains = ["0", "1", "2"] |
.Center = mp | .Center = mp | ||
.Zoom = 15 | .Zoom = 15 | ||
Riga 110: | Riga 114: | ||
End With | End With | ||
− | ''' | + | 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() | |
While (Not Mouse.Right) And Object.IsValid(DrawingArea1) | While (Not Mouse.Right) And Object.IsValid(DrawingArea1) | ||
Riga 122: | Riga 141: | ||
Wend | Wend | ||
− | + | End | |
− | + | ||
+ | Public Sub DrawingArea1_Draw() | ||
With Paint | With Paint | ||
Riga 140: | Riga 160: | ||
.End | .End | ||
End With | End With | ||
+ | |||
+ | End | ||
− | |||
− | + | <FONT Color=gray><S>Public Sub DrawingArea1_MouseDown() | |
− | |||
− | |||
pt = Point(Mouse.X, Mouse.Y) | pt = Point(Mouse.X, Mouse.Y) | ||
Riga 157: | Riga 176: | ||
cpx = Geo.MapPointToPixel(mappa.Center, mappa.Zoom) | cpx = Geo.MapPointToPixel(mappa.Center, mappa.Zoom) | ||
− | + | End</s></font> | |
+ | |||
− | + | Public Sub DrawingArea1_MouseMove() | |
Dim pix As New Point(cpx.X, cpx.Y) | Dim pix As New Point(cpx.X, cpx.Y) | ||
Riga 169: | 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() | ||
<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 186: | Riga 207: | ||
Me.Text = "Zoom: " & CStr(mappa.Zoom) | Me.Text = "Zoom: " & CStr(mappa.Zoom) | ||
− | + | End | |
=Note= | =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": "991"]. |
Versione attuale delle 10:47, 19 nov 2024
Indice
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": "991"]).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 EndPublic 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) EndPublic 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": "991"].