Differenze tra le versioni di "Utilizzare una DrawingArea o una ImageView con gb.map anziché una MapView"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "Per mostrare una mappa con il Componente gb.map, è possibile usare una ''DrawingArea'' o una ''ImageView'' anziché una ''MapView''. ==Uso di una DrawingArea== Mostriamo un...")
 
(28 versioni intermedie di uno stesso utente non sono mostrate)
Riga 2: Riga 2:
  
 
==Uso di una DrawingArea==
 
==Uso di una DrawingArea==
Mostriamo un semplice codice con l'uso di una ''DrawingArea'' al posto di una ''MapView''.
+
Mostriamo un semplice codice essenziale con l'uso di una ''DrawingArea'' al posto di una ''MapView''.
 
<BR>Bisognerà ovviamente attivare il Componente ''gb.map'' .
 
<BR>Bisognerà ovviamente attivare il Componente ''gb.map'' .
 
  Private DrawingArea1 As DrawingArea
 
  Private DrawingArea1 As DrawingArea
 +
Private mappa As Map
 +
 +
Public Sub _new()
 +
 +
  With Me
 +
    .W = Screen.AvailableWidth
 +
    .H = Screen.AvailableHeight
 +
    .Arrangement = Arrange.Fill
 +
  End With
 +
 +
  DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
 +
 +
  With mappa = New Map As "Mappa"
 +
    .AddTile("topo", "https&#058;//a.tile.opentopomap.org/{z}/{x}/{y}.png")
 +
    .Zoom = 15
 +
    .Center = MapPoint(41.89018, 12.49230)
 +
  End With
 +
 +
End
 +
 +
 +
Public Sub DrawingArea1_Draw()
 +
 +
  With mappa
 +
<FONT Color=gray>' ''Imposta la dimensione della mappa mostrata sulla "DrawingArea":''</font>
 +
    .Width = DrawingArea1.W
 +
    .Height = DrawingArea1.H
 +
<FONT Color=gray>' ''Disegna quindi la mappa sulla "DrawingArea":''</font>
 +
    .Draw()
 +
  End With
 +
 +
<FONT Color=gray>' ''L'uso del Metodo "Me.Refresh" consente alla "DrawingArea" di mostrare completamente la mappa:''</font>
 +
  Me.Refresh
 +
 +
End
 +
 +
====Spostare la mappa e cambiare lo zoom====
 +
In quest'altro codice si consentirà di spostare la mappa, ossia di mostrare altre aree geografiche della mappa, e di cambiare lo zoom sia ruotando la rotellina del mouse che agendo su uno ''Slider'':
 +
Private DrawingArea1 As DrawingArea
 +
Private sld As Slider
 
  Private mappa As Map
 
  Private mappa As Map
 
  Private mp As New MapPoint(41.9, 12.5)
 
  Private mp As New MapPoint(41.9, 12.5)
Riga 13: Riga 53:
 
    
 
    
 
    
 
    
  '''Public''' Sub _New()     
+
  Public Sub _New()     
 
    
 
    
 
   With mappa = New Map
 
   With mappa = New Map
     .AddTile("GoogleMaps", "https&#058;//khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "900"]).SubDomains = ["0", "1", "2"]  ' <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
+
     .AddTile("GoogleMaps", "https&#058;//khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "967"]).SubDomains = ["0", "1", "2"]  <FONT Color=gray>'</font><SUP>&#091;[[#Note|nota 1]]&#093;</sup>
 
     .Center = mp
 
     .Center = mp
 
     .Zoom = 15
 
     .Zoom = 15
Riga 23: Riga 63:
 
     .W = Desktop.W
 
     .W = Desktop.W
 
     .H = Desktop.H
 
     .H = Desktop.H
    .Arrangement = Arrange.Fill
 
 
     .Text = "Zoom: " & CStr(mappa.Zoom)
 
     .Text = "Zoom: " & CStr(mappa.Zoom)
 
   End With
 
   End With
 +
 
   With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
 
   With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
     .X = 0
+
     .Move(0, 0, Me.W, Me.H)
     .Y = 0
+
  End With
 +
 +
  With sld = New Slider(DrawingArea1) As "Slider1"
 +
    .Move(DrawingArea1.W * 0.05, DrawingArea1.H * 0.1, DrawingArea1.W * 0.02, DrawingArea1.H * 0.2)
 +
     .MinValue = 0
 +
    .MaxValue = mappa.MaxZoom
 +
    .Step = 1
 +
    .Value = mappa.Zoom
 
   End With
 
   End With
 
+
  '''End'''
+
  End
 
+
  '''Public''' Sub DrawingArea1_Draw()
+
 
+
  Public Sub DrawingArea1_Draw()
 +
 
   With mappa
 
   With mappa
 
     .Width = Paint.W
 
     .Width = Paint.W
 
     .Height = Paint.H
 
     .Height = Paint.H
    .Center = mp
 
 
     .Draw()
 
     .Draw()
 
   End With
 
   End With
 
+
   DrawingArea1.Refresh()
+
<FONT Color=gray>' ''L'uso del Metodo "Me.Refresh" consente alla "DrawingArea" di mostrare completamente la mappa:''</font>
 
+
   Me.Refresh()
  '''End'''
+
 
+
  End
  '''Public''' Sub DrawingArea1_MouseDown()   
+
 
+
 +
  Public Sub DrawingArea1_MouseDown()   
 +
 
   pt = Point(Mouse.X, Mouse.Y)
 
   pt = Point(Mouse.X, Mouse.Y)
 
+
 
   Me.Text = "Lat. " & Format(mappa.PixelToMapPointRel(pt).Lat, "0.000000") &  
 
   Me.Text = "Lat. " & Format(mappa.PixelToMapPointRel(pt).Lat, "0.000000") &  
 
             "  Lon. " & Format(mappa.PixelToMapPointRel(pt).Lon, "0.000000") &
 
             "  Lon. " & Format(mappa.PixelToMapPointRel(pt).Lon, "0.000000") &
 
             "  -  Zoom: " & CStr(mappa.Zoom)
 
             "  -  Zoom: " & CStr(mappa.Zoom)
 
+
 
   mx = pt.X   
 
   mx = pt.X   
 
   my = pt.Y
 
   my = pt.Y
 
   cpx = Geo.MapPointToPixel(mappa.Center, mappa.Zoom)
 
   cpx = Geo.MapPointToPixel(mappa.Center, mappa.Zoom)
 
+
 
  <FONT Color=gray>' ''Se si clicca sulla mappa con il tasto centrale, viene creato un file immagine della mappa corrente mostrata:''</font> ' <SUP>&#091;[[#Note|Nota 2]]&#093;</sup>
 
  <FONT Color=gray>' ''Se si clicca sulla mappa con il tasto centrale, viene creato un file immagine della mappa corrente mostrata:''</font> ' <SUP>&#091;[[#Note|Nota 2]]&#093;</sup>
 
   If Mouse.Middle Then
 
   If Mouse.Middle Then
Riga 68: Riga 117:
 
     im.Save("/tmp/immagine.png", 100)
 
     im.Save("/tmp/immagine.png", 100)
 
   Endif
 
   Endif
 
 
'''End'''
 
 
   
 
   
  '''Public''' Sub DrawingArea1_MouseMove()   
+
  End
 +
 +
 +
Public Sub DrawingArea1_MouseMove()   
 
    
 
    
 
   Dim pix As New Point(cpx.X, cpx.Y)
 
   Dim pix As New Point(cpx.X, cpx.Y)
Riga 82: Riga 132:
 
   mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon
 
   mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon
 
      
 
      
  '''End'''
+
  End
 +
 +
 +
Public Sub DrawingArea1_MouseWheel()
 +
 +
<FONT Color=gray>' ''Impedisce che si vada oltre il massimo livello di zoom della mappa:''</font>
 +
  If mappa.Zoom + Mouse.Delta > mappa.MaxZoom Then Return
 
   
 
   
'''Public''' Sub DrawingArea1_MouseWheel()
 
 
 
 
  <FONT Color=gray>' ''Pone al centro della mappa il punto ove si è ruotata la rotellina:''</font>  
 
  <FONT Color=gray>' ''Pone al centro della mappa il punto ove si è ruotata la rotellina:''</font>  
 
   pt = Point(Mouse.X, Mouse.Y)
 
   pt = Point(Mouse.X, Mouse.Y)
 
   mp.Lat = mappa.PixelToMapPointRel(pt).Lat
 
   mp.Lat = mappa.PixelToMapPointRel(pt).Lat
 
   mp.Lon = mappa.PixelToMapPointRel(pt).Lon
 
   mp.Lon = mappa.PixelToMapPointRel(pt).Lon
 
+
  <FONT Color=gray>' ''Valuta il verso della rotazione della rotellina:''</font>  
+
  <FONT Color=gray>' ''Valuta il verso della rotazione della rotellina e modifica lo zoom della mappa:''</font>  
   If Mouse.Delta > 0 Then  
+
   mappa.Zoom += Mouse.Delta
     mappa.Zoom += 1
+
  sld.Value = mappa.Zoom
   Else  
+
  Me.Text = "Zoom: " & CStr(mappa.Zoom)
     mappa.Zoom -= 1
+
   Endif
+
End
 +
 +
Public Sub Slider1_Change()
 +
 +
  mappa.Zoom = sld.Value
 +
  Me.Text = "Zoom: " & CStr(mappa.Zoom)
 +
 +
End
 +
 
 +
===Ottenere la Latitudine e la Longitudine di un punto sulla mappa durante lo spostamento del puntatore del mouse senza tenere premuto alcun tasto===
 +
Per ottenere la Latitudine e la Longitudine di un punto sulla mappa solo spostando semplicemente il puntatore del mouse <SPAN Style="text-decoration:underline">senza</span> tenere premuto alcun suo tasto, si deve porre a "True" la Proprietà ".Tracking" della "DrawingArea".
 +
 
 +
Mostriamo un esempio pratico:
 +
Private DrawingArea1 As DrawingArea
 +
Private mappa As Map
 +
Private mp As New MapPoint(41.9, 12.5)
 +
Private mx As Integer
 +
Private my As Integer
 +
Private pt As New Point
 +
Private cpx As New Point
 +
 +
 +
Public Sub _New()   
 +
 +
  With mappa = New Map
 +
    .AddTile("GoogleMap", "https&#058;//mt0.google.com/vt/lyrs=s&hl=&x={x}&y={y}&z={z}")
 +
    .Center = mp
 +
    .Zoom = 15
 +
  End With
 +
  With Me 
 +
    .W = Screen.AvailableWidth
 +
    .H = Screen.AvailableHeight
 +
    .Arrangement = Arrange.Fill
 +
    .Text = "Zoom: " & CStr(mappa.Zoom)
 +
  End With
 +
  With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
 +
<FONT Color=gray>' ''Imposta a "True" la Proprietà "Tracking" della "DrawingArea":''</font>
 +
  <FONT Color=#B22222>.Tracking = <B>True</b></font>
 +
End With
 +
 +
End
 +
 +
 +
Public Sub DrawingArea1_Draw()
 +
 +
  With mappa
 +
    .Width = Paint.W
 +
    .Height = Paint.H
 +
    .Draw()
 +
  End With
 +
 +
  Me.Refresh()
 +
 +
End
 +
 +
 +
Public Sub DrawingArea1_MouseMove() 
 +
 +
<FONT Color=gray>' ''Se si sta spostando il puntatore del mouse sulla mappa tenendo premuto su un suo tasto, allora si può spostare la mappa:''</font>
 +
  If Mouse.Left Or Mouse.Middle Or Mouse.Right Then
 +
     Dim pix As New Point(cpx.X, cpx.Y)
 +
      pix.X += mx - Mouse.X
 +
      pix.Y += my - Mouse.Y
 +
<FONT Color=gray>' ''Le seguenti righe di comando consentono uno spostamento morbido e uniforme della mappa per ciascun livello di zoom:''</font>
 +
      mappa.Center.Lat = Geo.PixelToMapPoint(pix, mappa.Zoom).Lat
 +
      mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon
 +
   Else
 +
<FONT Color=gray>' ''...se lo spostamento avviene "senza" tenere premuto un tasto del mouse, allora si vedrà soltanto i valori della Latitudine e della Longitudine in corrispondenza del puntatore del mouse:''</font>
 +
     pt = Point(Mouse.X, Mouse.Y)
 +
    Me.Text = "Lat. " & Format(mappa.PixelToMapPointRel(pt).Lat, "0.000000") &
 +
              "  Lon. " & Format(mappa.PixelToMapPointRel(pt).Lon, "0.000000") &
 +
              "  -  Zoom: " & CStr(mappa.Zoom)
 +
    mx = pt.X
 +
    my = pt.Y
 +
    cpx = Geo.MapPointToPixel(mappa.Center, mappa.Zoom)
 +
   Endif  
 +
 +
End
 +
 +
 +
Public Sub DrawingArea1_MouseWheel()
 +
 +
<FONT Color=gray>' ''Impedisce che si vada oltre il massimo livello di zoom della mappa:''</font>
 +
  If mappa.Zoom + Mouse.Delta > mappa.MaxZoom Then Return
 +
 +
<FONT Color=gray>' ''Pone al centro della mappa il punto ove si è ruotata la rotellina:''</font>
 +
  pt = Point(Mouse.X, Mouse.Y)
 +
  mp.Lat = mappa.PixelToMapPointRel(pt).Lat
 +
  mp.Lon = mappa.PixelToMapPointRel(pt).Lon
 +
 +
<FONT Color=gray>' ''Valuta il verso della rotazione della rotellina e modifica lo zoom della mappa:''</font>
 +
  mappa.Zoom += Mouse.Delta
 
   Me.Text = "Zoom: " & CStr(mappa.Zoom)
 
   Me.Text = "Zoom: " & CStr(mappa.Zoom)
 
+
  '''End'''
+
  End
  
  
 
==Uso di una ImageView==
 
==Uso di una ImageView==
 
Mostriamo un semplice codice con l'uso di una ''ImageView'' al posto di una ''MapView''.
 
Mostriamo un semplice codice con l'uso di una ''ImageView'' al posto di una ''MapView''.
 +
Private ImageView1 As ImageView
 
  Private mappa As Map
 
  Private mappa As Map
 
  Private mp As New MapPoint(41.9, 12.5)
 
  Private mp As New MapPoint(41.9, 12.5)
Riga 112: Riga 258:
 
   
 
   
 
   
 
   
  '''Public''' Sub _New()
+
  Public Sub _New()
 
    
 
    
 
   With mappa = New Map
 
   With mappa = New Map
     .AddTile("Opentopomap", "https&#058;//khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "900"]).SubDomains = ["0", "1", "2"]
+
     .AddTile("GoogleMaps", "https&#058;//khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "967"]).SubDomains = ["0", "1", "2"]
 
     .Center = mp
 
     .Center = mp
 
     .Zoom = 15
 
     .Zoom = 15
Riga 123: Riga 269:
 
     .H = Screen.AvailableHeight
 
     .H = Screen.AvailableHeight
 
     .Arrangement = Arrange.Fill
 
     .Arrangement = Arrange.Fill
     .Text = "Zoom: 15"
+
     .Text = "Zoom: " & CStr(mappa.Zoom)
 +
  End With
 +
  With ImageView1 = New ImageView(Me) As "ImageView1"
 +
    .X = 0
 +
    .Y = 0
 
   End With
 
   End With
 
    
 
    
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub ImageView1_Draw(View As Image)
+
  Public Sub ImageView1_Draw(View As Image)
 
    
 
    
 
   With mappa
 
   With mappa
 
     .Width = Paint.W
 
     .Width = Paint.W
 
     .Height = Paint.H
 
     .Height = Paint.H
    .Center = mp
 
 
     .Draw()
 
     .Draw()
 
   End With
 
   End With
 
    
 
    
   ImageView1.Refresh()
+
   Me.Refresh()  <FONT Color=gray>' ''o anche: '''ImageView1.Refresh()'''''</font>
 
    
 
    
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub ImageView1_MouseDown()   
+
  Public Sub ImageView1_MouseDown()   
 
   
 
   
 
   pt = Point(Mouse.X, Mouse.Y)
 
   pt = Point(Mouse.X, Mouse.Y)
Riga 164: Riga 315:
 
   Endif
 
   Endif
 
   
 
   
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub ImageView1_MouseMove()
+
  Public Sub ImageView1_MouseMove()
 
    
 
    
 
   Dim pix As New Point(cpx.X, cpx.Y)
 
   Dim pix As New Point(cpx.X, cpx.Y)
Riga 177: Riga 329:
 
   mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon
 
   mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon
 
    
 
    
  '''End'''
+
  End
 +
 +
 +
Public Sub ImageView1_MouseWheel()
 +
 +
<FONT Color=gray>' ''Impedisce che si vada oltre il massimo livello di zoom della mappa:''</font>
 +
  If mappa.Zoom + Mouse.Delta > mappa.MaxZoom Then Return
 
   
 
   
'''Public''' Sub ImageView1_MouseWheel()
 
 
 
 
   pt = Point(Mouse.X, Mouse.Y)
 
   pt = Point(Mouse.X, Mouse.Y)
 
   mp.Lat = mappa.PixelToMapPointRel(pt).Lat
 
   mp.Lat = mappa.PixelToMapPointRel(pt).Lat
 
   mp.Lon = mappa.PixelToMapPointRel(pt).Lon
 
   mp.Lon = mappa.PixelToMapPointRel(pt).Lon
 
   
 
   
   Select Case Mouse.Delta
+
<FONT Color=gray>' ''Valuta il verso della rotazione della rotellina e modifica lo zoom della mappa:''</font>
    Case 1
+
   mappa.Zoom += Mouse.Delta
      mappa.Zoom += 1
 
    Case -1
 
      mappa.Zoom -= 1
 
  End Select
 
 
 
 
   Me.Text = "Zoom: " & CStr(mappa.Zoom)
 
   Me.Text = "Zoom: " & CStr(mappa.Zoom)
 
+
  '''End'''
+
  End
 +
Ovviamente, per ottenere la Latitudine e la Longitudine di un punto sulla mappa durante lo spostamento del puntatore del mouse <SPAN Style="text-decoration:underline">senza</span> tenere premuto alcun suo tasto, si potrà adottare il medesimo codice mostrato con l'uso della "DrawingArea".
  
  
  
 
=Note=
 
=Note=
[1] Qualora la mappa non appaia, verificare la versione GoogleMap, ed eventualmente modificarla in questo punto: ["version": "900"].
+
[1] Qualora la mappa non appaia, verificare la versione GoogleMap, ed eventualmente modificarla in questo punto del codice: ["version": "967"].
<BR>Al riguardo vedere: [[Conoscere_la_versione_più_recente_di_Google_Maps_satellite|Conoscere la versione più recente di Google Maps satellite]]
+
<BR>Al riguardo vedere: [[Conoscere la versione più recente di Google Maps satellite]]
  
[2] Vedere anche: [[Ottenere_un%27Image_dalla_mappa_mostrata_da_una_MapView|Ottenere un'Image dalla mappa mostrata da una MapView]]
+
[2] Vedere anche: [[Ottenere un'Image dalla mappa mostrata da una MapView]]

Versione delle 08:31, 18 gen 2024

Per mostrare una mappa con il Componente gb.map, è possibile usare una DrawingArea o una ImageView anziché una MapView.

Uso di una DrawingArea

Mostriamo un semplice codice essenziale con l'uso di una DrawingArea al posto di una MapView.
Bisognerà ovviamente attivare il Componente gb.map .

Private DrawingArea1 As DrawingArea
Private mappa As Map

Public Sub _new()

 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
 End With

 DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"

 With mappa = New Map As "Mappa"
   .AddTile("topo", "https://a.tile.opentopomap.org/{z}/{x}/{y}.png")
   .Zoom = 15
   .Center = MapPoint(41.89018, 12.49230)
 End With

End


Public Sub DrawingArea1_Draw()

 With mappa
' Imposta la dimensione della mappa mostrata sulla "DrawingArea":
   .Width = DrawingArea1.W
   .Height = DrawingArea1.H
' Disegna quindi la mappa sulla "DrawingArea":
   .Draw()
 End With

' L'uso del Metodo "Me.Refresh" consente alla "DrawingArea" di mostrare completamente la mappa:
 Me.Refresh

End

Spostare la mappa e cambiare lo zoom

In quest'altro codice si consentirà di spostare la mappa, ossia di mostrare altre aree geografiche della mappa, e di cambiare lo zoom sia ruotando la rotellina del mouse che agendo su uno Slider:

Private DrawingArea1 As DrawingArea
Private sld As Slider
Private mappa As Map
Private mp As New MapPoint(41.9, 12.5)
Private mx As Integer
Private my As Integer
Private pt As New Point
Private cpx As New Point
 
 
Public Sub _New()    
 
 With mappa = New Map
   .AddTile("GoogleMaps", "https://khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "967"]).SubDomains = ["0", "1", "2"]   '[nota 1]
   .Center = mp
   .Zoom = 15
 End With
 With Me  
   .W = Desktop.W
   .H = Desktop.H
   .Text = "Zoom: " & CStr(mappa.Zoom)
 End With

 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
   .Move(0, 0, Me.W, Me.H)
 End With

 With sld = New Slider(DrawingArea1) As "Slider1"
   .Move(DrawingArea1.W * 0.05, DrawingArea1.H * 0.1, DrawingArea1.W * 0.02, DrawingArea1.H * 0.2)
   .MinValue = 0
   .MaxValue = mappa.MaxZoom
   .Step = 1
   .Value = mappa.Zoom
 End With

End


Public Sub DrawingArea1_Draw()

 With mappa
   .Width = Paint.W
   .Height = Paint.H
   .Draw()
 End With

' L'uso del Metodo "Me.Refresh" consente alla "DrawingArea" di mostrare completamente la mappa:
 Me.Refresh()

End


Public Sub DrawingArea1_MouseDown()  

 pt = Point(Mouse.X, Mouse.Y)

 Me.Text = "Lat. " & Format(mappa.PixelToMapPointRel(pt).Lat, "0.000000") & 
           "   Lon. " & Format(mappa.PixelToMapPointRel(pt).Lon, "0.000000") &
           "  -  Zoom: " & CStr(mappa.Zoom)

 mx = pt.X  
 my = pt.Y
 cpx = Geo.MapPointToPixel(mappa.Center, mappa.Zoom)

' Se si clicca sulla mappa con il tasto centrale, viene creato un file immagine della mappa corrente mostrata: ' [Nota 2]
 If Mouse.Middle Then
   Dim im As New Image(mappa.Width, mappa.Height, Color.Transparent, Image.Standard)
   With Paint
     .Begin(im)
     mappa.Draw()
     .End
   End With
   im.Save("/tmp/immagine.png", 100)
 Endif

End


Public Sub DrawingArea1_MouseMove()  
 
 Dim pix As New Point(cpx.X, cpx.Y)
 
 pix.X += mx - Mouse.X
 pix.Y += my - Mouse.Y
 
' Le seguenti righe di comando consentono uno spostamento morbido e uniforme della mappa per ciascun livello di zoom:
 mappa.Center.Lat = Geo.PixelToMapPoint(pix, mappa.Zoom).Lat
 mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon
   
End


Public Sub DrawingArea1_MouseWheel()

' Impedisce che si vada oltre il massimo livello di zoom della mappa:
 If mappa.Zoom + Mouse.Delta > mappa.MaxZoom Then Return 

' Pone al centro della mappa il punto ove si è ruotata la rotellina: 
 pt = Point(Mouse.X, Mouse.Y)
 mp.Lat = mappa.PixelToMapPointRel(pt).Lat
 mp.Lon = mappa.PixelToMapPointRel(pt).Lon

' Valuta il verso della rotazione della rotellina e modifica lo zoom della mappa: 
 mappa.Zoom += Mouse.Delta
 sld.Value = mappa.Zoom
 Me.Text = "Zoom: " & CStr(mappa.Zoom)

End

Public Sub Slider1_Change()

 mappa.Zoom = sld.Value
 Me.Text = "Zoom: " & CStr(mappa.Zoom)

End

Ottenere la Latitudine e la Longitudine di un punto sulla mappa durante lo spostamento del puntatore del mouse senza tenere premuto alcun tasto

Per ottenere la Latitudine e la Longitudine di un punto sulla mappa solo spostando semplicemente il puntatore del mouse senza tenere premuto alcun suo tasto, si deve porre a "True" la Proprietà ".Tracking" della "DrawingArea".

Mostriamo un esempio pratico:

Private DrawingArea1 As DrawingArea
Private mappa As Map
Private mp As New MapPoint(41.9, 12.5)
Private mx As Integer
Private my As Integer
Private pt As New Point
Private cpx As New Point


Public Sub _New()    

 With mappa = New Map
   .AddTile("GoogleMap", "https://mt0.google.com/vt/lyrs=s&hl=&x={x}&y={y}&z={z}")
   .Center = mp
   .Zoom = 15
 End With
 With Me  
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
   .Text = "Zoom: " & CStr(mappa.Zoom)
 End With
 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
' Imposta a "True" la Proprietà "Tracking" della "DrawingArea":
  .Tracking = True
End With

End


Public Sub DrawingArea1_Draw()

 With mappa
   .Width = Paint.W
   .Height = Paint.H
   .Draw()
 End With

 Me.Refresh()

End


Public Sub DrawingArea1_MouseMove()  

' Se si sta spostando il puntatore del mouse sulla mappa tenendo premuto su un suo tasto, allora si può spostare la mappa:
 If Mouse.Left Or Mouse.Middle Or Mouse.Right Then
   Dim pix As New Point(cpx.X, cpx.Y)
     pix.X += mx - Mouse.X
     pix.Y += my - Mouse.Y
' Le seguenti righe di comando consentono uno spostamento morbido e uniforme della mappa per ciascun livello di zoom:
     mappa.Center.Lat = Geo.PixelToMapPoint(pix, mappa.Zoom).Lat
     mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon
 Else
' ...se lo spostamento avviene "senza" tenere premuto un tasto del mouse, allora si vedrà soltanto i valori della Latitudine e della Longitudine in corrispondenza del puntatore del mouse:
   pt = Point(Mouse.X, Mouse.Y)
   Me.Text = "Lat. " & Format(mappa.PixelToMapPointRel(pt).Lat, "0.000000") & 
             "   Lon. " & Format(mappa.PixelToMapPointRel(pt).Lon, "0.000000") &
             "  -  Zoom: " & CStr(mappa.Zoom)
   mx = pt.X
   my = pt.Y
   cpx = Geo.MapPointToPixel(mappa.Center, mappa.Zoom)
 Endif 

End


Public Sub DrawingArea1_MouseWheel()

' Impedisce che si vada oltre il massimo livello di zoom della mappa:
 If mappa.Zoom + Mouse.Delta > mappa.MaxZoom Then Return 

' Pone al centro della mappa il punto ove si è ruotata la rotellina:
 pt = Point(Mouse.X, Mouse.Y)
 mp.Lat = mappa.PixelToMapPointRel(pt).Lat
 mp.Lon = mappa.PixelToMapPointRel(pt).Lon

' Valuta il verso della rotazione della rotellina e modifica lo zoom della mappa:
 mappa.Zoom += Mouse.Delta
 Me.Text = "Zoom: " & CStr(mappa.Zoom)

End


Uso di una ImageView

Mostriamo un semplice codice con l'uso di una ImageView al posto di una MapView.

Private ImageView1 As ImageView
Private mappa As Map
Private mp As New MapPoint(41.9, 12.5)
Private mx As Integer
Private my As Integer
Private pt As New Point
Private cpx As New Point


Public Sub _New()
 
 With mappa = New Map
   .AddTile("GoogleMaps", "https://khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "967"]).SubDomains = ["0", "1", "2"]
   .Center = mp
   .Zoom = 15
 End With
 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
   .Text = "Zoom: " & CStr(mappa.Zoom)
 End With
 With ImageView1 = New ImageView(Me) As "ImageView1"
   .X = 0
   .Y = 0
 End With
 
End


Public Sub ImageView1_Draw(View As Image)
 
 With mappa
   .Width = Paint.W
   .Height = Paint.H
   .Draw()
 End With
 
 Me.Refresh()   ' o anche: ImageView1.Refresh()
  
End


Public Sub ImageView1_MouseDown()  

 pt = Point(Mouse.X, Mouse.Y)

 Me.Text = "Lat. " & Format(mappa.PixelToMapPointRel(pt).Lat, "0.000000") & 
           "   Lon. " & Format(mappa.PixelToMapPointRel(pt).Lon, "0.000000") &
           "  -  Zoom: " & CStr(mappa.Zoom)

 mx = Mouse.X
 my = Mouse.Y
 cpx = Geo.MapPointToPixel(mappa.Center, mappa.Zoom)
 
' Se si clicca sulla mappa con il tasto centrale, viene creato un file immagine della mappa corrente mostrata:
 If Mouse.Middle Then
   Dim im As New Image(mappa.Width, mappa.Height, Color.Transparent, Image.Standard)
   With Paint
     .Begin(im)
     mappa.Draw()
     .End
   End With
   im.Save("/tmp/immagine.png", 100)
 Endif

End


Public Sub ImageView1_MouseMove()
 
 Dim pix As New Point(cpx.X, cpx.Y)
 
 pix.X += mx - Mouse.X
 pix.Y += my - Mouse.Y
 
' Le seguenti righe di comando consentono uno spostamento morbido e uniforme della mappa per ciascun livello di zoom:
 mappa.Center.Lat = Geo.PixelToMapPoint(pix, mappa.Zoom).Lat
 mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon
 
End


Public Sub ImageView1_MouseWheel()

' Impedisce che si vada oltre il massimo livello di zoom della mappa:
 If mappa.Zoom + Mouse.Delta > mappa.MaxZoom Then Return 

 pt = Point(Mouse.X, Mouse.Y)
 mp.Lat = mappa.PixelToMapPointRel(pt).Lat
 mp.Lon = mappa.PixelToMapPointRel(pt).Lon

' Valuta il verso della rotazione della rotellina e modifica lo zoom della mappa: 
 mappa.Zoom += Mouse.Delta
 Me.Text = "Zoom: " & CStr(mappa.Zoom)

End

Ovviamente, per ottenere la Latitudine e la Longitudine di un punto sulla mappa durante lo spostamento del puntatore del mouse senza tenere premuto alcun suo tasto, si potrà adottare il medesimo codice mostrato con l'uso della "DrawingArea".


Note

[1] Qualora la mappa non appaia, verificare la versione GoogleMap, ed eventualmente modificarla in questo punto del codice: ["version": "967"].
Al riguardo vedere: Conoscere la versione più recente di Google Maps satellite

[2] Vedere anche: Ottenere un'Image dalla mappa mostrata da una MapView