Differenze tra le versioni di "Utilizzare una DrawingArea o una ImageView con gb.map anziché una MapView"
(11 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 7: | Riga 7: | ||
Private mappa As Map | Private mappa As Map | ||
− | + | Public Sub _new() | |
With Me | With Me | ||
Riga 23: | Riga 23: | ||
End With | End With | ||
− | + | End | |
− | + | ||
+ | Public Sub DrawingArea1_Draw() | ||
With mappa | With mappa | ||
Riga 38: | Riga 39: | ||
Me.Refresh | Me.Refresh | ||
− | + | End | |
====Spostare la mappa e cambiare lo zoom==== | ====Spostare la mappa e cambiare lo zoom==== | ||
− | In quest'altro codice si consentirà di spostare la mappa, ossia di mostrare altre aree geografiche della mappa, e di cambiare lo zoom: | + | In quest'altro codice si consentirà di spostare la mappa, ossia di mostrare altre aree geografiche della mappa, e di cambiare lo zoom sia ruotando la rotellina del mouse che agendo su uno ''Slider'': |
Private DrawingArea1 As DrawingArea | Private DrawingArea1 As DrawingArea | ||
+ | Private sld As Slider | ||
Private mappa As Map | Private mappa As Map | ||
Private mp As New MapPoint(41.9, 12.5) | Private mp As New MapPoint(41.9, 12.5) | ||
Riga 51: | Riga 53: | ||
− | + | 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": "979"]).SubDomains = ["0", "1", "2"] <FONT Color=gray>'</font><SUP>[[[#Note|nota 1]]]</sup> |
.Center = mp | .Center = mp | ||
.Zoom = 15 | .Zoom = 15 | ||
Riga 61: | Riga 63: | ||
.W = Desktop.W | .W = Desktop.W | ||
.H = Desktop.H | .H = Desktop.H | ||
− | |||
.Text = "Zoom: " & CStr(mappa.Zoom) | .Text = "Zoom: " & CStr(mappa.Zoom) | ||
End With | End With | ||
− | DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" | + | With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" |
+ | .Move(0, 0, Me.W, Me.H) | ||
+ | End With | ||
+ | |||
+ | With sld = New Slider(DrawingArea1) As "Slider1" | ||
+ | .Move(DrawingArea1.W * 0.05, DrawingArea1.H * 0.1, DrawingArea1.W * 0.02, DrawingArea1.H * 0.2) | ||
+ | .MinValue = 0 | ||
+ | .MaxValue = mappa.MaxZoom | ||
+ | .Step = 1 | ||
+ | .Value = mappa.Zoom | ||
+ | End With | ||
+ | |||
+ | End | ||
− | |||
− | + | Public Sub DrawingArea1_Draw() | |
With mappa | With mappa | ||
Riga 80: | Riga 92: | ||
Me.Refresh() | Me.Refresh() | ||
− | + | End | |
+ | |||
− | + | Public Sub DrawingArea1_MouseDown() | |
pt = Point(Mouse.X, Mouse.Y) | pt = Point(Mouse.X, Mouse.Y) | ||
Riga 105: | Riga 118: | ||
Endif | Endif | ||
− | + | End | |
+ | |||
− | + | Public Sub DrawingArea1_MouseMove() | |
Dim pix As New Point(cpx.X, cpx.Y) | Dim pix As New Point(cpx.X, cpx.Y) | ||
Riga 118: | Riga 132: | ||
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 132: | Riga 147: | ||
<FONT Color=gray>' ''Valuta il verso della rotazione della rotellina e modifica lo zoom della mappa:''</font> | <FONT Color=gray>' ''Valuta il verso della rotazione della rotellina e modifica lo zoom della mappa:''</font> | ||
mappa.Zoom += Mouse.Delta | mappa.Zoom += Mouse.Delta | ||
+ | sld.Value = mappa.Zoom | ||
Me.Text = "Zoom: " & CStr(mappa.Zoom) | Me.Text = "Zoom: " & CStr(mappa.Zoom) | ||
− | + | End | |
+ | |||
+ | Public Sub Slider1_Change() | ||
+ | |||
+ | mappa.Zoom = sld.Value | ||
+ | Me.Text = "Zoom: " & CStr(mappa.Zoom) | ||
+ | |||
+ | End | ||
===Ottenere la Latitudine e la Longitudine di un punto sulla mappa durante lo spostamento del puntatore del mouse senza tenere premuto alcun tasto=== | ===Ottenere la Latitudine e la Longitudine di un punto sulla mappa durante lo spostamento del puntatore del mouse senza tenere premuto alcun tasto=== | ||
Riga 149: | Riga 172: | ||
− | + | Public Sub _New() | |
With mappa = New Map | With mappa = New Map | ||
Riga 167: | Riga 190: | ||
End With | End With | ||
− | + | End | |
+ | |||
− | + | Public Sub DrawingArea1_Draw() | |
With mappa | With mappa | ||
Riga 179: | Riga 203: | ||
Me.Refresh() | Me.Refresh() | ||
− | + | End | |
− | + | ||
+ | Public Sub DrawingArea1_MouseMove() | ||
<FONT Color=gray>' ''Se si sta spostando il puntatore del mouse sulla mappa tenendo premuto su un suo tasto, allora si può spostare la mappa:''</font> | <FONT Color=gray>' ''Se si sta spostando il puntatore del mouse sulla mappa tenendo premuto su un suo tasto, allora si può spostare la mappa:''</font> | ||
Riga 202: | Riga 227: | ||
Endif | Endif | ||
− | + | 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 218: | Riga 244: | ||
Me.Text = "Zoom: " & CStr(mappa.Zoom) | Me.Text = "Zoom: " & CStr(mappa.Zoom) | ||
− | + | End | |
Riga 232: | Riga 258: | ||
− | + | 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": "979"]).SubDomains = ["0", "1", "2"] |
.Center = mp | .Center = mp | ||
.Zoom = 15 | .Zoom = 15 | ||
Riga 250: | Riga 276: | ||
End With | End With | ||
− | + | End | |
− | + | ||
+ | Public Sub ImageView1_Draw(View As Image) | ||
With mappa | With mappa | ||
Riga 260: | Riga 287: | ||
End With | End With | ||
− | Me.Refresh() | + | Me.Refresh() <FONT Color=gray>' ''o anche: '''ImageView1.Refresh()'''''</font> |
− | + | End | |
− | + | ||
+ | Public Sub ImageView1_MouseDown() | ||
pt = Point(Mouse.X, Mouse.Y) | pt = Point(Mouse.X, Mouse.Y) | ||
Riga 287: | Riga 315: | ||
Endif | Endif | ||
− | + | End | |
− | + | ||
+ | Public Sub ImageView1_MouseMove() | ||
Dim pix As New Point(cpx.X, cpx.Y) | Dim pix As New Point(cpx.X, cpx.Y) | ||
Riga 300: | Riga 329: | ||
mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon | mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon | ||
− | + | End | |
+ | |||
− | + | Public Sub ImageView1_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 315: | Riga 345: | ||
Me.Text = "Zoom: " & CStr(mappa.Zoom) | Me.Text = "Zoom: " & CStr(mappa.Zoom) | ||
− | + | End | |
Ovviamente, per ottenere la Latitudine e la Longitudine di un punto sulla mappa durante lo spostamento del puntatore del mouse <SPAN Style="text-decoration:underline">senza</span> tenere premuto alcun suo tasto, si potrà adottare il medesimo codice mostrato con l'uso della "DrawingArea". | Ovviamente, per ottenere la Latitudine e la Longitudine di un punto sulla mappa durante lo spostamento del puntatore del mouse <SPAN Style="text-decoration:underline">senza</span> tenere premuto alcun suo tasto, si potrà adottare il medesimo codice mostrato con l'uso della "DrawingArea". | ||
Riga 321: | Riga 351: | ||
=Note= | =Note= | ||
− | [1] Qualora la mappa non appaia, verificare la versione GoogleMap, ed eventualmente modificarla in questo punto del codice: ["version": " | + | [1] Qualora la mappa non appaia, verificare la versione GoogleMap, ed eventualmente modificarla in questo punto del codice: ["version": "979"]. |
− | <BR>Al riguardo vedere: [[ | + | <BR>Al riguardo vedere: [[Conoscere la versione più recente di Google Maps satellite]] |
− | [2] Vedere anche: [[ | + | [2] Vedere anche: [[Ottenere un'Image dalla mappa mostrata da una MapView]] |
Versione attuale delle 18:38, 2 mag 2024
Per mostrare una mappa con il Componente gb.map, è possibile usare una DrawingArea o una ImageView anziché una MapView.
Indice
Uso di una DrawingArea
Mostriamo un semplice codice essenziale con l'uso di una DrawingArea al posto di una MapView.
Bisognerà ovviamente attivare il Componente gb.map .
Private DrawingArea1 As DrawingArea Private mappa As Map Public Sub _new() With Me .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill End With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" With mappa = New Map As "Mappa" .AddTile("topo", "https://a.tile.opentopomap.org/{z}/{x}/{y}.png") .Zoom = 15 .Center = MapPoint(41.89018, 12.49230) End With End Public Sub DrawingArea1_Draw() With mappa ' Imposta la dimensione della mappa mostrata sulla "DrawingArea": .Width = DrawingArea1.W .Height = DrawingArea1.H ' Disegna quindi la mappa sulla "DrawingArea": .Draw() End With ' L'uso del Metodo "Me.Refresh" consente alla "DrawingArea" di mostrare completamente la mappa: Me.Refresh End
Spostare la mappa e cambiare lo zoom
In quest'altro codice si consentirà di spostare la mappa, ossia di mostrare altre aree geografiche della mappa, e di cambiare lo zoom sia ruotando la rotellina del mouse che agendo su uno Slider:
Private DrawingArea1 As DrawingArea Private sld As Slider Private mappa As Map Private mp As New MapPoint(41.9, 12.5) 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": "979"]).SubDomains = ["0", "1", "2"] '[nota 1] .Center = mp .Zoom = 15 End With With Me .W = Desktop.W .H = Desktop.H .Text = "Zoom: " & CStr(mappa.Zoom) End With With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" .Move(0, 0, Me.W, Me.H) End With With sld = New Slider(DrawingArea1) As "Slider1" .Move(DrawingArea1.W * 0.05, DrawingArea1.H * 0.1, DrawingArea1.W * 0.02, DrawingArea1.H * 0.2) .MinValue = 0 .MaxValue = mappa.MaxZoom .Step = 1 .Value = mappa.Zoom End With End Public Sub DrawingArea1_Draw() With mappa .Width = Paint.W .Height = Paint.H .Draw() End With ' L'uso del Metodo "Me.Refresh" consente alla "DrawingArea" di mostrare completamente la mappa: Me.Refresh() 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) ' Se si clicca sulla mappa con il tasto centrale, viene creato un file immagine della mappa corrente mostrata: ' [Nota 2] If Mouse.Middle Then Dim im As New Image(mappa.Width, mappa.Height, Color.Transparent, Image.Standard) With Paint .Begin(im) mappa.Draw() .End End With im.Save("/tmp/immagine.png", 100) Endif 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 sld.Value = mappa.Zoom Me.Text = "Zoom: " & CStr(mappa.Zoom) End Public Sub Slider1_Change() mappa.Zoom = sld.Value Me.Text = "Zoom: " & CStr(mappa.Zoom) End
Ottenere la Latitudine e la Longitudine di un punto sulla mappa durante lo spostamento del puntatore del mouse senza tenere premuto alcun tasto
Per ottenere la Latitudine e la Longitudine di un punto sulla mappa solo spostando semplicemente il puntatore del mouse senza tenere premuto alcun suo tasto, si deve porre a "True" la Proprietà ".Tracking" della "DrawingArea".
Mostriamo un esempio pratico:
Private DrawingArea1 As DrawingArea Private mappa As Map Private mp As New MapPoint(41.9, 12.5) 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("GoogleMap", "https://mt0.google.com/vt/lyrs=s&hl=&x={x}&y={y}&z={z}") .Center = mp .Zoom = 15 End With With Me .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill .Text = "Zoom: " & CStr(mappa.Zoom) End With With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" ' Imposta a "True" la Proprietà "Tracking" della "DrawingArea": .Tracking = True End With End Public Sub DrawingArea1_Draw() With mappa .Width = Paint.W .Height = Paint.H .Draw() End With Me.Refresh() End Public Sub DrawingArea1_MouseMove() ' Se si sta spostando il puntatore del mouse sulla mappa tenendo premuto su un suo tasto, allora si può spostare la mappa: If Mouse.Left Or Mouse.Middle Or Mouse.Right Then 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 Else ' ...se lo spostamento avviene "senza" tenere premuto un tasto del mouse, allora si vedrà soltanto i valori della Latitudine e della Longitudine in corrispondenza del puntatore del mouse: 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) Endif 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
Uso di una ImageView
Mostriamo un semplice codice con l'uso di una ImageView al posto di una MapView.
Private ImageView1 As ImageView Private mappa As Map Private mp As New MapPoint(41.9, 12.5) 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": "979"]).SubDomains = ["0", "1", "2"] .Center = mp .Zoom = 15 End With With Me .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill .Text = "Zoom: " & CStr(mappa.Zoom) End With With ImageView1 = New ImageView(Me) As "ImageView1" .X = 0 .Y = 0 End With End Public Sub ImageView1_Draw(View As Image) With mappa .Width = Paint.W .Height = Paint.H .Draw() End With Me.Refresh() ' o anche: ImageView1.Refresh() End Public Sub ImageView1_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 = Mouse.X my = Mouse.Y cpx = Geo.MapPointToPixel(mappa.Center, mappa.Zoom) ' Se si clicca sulla mappa con il tasto centrale, viene creato un file immagine della mappa corrente mostrata: If Mouse.Middle Then Dim im As New Image(mappa.Width, mappa.Height, Color.Transparent, Image.Standard) With Paint .Begin(im) mappa.Draw() .End End With im.Save("/tmp/immagine.png", 100) Endif End Public Sub ImageView1_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 ImageView1_MouseWheel() ' Impedisce che si vada oltre il massimo livello di zoom della mappa: If mappa.Zoom + Mouse.Delta > mappa.MaxZoom Then Return 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
Ovviamente, per ottenere la Latitudine e la Longitudine di un punto sulla mappa durante lo spostamento del puntatore del mouse senza tenere premuto alcun suo tasto, si potrà adottare il medesimo codice mostrato con l'uso della "DrawingArea".
Note
[1] Qualora la mappa non appaia, verificare la versione GoogleMap, ed eventualmente modificarla in questo punto del codice: ["version": "979"].
Al riguardo vedere: Conoscere la versione più recente di Google Maps satellite
[2] Vedere anche: Ottenere un'Image dalla mappa mostrata da una MapView