Differenze tra le versioni di "Inserire del testo su una MapView"
(37 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | Una modalità per poter inserire del testo su una ''MapView'' è quella di scrivere il testo su un | + | Una modalità per poter inserire del testo su una ''MapView'' è quella di scrivere il testo su un Oggetto ''Image'', che dovrà essere successivamente passato all'ultimo argomento del sotto-Metodo ".AddPoint()" del Metodo ".AddShape()" della Classe ''Map''. |
<BR>Pur spostando con il mouse la mappa, il testo resterà stabile sul punto ove era stato disegnato. | <BR>Pur spostando con il mouse la mappa, il testo resterà stabile sul punto ove era stato disegnato. | ||
− | Vediamo un semplice esempio: | + | Vediamo un semplice esempio: <SUP>[[[#Note|nota 1]]]</sup> |
Private mp As New MapPoint | Private mp As New MapPoint | ||
− | + | Public Sub Form_Open() | |
With MapView1 | With MapView1 | ||
Riga 14: | Riga 14: | ||
.W = Me.W | .W = Me.W | ||
.H = Me.H | .H = Me.H | ||
− | .Map.AddTile("GoogleMap", "https://khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": " | + | .Map.AddTile("GoogleMap", "https://khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "991"]).SubDomains = ["0", "1", "2"] |
.Map.Zoom = 16 | .Map.Zoom = 16 | ||
mp.Lat = 41.8902142 | mp.Lat = 41.8902142 | ||
Riga 21: | Riga 21: | ||
End With | End With | ||
− | + | End | |
− | ''' | + | Public Sub MapView1_MouseDown() |
− | + | ||
+ | <FONT Color=gray>' ''Se si clicca con il tasto centrale del mouse, si cancelleranno le immagini con il testo, se presenti, cominciando dalla prima inserita:''</font> | ||
+ | If Mouse.Middle Then | ||
+ | With MapView1 | ||
+ | If Not Object.IsValid(.Map.GetShape("immagine")) Then Return | ||
+ | .Map.Remove("immagine") | ||
+ | .Refresh | ||
+ | End With | ||
+ | Endif | ||
+ | |||
Dim pt As New Point(Mouse.X, Mouse.Y) | Dim pt As New Point(Mouse.X, Mouse.Y) | ||
mp = MapView1.Map.PixelToMapPointRel(pt) | mp = MapView1.Map.PixelToMapPointRel(pt) | ||
− | + | End | |
+ | |||
+ | Public Sub MapView1_MouseUp() | ||
− | + | If Not Mouse.Right Then Return | |
+ | |||
+ | Dim im As Image | ||
+ | Dim s As String | ||
+ | |||
+ | s = Format(mp.Lat, "#.######") & "\n" & Format(mp.Lon, "#.######") | ||
− | + | <FONT Color=gray>' ''Crea l'oggetto "Image" impostando la sua dimensione coerente con l'area occupata dal testo:''</font> | |
+ | im = New Image(Me.Font.TextWidth(s), Me.Font.TextHeight(s), Color.Transparent, Image.Standard) | ||
− | |||
− | |||
− | |||
<FONT Color=gray>' ''Scrive le coordinate geografiche nell'oggetto "Image" in forma testuale:''</font> | <FONT Color=gray>' ''Scrive le coordinate geografiche nell'oggetto "Image" in forma testuale:''</font> | ||
With Paint | With Paint | ||
.Begin(im) | .Begin(im) | ||
− | .Font.Size = | + | .Brush = .Color(Color.Orange) |
+ | .Arc(Me.Font.TextWidth(s) / 2 + 1, Me.Font.TextHeight(s) / 2 + 1, 2, Rad(0), Rad(360), False) | ||
+ | .Fill | ||
+ | .Font.Size = 10 | ||
.Brush = .Color(Color.Red) | .Brush = .Color(Color.Red) | ||
− | .DrawText( | + | <FONT Color=#B22222>.DrawText</font>(s, 0, 0, im.W, im.H, Align.Normal) |
.End | .End | ||
End With | End With | ||
With MapView1 | With MapView1 | ||
− | <FONT Color=gray>' ''Passa l'oggetto "Image" al 3° argomento del Metodo ".AddPoint( )":''</font> | + | <FONT Color=gray>' ''Passa l'oggetto "Image" al 3° argomento del Metodo ".AddPoint( )" e mostra sulla mappa l'immagine contenente il testo:''</font> |
.Map.AddShape("immagine").<FONT Color=#B222222>AddPoint</font>("immagine", mp, Color.Default, <FONT Color=#B222222><B>im</b></font>) | .Map.AddShape("immagine").<FONT Color=#B222222>AddPoint</font>("immagine", mp, Color.Default, <FONT Color=#B222222><B>im</b></font>) | ||
.Refresh() | .Refresh() | ||
− | |||
End With | End With | ||
− | '''End''' | + | End |
+ | |||
+ | |||
+ | ==Disegnare il testo su una MapView usando l'Oggetto "Figlio" DrawingArea== | ||
+ | L'Oggetto "MapView" mostra la mappa su una "DrawingArea", che è un Oggetto "Figlio" di un "Panel", "Figlio" a sua volta dell'Oggetto "MapView". | ||
+ | Pertanto, sarà possibile utilizzare tale "DrawingArea" per disegnare qualsiasi cosa, facendola apparire al di sopra della mappa. | ||
+ | |||
+ | Mostriamo un semplice codice esemplificativo: | ||
+ | Private MapView1 As MapView | ||
+ | Private pn As Panel | ||
+ | Private mmpp As New MapPoint[] | ||
+ | |||
+ | |||
+ | 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("topo", "https://a.tile.opentopomap.org/{z}/{x}/{y}.png") | ||
+ | .Map.Zoom = 14 | ||
+ | <FONT Color=gray>' ''Imposta il centro della mappa all'inizio:''</font> | ||
+ | .Map.Center = MapPoint(41.89018, 12.49230) | ||
+ | End With | ||
+ | |||
+ | <FONT Color=gray>' ''Individua dapprima l'Oggetto "Figlio" della "MapView", che è un "Panel":''</font> | ||
+ | pn = MapView1.Children[0] | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub MapView1_MouseUp() | ||
+ | |||
+ | Dim pt As New Point(Mouse.X, Mouse.Y) | ||
+ | |||
+ | <FONT Color=gray>' ''Si usa l'Oggetto "MapPoint" per garantire la coerenza del puntamento su un punto della mappa anche nel caso di spostamento o variazione dello zoom della mappa medesima:''</font> | ||
+ | mmpp.Push(MapView1.Map.PixelToMapPointRel(pt)) | ||
+ | |||
+ | Me.Caption = CStr(mmpp[mmpp.Max].Lat) & " - " & CStr(mmpp[mmpp.Max].Lon) | ||
+ | |||
+ | MapView1.Refresh | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub MapView1_Draw() | ||
+ | |||
+ | Dim i As Integer | ||
+ | Dim s As String = "Testo qualsiasi" | ||
+ | |||
+ | With Paint | ||
+ | <FONT Color=gray>' ''Disegna sull'Oggetto "Figlio" del "Panel", che è una "DrawingArea" (ossia lo stesso Oggetto che la Classe "MapView" usa ordinariamente per mostrare la mappa):''</font> | ||
+ | .Begin(pn.Children[0]) | ||
+ | .Brush = .Color(Color.Red) | ||
+ | For i = 0 to mmpp.Max | ||
+ | .DrawText(s, MapView1.Map.MapPointToPixelRel(mmpp[i]).X, MapView1.Map.MapPointToPixelRel(mmpp[i]).Y, .Font.TextWidth(s), .Font.TextHeight(s), Align.Normal) | ||
+ | Next | ||
+ | .End | ||
+ | End With | ||
+ | |||
+ | End | ||
+ | Se si vuole inserire uno sfondo colorato al testo, allora bisognerà usare il Metodo ".DrawRichText()" (oppure: il Metodo ".TextRich()"), e la precedente routine potrà essere così ad esempio impostata: | ||
+ | Public Sub MapView1_Draw() | ||
+ | |||
+ | Dim i As Integer | ||
+ | Dim s, rt As String | ||
+ | |||
+ | s = "Testo qualsiasi" | ||
+ | <FONT Color=gray>' ''Attribuisce uno sfondo colorato al testo:''</font> | ||
+ | rt = "<SPAN style=background-color:white>" & s & "</span>" | ||
+ | |||
+ | With Paint | ||
+ | .Begin(pn.Children[0]) | ||
+ | .Brush = .Color(Color.Red) | ||
+ | For i = 0 To mmpp.Max | ||
+ | <FONT Color=#B22222><B>.DrawRichText</b></font>(rt, MapView1.Map.MapPointToPixelRel(mmpp[i]).X, MapView1.Map.MapPointToPixelRel(mmpp[i]).Y, .Font.TextWidth(s), .Font.TextHeight(s), Align.Right) | ||
+ | Next | ||
+ | .End | ||
+ | End With | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | |||
+ | =Note= | ||
+ | [1] Qualora la mappa non appaia, verificare la versione GoogleMap, ed eventualmente modificarla in questo punto del codice: ["version": "991"] | ||
+ | <BR>Al riguardo vedere: [[Conoscere la versione più recente di Google Maps satellite]] |
Versione attuale delle 10:43, 19 nov 2024
Una modalità per poter inserire del testo su una MapView è quella di scrivere il testo su un Oggetto Image, che dovrà essere successivamente passato all'ultimo argomento del sotto-Metodo ".AddPoint()" del Metodo ".AddShape()" della Classe Map.
Pur spostando con il mouse la mappa, il testo resterà stabile sul punto ove era stato disegnato.
Vediamo un semplice esempio: [nota 1]
Private mp As New MapPoint Public Sub Form_Open() With MapView1 .X = 0 .Y = 0 .W = Me.W .H = Me.H .Map.AddTile("GoogleMap", "https://khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "991"]).SubDomains = ["0", "1", "2"] .Map.Zoom = 16 mp.Lat = 41.8902142 mp.Lon = 12.4900422 .Map.Center = mp End With End Public Sub MapView1_MouseDown() ' Se si clicca con il tasto centrale del mouse, si cancelleranno le immagini con il testo, se presenti, cominciando dalla prima inserita: If Mouse.Middle Then With MapView1 If Not Object.IsValid(.Map.GetShape("immagine")) Then Return .Map.Remove("immagine") .Refresh End With Endif Dim pt As New Point(Mouse.X, Mouse.Y) mp = MapView1.Map.PixelToMapPointRel(pt) End Public Sub MapView1_MouseUp() If Not Mouse.Right Then Return Dim im As Image Dim s As String s = Format(mp.Lat, "#.######") & "\n" & Format(mp.Lon, "#.######") ' Crea l'oggetto "Image" impostando la sua dimensione coerente con l'area occupata dal testo: im = New Image(Me.Font.TextWidth(s), Me.Font.TextHeight(s), Color.Transparent, Image.Standard) ' Scrive le coordinate geografiche nell'oggetto "Image" in forma testuale: With Paint .Begin(im) .Brush = .Color(Color.Orange) .Arc(Me.Font.TextWidth(s) / 2 + 1, Me.Font.TextHeight(s) / 2 + 1, 2, Rad(0), Rad(360), False) .Fill .Font.Size = 10 .Brush = .Color(Color.Red) .DrawText(s, 0, 0, im.W, im.H, Align.Normal) .End End With With MapView1 ' Passa l'oggetto "Image" al 3° argomento del Metodo ".AddPoint( )" e mostra sulla mappa l'immagine contenente il testo: .Map.AddShape("immagine").AddPoint("immagine", mp, Color.Default, im) .Refresh() End With End
Disegnare il testo su una MapView usando l'Oggetto "Figlio" DrawingArea
L'Oggetto "MapView" mostra la mappa su una "DrawingArea", che è un Oggetto "Figlio" di un "Panel", "Figlio" a sua volta dell'Oggetto "MapView". Pertanto, sarà possibile utilizzare tale "DrawingArea" per disegnare qualsiasi cosa, facendola apparire al di sopra della mappa.
Mostriamo un semplice codice esemplificativo:
Private MapView1 As MapView Private pn As Panel Private mmpp As New MapPoint[] 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("topo", "https://a.tile.opentopomap.org/{z}/{x}/{y}.png") .Map.Zoom = 14 ' Imposta il centro della mappa all'inizio: .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_MouseUp() Dim pt As New Point(Mouse.X, Mouse.Y) ' Si usa l'Oggetto "MapPoint" per garantire la coerenza del puntamento su un punto della mappa anche nel caso di spostamento o variazione dello zoom della mappa medesima: mmpp.Push(MapView1.Map.PixelToMapPointRel(pt)) Me.Caption = CStr(mmpp[mmpp.Max].Lat) & " - " & CStr(mmpp[mmpp.Max].Lon) MapView1.Refresh End Public Sub MapView1_Draw() Dim i As Integer Dim s As String = "Testo qualsiasi" 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(pn.Children[0]) .Brush = .Color(Color.Red) For i = 0 to mmpp.Max .DrawText(s, MapView1.Map.MapPointToPixelRel(mmpp[i]).X, MapView1.Map.MapPointToPixelRel(mmpp[i]).Y, .Font.TextWidth(s), .Font.TextHeight(s), Align.Normal) Next .End End With End
Se si vuole inserire uno sfondo colorato al testo, allora bisognerà usare il Metodo ".DrawRichText()" (oppure: il Metodo ".TextRich()"), e la precedente routine potrà essere così ad esempio impostata:
Public Sub MapView1_Draw() Dim i As Integer Dim s, rt As String s = "Testo qualsiasi" ' Attribuisce uno sfondo colorato al testo: rt = "<SPAN style=background-color:white>" & s & "</span>" With Paint .Begin(pn.Children[0]) .Brush = .Color(Color.Red) For i = 0 To mmpp.Max .DrawRichText(rt, MapView1.Map.MapPointToPixelRel(mmpp[i]).X, MapView1.Map.MapPointToPixelRel(mmpp[i]).Y, .Font.TextWidth(s), .Font.TextHeight(s), Align.Right) Next .End End With End
Note
[1] Qualora la mappa non appaia, verificare la versione GoogleMap, ed eventualmente modificarla in questo punto del codice: ["version": "991"]
Al riguardo vedere: Conoscere la versione più recente di Google Maps satellite