Differenze tra le versioni di "Inserire del testo su una MapView"

Da Gambas-it.org - Wikipedia.
 
(38 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 oggetto ''Image'' e successivamente passarlo all'ultimo argomento del Metodo "''.AddPoint( )'' ".
+
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 è 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>&#091;[[#Note|nota 1]]&#093;</sup>
 
  Private mp As New MapPoint
 
  Private mp As New MapPoint
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  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&#058;//khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "849"]).SubDomains = ["0", "1", "2"]
+
     .Map.AddTile("GoogleMap", "https&#058;//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'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub MapView1_MouseDown()
+
  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'''
+
  End
 +
 
   
 
   
 +
Public Sub MapView1_MouseUp()
 
   
 
   
  '''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, "#.######")
 
    
 
    
   Dim im As Image
+
<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>' ''Crea l'oggetto "Image":''</font>
 
  im = New Image(60, 40, Color.Transparent, gb.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 = 12
+
    .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(Format(mp.Lat, "#.######") & "\n" & Format(mp.Lon, "#.######"), 1, 1, im.W, im.H, Align.Normal)
+
     <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()
    .Map.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&#058;//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 = "&lt;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