Differenze tra le versioni di "Utilizzando un Oggetto di visualizzazione diverso da una MapView consentire uno spostamento morbido e uniforme della mappa"

Da Gambas-it.org - Wikipedia.
 
(Una versione intermedia di uno stesso utente non è mostrata)
Riga 29: Riga 29:
 
   
 
   
 
  <FONT Color=darkgreen>' ''Le seguenti righe di comando consentono uno spostamento morbido e uniforme della mappa per ciascun livello di zoom:''</font>
 
  <FONT Color=darkgreen>' ''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
+
   <FONT Color=#B22222>mappa.Center.Lat = Geo.PixelToMapPoint(pix, mappa.Zoom).Lat
   mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon
+
  mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon</font>
 +
 +
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&#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
 +
 +
 +
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
 +
 +
<FONT Color=darkgreen>' ''Le seguenti righe di comando consentono uno spostamento morbido e uniforme della mappa per ciascun livello di zoom:''</font>
 +
  <FONT Color=#B22222>mappa.Center.Lat = Geo.PixelToMapPoint(pix, mappa.Zoom).Lat
 +
   mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon</font>
 
   
 
   
 
  End
 
  End

Versione attuale delle 08:10, 9 giu 2024

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