Autore Topic: gb.map: disegnare un percorso sulla mappa e calcolarne la lunghezza  (Letto 1415 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.266
  • Ne mors quidem nos iunget
    • Mostra profilo
Vi lascio questo codice (è necessario attivare il Componente "gb.map"):

Codice: [Seleziona]
'' Per iniziare a disegnare e calcolare la lunghezza di un percorso sulla mappa, cliccare innanzitutto con il tasto DESTRO del mouse sulla mappa medesima. Quindi cliccare con il tasto CENTRALE del mouse sul punto ove si intende fa cominciare il percorso da calcolare, e disegnare il tracciato spostandosi con il mouse, mantenendo premuto il tasto CENTRALE del mouse. E' possibile anche effettuare il calcolo della lunghezza di un tracciato cliccando solo su alcuni punti distanti fra loro (questo metodo ovviamente è preferibile soltanto per tratti rettilinei).
'' Per spostare la mappa, senza perdere i dati immessi, utili per il calcolo del tracciato, usare esclusivamente il tasto SINISTRO del mouse.
'' Per iniziare a calcolare un nuovo percorso, cliccare nuovamente con il tasto DESTRO del mouse sulla mappa.


Private MapView1 As MapView
Private pn As Panel
Private AreaDisegno As DrawingArea
Private obs As Observer
Private mp As MapPoint = MapPoint(41.8903, 12.49223)
Private mmpp As MapPoint[]
Private f As Float
Private bo As Boolean
 
 
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 = 6
' Imposta il centro della mappa:
    .Map.Center = mp
  End With
 
  pn = MapView1.Children[0]
  AreaDisegno = pn.Children[0]
' In questo caso si usa la Classe "Observer" - e non il Metodo "Object.Attach()" - per consentire che la mappa sia visibile:
  obs = New Observer(AreaDisegno) As "AreaDisegno"
   
End

Public Sub AreaDisegno_MouseDown()
 
  Dim pt As New Point(Mouse.X, Mouse.Y)
  Dim lat As Float = MapView1.Map.PixelToMapPointRel(pt).Lat
  Dim lon As Float = MapView1.Map.PixelToMapPointRel(pt).Lon
 
' Se si clicca con il tasto DESTRO del mouse, è possibile iniziare un nuovo tracciato:
  If Mouse.Right Then
    f = 0.0
    mmpp = New MapPoint[]
  Endif
  If Not Mouse.Middle Then Return
' Se non è stato premuto sulla mappa con il tasto DESTRO del mouse, viene mostrato un avviso:
  If Not Object.IsValid(mmpp) Then
    Message.Warning("Per iniziare un tracciato, cliccare preliminarmente con il tasto DESTRO del mouse sulla mmappa !")
    Return
  Endif
  mp = MapPoint(lat, lon)
  mmpp.Push(mp)
  bo = True
  Me.Mouse = Mouse.Blank
' Consente che sia disegnato il mirino sulla mappa, non appena vi si clicca con il tasto CENTRALE:
  MapView1.Refresh
  MapView1.Map.Refresh
 
End

Public Sub AreaDisegno_MouseUp()

  bo = False
  Me.Mouse = Mouse.Arrow

End

Public Sub AreaDisegno_MouseMove()
 
  Dim pt As New Point(Mouse.X, Mouse.Y)
  Dim lat As Float = MapView1.Map.PixelToMapPointRel(pt).Lat
  Dim lon As Float = MapView1.Map.PixelToMapPointRel(pt).Lon
 
  If Not Mouse.Middle Then Return
  Me.Mouse = Mouse.Blank

  mp = MapPoint(lat, lon)
  mmpp.Push(mp)
  MapView1.Refresh
  MapView1.Map.Refresh
 
End

Public Sub MapView1_Draw()
 
  Dim c, x, y, r As Short
  Dim s As String
  Dim po As Point = MapView1.Map.MapPointToPixelRel(mp)
 
  With Paint
    .Begin(AreaDisegno)
    .Brush = .Color(Color.DarkOrange)
    .LineWidth = 2.0
    .Arc(MapView1.Map.MapPointToPixelRel(mp).X, MapView1.Map.MapPointToPixelRel(mp).Y, 50, 0, 360, False)
    .Arc(MapView1.Map.MapPointToPixelRel(mp).X, MapView1.Map.MapPointToPixelRel(mp).Y, 30, 0, 360, False)
    .Stroke
    .Brush = .Color(Color.Red)
    .Arc(MapView1.Map.MapPointToPixelRel(mp).X, MapView1.Map.MapPointToPixelRel(mp).Y, 1.5, 0, 360, False)
    .Fill
   
    r = 50
    x = po.X
    y = po.Y
   
    For c = 0 To 270 Step 90
      po.X = x + r * Cos(Rad(c))
      po.Y = y + r * Sin(Rad(c))
      .MoveTo(po.X, po.Y)
' Per ridurre la lunghezza della "x" per i gradi 0, 90, 180 e 270 è necessaria questa sequenza: +n 0 -n 0 che si ottiene con il Coseno di c.
' Per ridurre la lunghezza della "y" per i gradi 0, 90, 180 e 270 è necessaria questa sequenza: 0 -n 0 +n che si ottiene con il Coseno di c + 90.
      .LineTo(x + (20 * Cos(Rad(c))), y - (20 * Cos(Rad(c + 90))))
      .Stroke
    Next
    .Brush = .Color(Color.Orange)
    .Font.Size = 8
    .DrawText(Format(mp.Lat, "0.######"), x + r * Cos(Rad(270)) - (Me.Font.TextWidth(Format(mp.Lat, "0.######")) / 2), y + (r + 15) * Sin(Rad(270)), Me.Font.TextWidth(Format(mp.Lat, "0.######")), Me.Font.TextHeight(Format(mp.Lat, "0.######")), Align.Right)
    .DrawText(Format(mp.Lon, "0.######"), x + r * Cos(Rad(0)) - (Me.Font.TextWidth(Format(mp.Lon, "0.######")) / 2), (y + r * Sin(Rad(0))) - 17, Me.Font.TextWidth(Format(mp.Lon, "0.######")), Me.Font.TextHeight(Format(mp.Lon, "0.######")), Align.Right)

    If Not Object.IsValid(mmpp) Then
      .End
      Return
    Endif
   
' Disegna i punti del tracciato seguito:
    .Brush = .Color(Color.Yellow)
    For c = 0 To mmpp.Max
      r = 1
      If c = 0 Then r = 4
      .Arc(MapView1.Map.MapPointToPixelRel(mmpp[c]).X, MapView1.Map.MapPointToPixelRel(mmpp[c]).Y, r, 0, 360, False)
      .Fill
    Next
   
' Disegna il calcolo in metri dell'intero percorso sino in quel momento tracciato:
    If mmpp.Count == 1 Then s = "m. 0,00"
    If mmpp.Count > 1 Then
      If bo Then f += MapPoint.Distance(mmpp[mmpp.Max - 1], mmpp[mmpp.Max])
      s = "m. " & Format(f, "0.##")
    Endif
      .Font.Size = 11
      .DrawText(s, x + r * Cos(Rad(90)) - (Me.Font.TextWidth(s) / 2), y + (r + 50) * Sin(Rad(90)), Me.Font.TextWidth(s), Me.Font.TextHeight(s), Align.Right)
    .End
  End With
 
End
« Ultima modifica: 01 Giugno 2021, 16:08:00 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »