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

Da Gambas-it.org - Wikipedia.
Riga 85: Riga 85:
 
   
 
   
 
  '''Public''' Sub DrawingArea1_MouseWheel()
 
  '''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>  
 
  <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 e modifica lo zoom della mappa:''</font>  
 
  <FONT Color=gray>' ''Valuta il verso della rotazione della rotellina e modifica lo zoom della mappa:''</font>  
 
   mappa.Zoom += Mouse.Delta
 
   mappa.Zoom += Mouse.Delta
 
   Me.Text = "Zoom: " & CStr(mappa.Zoom)
 
   Me.Text = "Zoom: " & CStr(mappa.Zoom)
 
+
 
  '''End'''
 
  '''End'''
  
Riga 181: Riga 184:
 
   
 
   
 
  '''Public''' Sub ImageView1_MouseWheel()
 
  '''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
 
   
 
   
 
   pt = Point(Mouse.X, Mouse.Y)
 
   pt = Point(Mouse.X, Mouse.Y)

Versione delle 23:15, 20 dic 2021

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 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
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": "908"]).SubDomains = ["0", "1", "2"]   '[Nota 1]
   .Center = mp
   .Zoom = 15
 End With
 With Me  
   .W = Desktop.W
   .H = Desktop.H
   .Arrangement = Arrange.Fill
   .Text = "Zoom: " & CStr(mappa.Zoom)
 End With
 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
   .X = 0
   .Y = 0
 End With
 
End
  
Public Sub DrawingArea1_Draw()
 
 With mappa
   .Width = Paint.W
   .Height = Paint.H
   .Center = mp
   .Draw()
 End With
 
 DrawingArea1.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
 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": "908"]).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
   .Center = mp
   .Draw()
 End With
 
 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


Note

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

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