Differenze tra le versioni di "Mostrare sulla MapView disegni, immagini e Controlli senza l'uso del Metodo Map.AddShape()"
Riga 98: | Riga 98: | ||
End | End | ||
+ | |||
+ | ==Mostrare un video in un punto determinato della mappa== | ||
+ | E' possibile mostrare sulla ''MapView'' anche un video, sia caricato da file, sia richiato da un indirizzo web. | ||
+ | |||
+ | A tal file si utilizzerà la Classe ''MediaPlayer'' del Componente ''gb.media''. | ||
+ | |||
+ | Di seguito un esempio per mostrare un file video: | ||
+ | Private MapView1 As MapView | ||
+ | Private mpim As MapPoint | ||
+ | Private mp As MediaPlayer | ||
+ | Private da As DrawingArea | ||
+ | |||
+ | |||
+ | Public Sub Form_Open() | ||
+ | |||
+ | Dim pn As Panel | ||
+ | |||
+ | With Me | ||
+ | .W = Screen.AvailableWidth | ||
+ | .H = Screen.AvailableHeight | ||
+ | .Arrangement = Arrange.Fill | ||
+ | End With | ||
+ | With MapView1 = New MapView(Me) As "MapView1" | ||
+ | .Map.AddTile("GoogleMap", "https://mt0.google.com/vt/lyrs=s&hl=&x={x}&y={y}&z={z}") | ||
+ | .Map.Zoom = 15 | ||
+ | .Map.Center = MapPoint(41.89018, 12.49230) | ||
+ | <FONT Color=gray>' '''''Individua dapprima l'Oggetto "Figlio" della "MapView", che è un "Panel":'''''</font> | ||
+ | pn = <FONT Color=#B22222><B>.Children[0]</b></font> | ||
+ | End With | ||
+ | |||
+ | <FONT Color=gray>' '''''Quindi individua l'Oggetto "Figlio" del predetto "Panel", che è una "DrawingArea":'''''</font> | ||
+ | da = <FONT Color=#B22222><B>pn.Children[0]</b></font> | ||
+ | |||
+ | <FONT Color=gray>' '''''Stabilisce le coordinate geografiche ove sarà posizionato il video:'''''</font> | ||
+ | mpim = MapPoint(41.90018, 12.50030) | ||
+ | |||
+ | End | ||
+ | |||
+ | Public Sub MapView1_MouseUp() | ||
+ | |||
+ | If Not Mouse.Right Then Return | ||
+ | |||
+ | With mp = New MediaPlayer | ||
+ | .URL = Media.Url("<FONT Color=gray>''/percorso/del/file/video''</font>") | ||
+ | .Play() | ||
+ | <FONT Color=gray>' ''Imposta il controllo dell'uscita video da usare:''</font> | ||
+ | .SetWindow(<FONT Color=#B22222>da</font>, MapView1.Map.MapPointToPixelRel(mpim).X, MapView1.Map.MapPointToPixelRel(mpim).Y, 240, 160) | ||
+ | End With | ||
+ | |||
+ | <FONT Color=gray>' ''Il ciclo consente di eseguire il video:''</font> | ||
+ | Repeat | ||
+ | <FONT Color=gray>' ''Una brevissima pausa consente di mostrare e di agire sugli eventuali oggetti posti sul Form:''</font> | ||
+ | Wait 0.01 | ||
+ | Until FMain.Closed Or (mp.Position >= mp.Duration) | ||
+ | |||
+ | End | ||
+ | |||
+ | <Font Color=gray>' ''Questo Evento garantisce che, sia all'apertura iniziale della mappa, sia in caso di spostamento la Mappa con il mouse, il "Controllo" si mostri solo e sempre alle sue coordinate geografiche prestabilite.'' | ||
+ | ' ''Se l'istruzione viene posta invece all'interno di un Evento del "Form", il "Controllo" non acquisirà le predette coordinate.''</font> | ||
+ | Public Sub MapView1_Draw() | ||
+ | |||
+ | If IsNull(mp) Then Return | ||
+ | |||
+ | mp.SetWindow(da, MapView1.Map.MapPointToPixelRel(mpim).X, MapView1.Map.MapPointToPixelRel(mpim).Y, 240, 160) | ||
+ | |||
+ | End | ||
+ | |||
+ | Public Sub Form_Close() | ||
+ | |||
+ | mp.Close | ||
+ | |||
+ | End | ||
+ | Qualora il video da eseguire ha un indirizzo web, allora tale indirizzo web andrà assegnato alla Proprietà ".Url" della Classe ''MediaPlayer'' direttamente (senza l'uso del Metodo "Media.Url()", come per i file video presenti su dispositivi di memoria): | ||
+ | With mp = New MediaPlayer | ||
+ | .URL = "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_cropped_multilingual.webm" | ||
+ | ...etc... | ||
==Mostrare ''Controlli'' grafici sulla ''MapView''== | ==Mostrare ''Controlli'' grafici sulla ''MapView''== | ||
− | La | + | La routine "MapView_Draw()" è valida anche nel caso di impostazione sulla ''MapView'' di uno o più [[Inserire_un_Oggetto_grafico_su_una_MapView|''Controlli'' grafici]] (''Button'', ''Label'', etc), <SPAN Style="text-decoration:underline">sebbene solo</span> per far sì che, qualora si sposti la Mappa con il mouse, il ''Controllo'' si mostri solo e sempre alle sue coordinate geografiche prestabilite. |
<BR>In particolare si porrà il Metodo ".Move()" del ''Controllo'', assegnando ai due argomenti previsti le coordinate x,y ricavate - quali Proprietà ".X" e ".Y" dal Metodo ".MapPointToPixelRel()" della Classe ''Map'', al quale viene passata la variabile di tipo della Classe ''MapPoint'', contenente le coordinate geografiche del ''Controllo'', precedentemente assegnatele. | <BR>In particolare si porrà il Metodo ".Move()" del ''Controllo'', assegnando ai due argomenti previsti le coordinate x,y ricavate - quali Proprietà ".X" e ".Y" dal Metodo ".MapPointToPixelRel()" della Classe ''Map'', al quale viene passata la variabile di tipo della Classe ''MapPoint'', contenente le coordinate geografiche del ''Controllo'', precedentemente assegnatele. | ||
Versione delle 15:46, 13 gen 2022
Indice
- 1 Introduzione: la struttura della MapView
- 2 Mostrare elementi grafici non riproducibili con il Metodo "Map.AddShape()"
Introduzione: la struttura della MapView
Il Controllo grafico "MapView " è costituito 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
Mostrare elementi grafici non riproducibili con il Metodo "Map.AddShape()"
Di norma, per mostrare alcuni elementi grafici (punti, figure piane e immagini), si deve fare riferimento al Metodo ".AddShape()" della Classe Map.
Questo Metodo, però, non consente di inserire direttamente anche altri elementi, come ad esempio: testo, effetti grafici in movimento, Controlli grafici ed altro.
In caso di bisogno, dunque, per mostrare sulla MapView elementi ed effetti grafici, testo, disegni, immagini e anche Controlli, non riproducibili normalmente con il Metodo "Map.AddShape()", si utilizzerà l'Oggetto DrawingArea, "Figlio" dell'Oggetto Panel a sua volta "Figlio" del Controllo MapView. Al riguardo va ricordato che la Classe DrawingArea eredita le risorse della Classe Container della libreria grafica QT.
Ovviamente con tale modalità potranno essere mostrati sulla mappa anche altri elementi grafici comunque normalmente riproducibili dal predetto Metodo "Map.AddShape()". Tale circostanza rende molto versatile, duttile ed efficiente questo particolare utilizzo dell'Oggetto DrawingArea, "nipote" della MapView.
Disegnare effetti grafici sulla MapView
Va precisato che l'Evento, ove deve avvenire la realizzazione del disegno mediante le risorse della Classe Paint resta comunque quello dell'Oggetto MapView:
MapView_Draw()
avendo cura in tale routine di assegnare al Metodo "Paint.Begin()" l'Oggetto DrawingArea, "Figlio" del Panel.
Esempio astratto per disegnare qualsiasi qualcosa
Mostriamo di seguito un esempio astratto ed essenziale, per disegnare qualsiasi cosa, facendola apparire al di sopra della mappa:
Private pn As Panel Public Sub Form_Open() With MapView1 .Map.AddTile("topo", "https://a.tile.opentopomap.org/{z}/{x}/{y}.png") .Map.Zoom = 14 .Map.Center = MapPoint(41.89018, 12.49230) End With ' Individua dapprima l'Oggetto "Figlio" della "MapView", che è un "Panel": pn = MapView1.Children[0] End Public Sub MapView1_Draw() ' Individua l'Oggetto "Figlio" del "Panel", che è una "DrawingArea": Dim da As DrawingArea da = pn.Children[0] With Paint ' Disegna sull'Oggetto "Figlio" del "Panel", che è una "DrawingArea" (ossia lo stesso Oggetto che la Classe "MapView" usa ordinariamente per mostrare la mappa): .Begin(da) ' ...qui disegna qualcosa... .End End With End
Mostrare una immagine in un punto determinato della mappa
Mostriamo di seguito un esempio per mostrare un'immagine in un punto della mappa determinato da coordinate geografiche prestabilite.
Questo è ovviamente il caso in cui un elemento grafico, gestibile dal Metodo ".AddShape()" della Classe Map, può essere riprodotto anche senza tale Metodo, bensì con la modalità argomento della presente pagina.
Private MapView1 As MapView Private mpim As MapPoint Private im As Image Public Sub Form_Open() With Me .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill End With With MapView1 = New MapView(Me) As "MapView1" .Map.AddTile("GoogleMap", "https://mt0.google.com/vt/lyrs=s&hl=&x={x}&y={y}&z={z}") .Map.Zoom = 15 .Map.Center = MapPoint(41.89018, 12.49230) End With im = Image.Load("/percorso/del/file/immagine.png") ' Stabilisce le coordinate geografiche ove sarà posizionata l'immagine: mpim = MapPoint(41.90018, 12.50030) End Public Sub MapView1_Draw() ' Individua dapprima l'Oggetto "Figlio" della "MapView", che è un "Panel": Dim pn As Panel = MapView1.Children[0] ' Quindi individua l'Oggetto "Figlio" del predetto "Panel", che è una "DrawingArea": Dim da As DrawingArea = pn.Children[0] With Paint ' Disegna sull'Oggetto "Figlio" del "Panel", che è una "DrawingArea" (ossia lo stesso Oggetto che la Classe "MapView" usa ordinariamente per mostrare la mappa): .Begin(da) .DrawImage(im, MapView1.Map.MapPointToPixelRel(mpim).X, MapView1.Map.MapPointToPixelRel(mpim).Y, im.W, im.H, 1.0, Null) .End End With End
Mostrare un video in un punto determinato della mappa
E' possibile mostrare sulla MapView anche un video, sia caricato da file, sia richiato da un indirizzo web.
A tal file si utilizzerà la Classe MediaPlayer del Componente gb.media.
Di seguito un esempio per mostrare un file video:
Private MapView1 As MapView Private mpim As MapPoint Private mp As MediaPlayer Private da As DrawingArea Public Sub Form_Open() Dim pn As Panel With Me .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill End With With MapView1 = New MapView(Me) As "MapView1" .Map.AddTile("GoogleMap", "https://mt0.google.com/vt/lyrs=s&hl=&x={x}&y={y}&z={z}") .Map.Zoom = 15 .Map.Center = MapPoint(41.89018, 12.49230) ' Individua dapprima l'Oggetto "Figlio" della "MapView", che è un "Panel": pn = .Children[0] End With ' Quindi individua l'Oggetto "Figlio" del predetto "Panel", che è una "DrawingArea": da = pn.Children[0] ' Stabilisce le coordinate geografiche ove sarà posizionato il video: mpim = MapPoint(41.90018, 12.50030) End Public Sub MapView1_MouseUp() If Not Mouse.Right Then Return With mp = New MediaPlayer .URL = Media.Url("/percorso/del/file/video") .Play() ' Imposta il controllo dell'uscita video da usare: .SetWindow(da, MapView1.Map.MapPointToPixelRel(mpim).X, MapView1.Map.MapPointToPixelRel(mpim).Y, 240, 160) End With ' Il ciclo consente di eseguire il video: Repeat ' Una brevissima pausa consente di mostrare e di agire sugli eventuali oggetti posti sul Form: Wait 0.01 Until FMain.Closed Or (mp.Position >= mp.Duration) End ' Questo Evento garantisce che, sia all'apertura iniziale della mappa, sia in caso di spostamento la Mappa con il mouse, il "Controllo" si mostri solo e sempre alle sue coordinate geografiche prestabilite. ' Se l'istruzione viene posta invece all'interno di un Evento del "Form", il "Controllo" non acquisirà le predette coordinate. Public Sub MapView1_Draw() If IsNull(mp) Then Return mp.SetWindow(da, MapView1.Map.MapPointToPixelRel(mpim).X, MapView1.Map.MapPointToPixelRel(mpim).Y, 240, 160) End Public Sub Form_Close() mp.Close End
Qualora il video da eseguire ha un indirizzo web, allora tale indirizzo web andrà assegnato alla Proprietà ".Url" della Classe MediaPlayer direttamente (senza l'uso del Metodo "Media.Url()", come per i file video presenti su dispositivi di memoria):
With mp = New MediaPlayer .URL = "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_cropped_multilingual.webm" ...etc...
Mostrare Controlli grafici sulla MapView
La routine "MapView_Draw()" è valida anche nel caso di impostazione sulla MapView di uno o più Controlli grafici (Button, Label, etc), sebbene solo per far sì che, qualora si sposti la Mappa con il mouse, il Controllo si mostri solo e sempre alle sue coordinate geografiche prestabilite.
In particolare si porrà il Metodo ".Move()" del Controllo, assegnando ai due argomenti previsti le coordinate x,y ricavate - quali Proprietà ".X" e ".Y" dal Metodo ".MapPointToPixelRel()" della Classe Map, al quale viene passata la variabile di tipo della Classe MapPoint, contenente le coordinate geografiche del Controllo, precedentemente assegnatele.
Esempio astratto per porre un Controllo grafico sulla MapView
Mostriamo di seguito un esempio astratto ed essenziale, per far apparire un Controllo grafico (ad esempio un Button) al di sopra della mappa:
Private MapView1 As MapView Private bu As Button Private mpbu As MapPoint Public Sub Form_Open() Dim mp As New MapPoint(41.89018, 12.49230) Dim pn As Panel Dim pt As Point Dim da As DrawingArea With Me .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill End With With MapView1 = New MapView(Me) As "MapView1" .Map.AddTile("topo", "https://a.tile.opentopomap.org/{z}/{x}/{y}.png") .Map.Zoom = 14 .Map.Center = mp pt = New Point(.MapPointToPixelRel(mp).X, .MapPointToPixelRel(mp).Y) End With ' Individua dapprima l'Oggetto "Figlio" della "MapView", che è un "Panel": pn = MapView1.Children[0] ' Quindi individua l'Oggetto "Figlio" del predetto "Panel", che è una "DrawingArea": da = pn.Children[0] ' Attribuisce il Controllo grafico "Button" alla predetta "DrawingArea" ("Figlia" del "Panel"), per impedire che altrimenti si espanda alla dimensione della "MapView": With bu = New Button(da) As "Controllo1" ' Posiziona il "Button" nei pressi di determinate coordinate geografiche, trasformate adeguatamente in coordinate x,y dell'Oggetto "DrawingArea", della quale il "Button" è ormai "Figlio": .X = pt.X .Y = pt.Y .W = 20 .H = 20 End With ' Converte le coordinate x,y del "Controllo" ("Button") in coordinate geografiche e le assegna a una viariabile di tipo "MapPoint": mpbu = MapView1.Map.PixelToMapPointRel(pt) End ' Questo Evento garantisce che, sia all'apertura iniziale della mappa, sia in caso di spostamento la Mappa con il mouse, il "Controllo" si mostri solo e sempre alle sue coordinate geografiche prestabilite. ' Se l'istruzione viene posta invece all'interno di un Evento del "Form", il "Controllo" non acquisirà le predette coordinate. Public Sub MapView1_Draw() ' Assicura che il "Controllo" grafico sia mostrato solo e sempre alle sue coordinate geografiche prestabilite, che trasforma adeguatamente in coordinate x,y sulla "DrawingArea" qualora ne ricorrano le circostanze geografiche ad esempio a seguito di eventuale spostamento della mappa con il mouse): With MapView1.Map bu.Move(.MapPointToPixelRel(mpbu).X, .MapPointToPixelRel(mpbu).Y) End With End
Esempi pratici
Esempi pratici posso essere rinvenuti nelle seguenti pagine:
- Disegnare il testo su una MapView usando l'Oggetto "Figlio" DrawingArea
- Disegnare sulla MapView dei cerchi concentrici al punto ove si è cliccato con il puntatore del mouse
- Disegnare un cerchio o una ellisse o un punto su una MapView usando l'Oggetto "Figlio" DrawingArea
- Disegnare un mirino come cursore del mouse su una MapView
- Disegnare un'immagine su una MapView usando l'Oggetto "Figlio" DrawingArea
- Inserire un Oggetto grafico (un Controllo) su una MapView