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": "996"]).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": "996"].