Utilizzare una DrawingArea o una ImageView con gb.map anziché una MapView
Da Gambas-it.org - Wikipedia.
Versione del 9 lug 2021 alle 15:30 di Vuott (Discussione | contributi)
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": "904"]).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() ' 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: If Mouse.Delta > 0 Then mappa.Zoom += 1 Else mappa.Zoom -= 1 Endif 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": "904"]).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() pt = Point(Mouse.X, Mouse.Y) mp.Lat = mappa.PixelToMapPointRel(pt).Lat mp.Lon = mappa.PixelToMapPointRel(pt).Lon Select Case Mouse.Delta Case 1 mappa.Zoom += 1 Case -1 mappa.Zoom -= 1 End Select 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