Utilizzare una MediaView con gb.map anziché una MapView
Per mostrare una mappa di un Remote Tile Server, è possibile utilizzare anche un Oggetto MediaView, fornito dal Componente "gb.media".
In particolare, bisogna considerare che un Oggetto MediaView è composto - fra l'altro - da un Oggetto MediaPlayer che a sua volta ha, come "Figlio", un Panel "Figlio" che fa da contenitore ad alcuni Oggetti grafici (suoi "Figli"), tra i quali c'è un altro Panel, che a sua volta contiene, come sua "Figlia", una DrawingArea.
Useremo tale Oggetto DrawingArea (che, come si è descritto, è uno degli Oggetti grafici che compongono l'Oggetto grafico MediaView ) per mostrare la mappa-tile.
Nel contempo sarà possibile vedere anche un file video oppure ascoltare un file audio, cliccando sul tastino di avvio, posto in basso a sinistra dell'Oggetto MediaView. In caso di visualizzazione di un Video o avvio di un file audio, la mappa-tile sarà coperta dal video o - nel caso del file audio - da uno sfondo scuro. Cliccando però sul tastino di arresto del MediaView, si tornerà a visualizzare la mappa.
Esempio pratico (ovviamente è necessario attivare i Componenti "gb.map", "gb.media" e "gb.media.form") [nota 1]:
Private MediaView1 As MediaView Private DrawingArea1 As DrawingArea Private mappa As Map Private mp As New MapPoint(41.8902, 12.4923) Private mx As Integer Private my As Integer Private pt As New Point Private cpx As New Point Private c As Short 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 .Arrangement = Arrange.Fill .Text = "Zoom: " & CStr(mappa.Zoom) End With MediaView1 = New MediaView(Me) As "MediaView1" End Public Sub Form_Open() Dim med As Object Dim pn, pn1 As Panel With MediaView1 .URL = Media.URL("/percorso/del/file/multimediale") ' Ottiene il primo "Figlio" dell'Oggetto "MediaView", che è un "MediaPlayer": med = .Children[0] Print Object.Type(med) End With ' Ottiene il primo "Figlio" dell'Oggetto "MediaPlayer", che è un "Panel": pn = med.Children[0] Print Object.Type(pn) ' Ottiene il primo "Figlio" dell'Oggetto "Panel", che è a sua volta un "Panel": pn1 = pn.Children[0] Print Object.Type(pn1) ' Ottiene il primo "Figlio" dell'Oggetto "Panel", che è una "DrawingArea": DrawingArea1 = pn1.Children[0] Print Object.Type(pn1.Children[0]) ' Se durante l'esecuzione di un file audio si vuole vedere contestualmente anche la mappa, allora bisogna assegnare alla superficie di fondo della "DrawingArea" il valore della trasparenza. In tal caso, però, non sarà possibile spostare la mappa con il mouse. Ciò tornerà ad essere possibile, arrestando l'esecuzione dell'audio cliccando sul tastino dello "STOP" del "MediaView" in basso a sinistra. ' DrawingArea1.Background = Color.Transparent ' Assegna la "DrawingArea" ad un Gruppo di Eventi: Object.Attach(DrawingArea1, Me, "DrawingArea1") End Public Sub DrawingArea1_Draw() With mappa .Width = Paint.W .Height = Paint.H .Center = mp .Draw() End With DrawingArea1.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: 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_" & CStr(c) & ".png", 100) Inc c 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 Me.Text = "Zoom: " & CStr(mappa.Zoom) End
Note
[1] Qualora la mappa non appaia, verificare la versione GoogleMap, ed eventualmente modificarla in questo punto del codice: ["version": "991"].