Utilizzando un Oggetto di visualizzazione diverso da una MapView consentire uno spostamento morbido e uniforme della mappa

Da Gambas-it.org - Wikipedia.

Utilizzando un Oggetto di visualizzazione diverso da una MapView (ad esempio una DrawingArea oppure una ImageView)l lo spostamento della mappa mediante il puntatore del mouse non avviene in modo omogeneo e coerente con il mouse.

Per consentire dunque lo spostamento morbido, coerente e uniforme della mappa con il movimento del puntatore del mouse, bisogna in particolare utilizzare alcune risorse della Classe statica "Geo" del Componente "gb.map".

Mostriamo gli elementi essenziali e necessari del codice per ottenere quel risultato, usando ad esempio una DrawingArea:

Private mappa As Map
Private mx As Integer
Private my As Integer
Private pt As New Point
Private cpx As New Point

Public Sub DrawingArea1_MouseDown()  

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

 mx = pt.X  
 my = pt.Y

 cpx = Geo.MapPointToPixel(mappa.Center, mappa.Zoom)

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

Un esempio completo

Mostriamo di seguito un esempio completo:

Private DrawingArea1 As DrawingArea
Private mappa As Map
Private mx As Integer
Private my As Integer
Private pt As New Point
Private cpx As New Point


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


Public Sub DrawingArea1_MouseDown()  

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

 mx = pt.X  
 my = pt.Y

 cpx = Geo.MapPointToPixel(mappa.Center, mappa.Zoom)

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