Disegnare un cerchio o un punto su una MapView

Da Gambas-it.org - Wikipedia.
Versione del 15 apr 2021 alle 06:50 di Vuott (Discussione | contributi) (Creata pagina con "==Disegnare un Punto o un Cerchio con il Metodo ".AddShape().AddCircle()" della Classe "Map"== ===Disegnare un Punto=== Per disegnare su una ''MapView'' un punto con il Metodo...")

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

Disegnare un Punto o un Cerchio con il Metodo ".AddShape().AddCircle()" della Classe "Map"

Disegnare un Punto

Per disegnare su una MapView un punto con il Metodo ".AddShape().AddCircle()" della Classe "Map", è necessario assegnare un piccolo valore al terzo argomento del predetto Metodo e assegnare un colore al settimo argomento, affinché l'elemento geometrico appaia come un "punto" (un piccolo cerchio pieno) e non come un cerchio vuoto.

Public Sub Form_Open()
 
 Dim mp As New MapPoint(41.8903, 12.492255)
   
 With MapView1.Map
   .AddTile("GoogleMap", "https://mt0.google.com/vt/lyrs=s&hl=&x={x}&y={y}&z={z}")
   .Zoom = 15
' Imposta il centro del punto:
   .Center = mp
' Disegna infine il punto:
   .AddShape("colosseo").AddCircle("punto", mp, 4, Color.Red, 1, 1, Color.Red)
 End With 
   
End

Il terzo argomento stabilisce il raggio del punto. Il quarto argomento assegna il colore alla circonferenza, mentre il settimo riempie il punto con il colore ivi impostato.

Disegnare un Cerchio

Per disegnare su una MapView un cerchio mediante il Metodo , è possibile utilizzare il Metodo .AddCircle( ) del Metodo ".AddShape( )" della Classe "Map", è sufficiente assegnare un adeguato valore al terzo argomento e il valore della trasparenza al settimo argomento, se si vuole ottenere un cerchio vuoto, altrimenti un colore opaco se si vuole ottenere un cerchio pieno.

Public Sub Form_Open()
 
 Dim mp As New MapPoint(41.8903, 12.492255)
   
 With MapView1.Map
   .AddTile("GoogleMap", "https://mt0.google.com/vt/lyrs=s&hl=&x={x}&y={y}&z={z}")
   .Zoom = 15
' Imposta il centro del cerchio:
   .Center = mp
' Disegna infine il cerchio:
   .AddShape("colosseo").AddCircle("cerchio", mp, 100, Color.Red, 1, 1, Color.Transparent)
 End With 
   
End

Se si vuole, ad esempio, creare un cerchio riempito di un colore e con la circonferenza disegnata da altro colore:

MapView1.Map.AddShape("cerchio").AddCircle("cerchio", mp, 100, Color.Red, 2, 1, Color.Yellow)


Disegnare più punti

Mostriamo un esempio pratico per disegnare più punti lungo un'ideale circonferenza:

Public Sub Form_Open()
 
 Dim x_a, y_o, r, an As Short
 Dim po As New Point
 Dim mp As New MapPoint
  
 With MapView1
   .Map.AddTile("GoogleMap", "https://khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "899"]).SubDomains = ["0", "1", "2"]
   .Map["GoogleMap"].Visible = True
   .Map.Zoom = 15
 End With
 
' Imposta il centro della circonferenza, lungo la quale saranno posizionati i vari punti da disegnare:
 mp.Lat = 41.8903
 mp.Lon = 12.492255
 MapView1.Map.Center = mp
 po = MapView1.Map.MapPointToPixelRel(mp)
  
 x_a = po.X   ' Rappresenta la distanza X della circonferenza dal punto 0 (angolo in alto a sinistra)
 y_o = po.y   ' Rappresenta la distanza Y della circonferenza dal punto 0 (angolo in alto a sinistra)
 r = 50       ' Rappresenta la dimensione del raggio della circonferenza
 
' Descrive un angolo da 0° sino a 360° (quindi un'intera circonferenza):
  For an = 0 To 360 Step 30
    po.X = x_a + r * Cos(Rad(an)) 
    po.Y = y_o + r * Sin(Rad(an))
    mp = MapView1.Map.PixelToMapPointRel(po)
    MapView1.Map.AddShape("italia").AddCircle("cerchio", mp, 5, Color.Red, 1, 1, Color.Yellow)
  Next
  
End


Disegnare un semplice punto senza utilizzare il Metodo .AddCircle( )

Si può, volendo, disegnare un semplice punto anche senza utilizzare il Metodo .AddCircle( ), disegnando su un oggetto Image un cerchio o un rettangolo colorato.

Public Sub Form_Open()
  
 With MapView1.Map
   .AddTile("Open Topo", "https://a.tile.opentopomap.org/{z}/{x}/{y}.png")
   .Zoom = 15
' Imposta il centro della mappa:
   .Center = MapPoint(41.8903, 12.492255)
 End With 
      
End


Public Sub MapView1_MouseUp()
 
 Dim mp As New MapPoint
 Dim pt As New Point(Mouse.X, Mouse.Y)
 Dim im As Image
 
 mp = MapView1.Map.PixelToMapPointRel(pt)
 
' Crea l'oggetto "Image":
 im = New Image(90, 60, Color.Transparent, gb.Standard)
 
' Scrive le coordinate geografiche nell'oggetto "Image" in forma testuale:
 With Paint
   .Begin(im)
   .Font.Size = 8
   .Brush = .Color(Color.Red)
   .DrawText(Format(mp.Lat, "#.######") & "\n" & Format(mp.Lon, "#.######"), 35, 14, im.W, im.H, Align.Normal)
' Disegna un rettangolo come punto delle coordinate:
   .Rectangle(28, 43, 3, 3)
   .Fill
   .End
 End With
 
 With MapView1
   .Map.AddShape("immagine").AddPoint("immagine", mp, Color.Default, im)
   .Refresh()
   .Map.Refresh()
 End With
 
End


Disegnare un cerchio o una ellisse o un punto 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 MapView1 = New MapView(Me) As "MapView1"
   .X = 0
   .Y = 0
   .W = Me.W
   .H = Me.H
   .Map.AddTile("topo", "https://a.tile.opentopomap.org/{z}/{x}/{y}.png")
' Individua dapprima l'Oggetto "Figlio" della "MapView", che è un "Panel":
   pn = .Children[0]
 End With
 
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 x, y As Float = 50.0
 Dim i As Integer
 
 With Paint
' Disegna sull'Oggetto "Figlio" del "Panel", che è una "DrawingArea", la stessa che la Classe "MapView" usa per mostrare la mappa:
   .Begin(pn.Children[0])
   .Brush = .Color(Color.Yellow)
   .LineWidth = 2.0
   For i = 0 to mmpp.Max
' (x / 2) e (y / 2) per centrare il cerchio nel punto dove si clicca con il mouse:
     .Ellipse(MapView1.Map.MapPointToPixelRel(mmpp[i]).X - (x / 2), MapView1.Map.MapPointToPixelRel(mmpp[i]).Y - (y / 2), x, y, Rad(0), Rad(360), False)
' E' possibile anche usare il Metodo ".Arc()".
   Next
   .Stroke
   .End
 End With
 
End


Note

[1] Qualora la mappa non appaia, verificare la versione GoogleMap, ed eventualmente modificarla qui: ["version": "899"]
Al riguardo vedere: https://www.gisenglish.com/2018/06/download-sas-planet-nightly-all.html