Questo esempio può aiutarti in qualche modo ? :-\
Private hMap as New Map
Public Sub _New()
With hMap.AddTile("OpenStreet", "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png")
.Copyright = "OpenStreetMap contributors"
End With
End
Public Sub DrawingArea1_Draw()
hMap.Width = Draw.Width
hMap.Height = Draw.Height
hMap.Draw()
End
...un'alternativa (solo che viene individuata solo una piccola parte della mappa) potrebbe essere questa:
1) usare l'oggetto WebView, attivando il componente gb.qt4.webkit, anziché usare le risorse del componente gb.map;
2) per vedere un settore, inserire l'indirizzo con le coordinate usando la proprietà .Url .
Ad esempio:
WebView1.Url = "http://a.tile.openstreetmap.org/14/8908/6068.png"
3) Il contenuto mostrato dall'oggetto WebView è agevolmente trasformabile in una immagine:
http://www.gambas-it.org/wiki/index.php?title=Trasformare_il_contenuto_visibile_dell%27oggetto_WebView_in_una_immagine
4) va da sé, che una volta ottenuta un'immagine, essa potrà essere:
* manipolata con le risorse della Classe Paint o Draw: http://www.gambas-it.org/wiki/index.php?title=Disegnare_un_cerchio_con_le_Classi_%22Draw%22_e_%22Paint%22
quindi successivamente caricata e mostrata in una PictureBox;
* oppure caricata in una DrawingArea e qui manipolata per disegnare i cerchi sempre utilizzando le risorse della Classe Paint o Draw .
:-\
...non mi funziona, cioè non mi carica la cartina: la DrawArea rimane vuota
Bisogna porre un Refresh:
Private hMap as New Map
Public Sub _New()
With hMap.AddTile("OpenStreet", "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png")
.Copyright = "OpenStreetMap contributors"
End With
End
Public Sub DrawingArea1_Draw()
hMap.Width = Draw.Width
hMap.Height = Draw.Height
hMap.Draw()
DrawingArea1.Refresh()
End
Non so, utilizzando il componente gb.map, come si possa "estrarre" la mappa da far mostrare poi nella "DrawingArea".
Una possibilità alternativa si può provare utilizzando l'oggetto WebView. Da quel che si può constatare, osservando il codice HTML di una pagina che mostra una mappa di OpenStreet, tale mappa è formata da più immagini che rappresentano una porzione di territorio (mostrata appunto nella mappa).
Pertanto, si potrebbe pensare di scaricare le immagini che mostrano la porzione di territorio mostrata, che ci interessa, e di ricomporle - come fosse un puzzle - in un'unica immagine.
Mostro un esempio pratico di quanto proposto.
E' necessario:
* attivare i seguenti componenti: gb.qt4.webkit, gb.net e gb.net.curl;
* porre sul Form i seguenti oggetti: un WebView, due Button .
Un possibile codice sarebbe il seguente:
Private im As Image
Private myhttp As New HttpClient As "myhttp"
Private stringa As String
Private ind As New String[]
Private n As Byte
Private we As WebElement
Public Sub Form_Open()
Button1.Text = "Estrai\nimmagini"
Button1.Enabled = False
Button2.Text = "Cancella immagini\nscaricate"
Button2.Enabled = False
im = New Image(WebView1.W, WebView1.H)
WebView1.Url = "http://www.openstreetmap.org/#map=5/41.656/14.150"
End
Public Sub WebView1_Load()
Print "Per avviare la procedura di estrazione delle immagini,\ncliccare sulla mappa.\n"
End
Public Sub WebView1_MouseUp()
Dim wf As New WebFrame
n = 0
ind.Clear()
wf = WebView1.Frame
we = wf.Document
Print WebView1.Frame.Url
Print "\nPremere sul tasto "; Quote("Estrai immagini"); "."
Button1.Enabled = True
End
Public Sub Button1_Click()
Dim i1, i2 As Integer
Dim s2 As String
Dim s As String = we.HTML
While True
i1 = InStr(s, ".tile.openstreetmap.org/")
If i1 < 10 Then Break
s2 = Mid(s, i1 - 8, 64)
i2 = InStr(s2, "\"><")
ind.Add(Replace(Left(s2, i2 - 1), "\"", Null))
ind.Sort()
s = Mid(s, i1 + i2, RInStr(s, ".png"))
Wend
Print "\nLa mappa è costituita da num. "; ind.Count; " immagini.\n"
Scarica()
End
Private Procedure Scarica()
If ind.Count = 0 Then Return
Print ind[n], n + 1
' Invia_richiesta al server per scaricare il file immagine:
myhttp.URL = ind[n]
myhttp.Timeout = 15
myhttp.Get()
End
Public Sub myhttp_Read()
Dim sBuf As String
' Andiamo a leggere il flusso di dati del file immagine:
If Lof(MyHTTP) Then
Read #MyHTTP, sBuf, Lof(MyHTTP)
stringa = stringa & sBuf
End If
End
Public Sub MyHTTP_Finished()
Print "Immagine scaricata !"
Wait
MyHTTP.Close
' Ricreiamo il file in una cartella:
File.Save("/tmp" &/ Replace(Right(ind[n], 13), "/", "_"), stringa)
stringa = Null
If n = ind.Max Then
n = 0
ind.Clear()
Button2.Enabled = True
Else
Inc n
Scarica()
Endif
End
Public Sub Button2_Click() ' Consente di cancellare dalla cartella le immagini che sono state scaricate
Dim s As String
For Each s In Dir("/tmp", "*.png", gb.File)
Kill "/tmp" &/ s
Next
End
:rolleyes:
Tale codice dovrebbe aiutarti :-X a scaricare le immagini che compongono la mappa che stai osservando nell'oggetto WebView. Dovrai, come già detto, con successivo codice rigenerare in un'unica immagine la mappa completa mediante le immagini scaricate. Dopo di che potrai agevolmente con le Classi Paint o Draw disegnare i cerchi sulla immagine che ricrea la mappa.
:ciao:
Ho guardato un po' in giro e ho trovato anche questo:
' Gambas class file
Public Sub _new()
MapView1.Map.AddTile("OpenStreet", "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png")
MapView1.Map!OpenStreet.Copyright = "© OpenStreetMap contributors"
' MapView1.Map.AddTile("GoogleMap", "https://khms{s}.google.fr/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "141"], "gm").SubDomains = ["0", "1", "2"]
MapView1.Map.AddShape("MyShape")
MapView1.Map!MyShape.AddPoint("cognac", MapPoint(45.678, 9.120))
MapView1.Map.Center = MapView1.Map!MyShape!cognac.Points
MapView1.Map.Zoom = 12
MapView1.Map!MyShape.AddPolygon("FARO", [[MapPoint(45.689, 9.14), MapPoint(45.671, 9.12), MapPoint(45.690, 9.11)]])
MapView1.Map.Refresh
End
Public Sub Form_Open()
End
... non è farina del mio sacco, e in fatti, ci sono cose che non capisco :D
Continuo la ricerca anche se penso che la tua proposta, Vuott, sia forse la più adatta
:ciao: :ciao:
Ho trovato invece questa:
Sì, ho visto. Però qui lavori con GoogleMap !
Funziona anche con Gambas. Devi attivare il solito componente gb.qt4.webkit e porre sul From l'oggetto WebView.
Poi crei nella parte a sinistra del progetto, ossia in Dati, un foglio HTML, che per esempio chiamerai h.html, all'interno del quale poni quel codice che hai trovato (ho fatto qualche piccola variazione):
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<meta charset="utf-8">
<title>Circles</title>
<style>
html, body, #map-canvas {
height: 100%;
margin: 0px;
padding: 0px
}
</style>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true"></script>
<script>
// Questo esempio disegna dei cerchi sulla mappa che rappresentano la popolazione di tre capitali europee.
// First, create an object containing LatLng and population for each city.
var citymap = {};
citymap['Roma'] = {
center: new google.maps.LatLng(42.53, 12.28),
population: 2872086
};
citymap['Atene'] = {
center: new google.maps.LatLng(38.1, 23.9),
population: 655780
};
citymap['Madrid'] = {
center: new google.maps.LatLng(40.26, -3.41),
population: 3165235
};
var cityCircle;
function initialize() {
// Create the map.
var mapOptions = {
zoom: 5,
center: new google.maps.LatLng(40.09024, 9.123),
mapTypeId: google.maps.MapTypeId.TERRAIN
};
var map = new google.maps.Map(document.getElementById('map-canvas'),
mapOptions);
// Construct the circle for each value in citymap.
// Note: We scale the area of the circle based on the population.
for (var city in citymap) {
var populationOptions = {
strokeColor: '#FF0000',
strokeOpacity: 0.8,
strokeWeight: 2,
fillColor: '#FF0000',
fillOpacity: 0.35,
map: map,
center: citymap[city].center,
radius: Math.sqrt(citymap[city].population) * 100
};
// Add the circle for this city to the map.
cityCircle = new google.maps.Circle(populationOptions);
}
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>
<body>
<div id="map-canvas"></div>
</body>
</html>
Quindi nella classe principale del tuo progetto Gambas porrai questo semplice comando:
Public Sub Form_Open()
WebView1.Url = "h.html"
End
Vedendo quel codice HTML+Javascript, io credo che - per utilizzare in modo simile openstreetmap - si debba verificare :-\ se openstreetmap possiede delle funzioni analoghe a quelle di GoogleMap.
Ad esempio come questa: google.maps.Circle()
Ancora usando openstreetmap, ecco il codice essenziale per far apparire un popup in un dato posto.
Ci si serve di risorse create da Leaflet.
E' necessario - come descritto sopra - utilizzare un foglio autonomo html da richiamare nella Classe principale di Gambas.
<!DOCTYPE html>
<html>
<head>
<title>Crea un pop-up sulla mappa</title>
<meta charset="utf-8" />
<!-- Leaflet -->
<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css" />
<script src="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script>
<script>
MB_URL = 'http://{s}.tiles.mapbox.com/v3/{id}/{z}/{x}/{y}.png';
OSM_ATTRIB = '© <a href="http://openstreetmap.org/copyright">OpenStreetMap</a> contributors';
</script>
</head>
<body>
<div id="map" class="map" style="height: 300px"></div>
<pre><code>// crea una mappa nel div "map", imposta la visuale a un dato luogo e zoom
var map = L.map('map').setView([51.505, -0.09], 13);
// aggiunge OpenStreetMap tile layer
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
// aggiunge un marker in una data posizione, inserisce del contenuto al popup ed apre il popup
L.marker([51.5, -0.09]).addTo(map)
.bindPopup('Questo è un popup CSS3. <br> Facilmente adattabile.')
.openPopup();
</code></pre>
<script>
var osmUrl = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
osmAttrib = '© <a href="http://openstreetmap.org/copyright">OpenStreetMap</a> contributors',
osm = L.tileLayer(osmUrl, {maxZoom: 20, attribution: osmAttrib});
var map = L.map('map').setView([1, 1], 16).addLayer(osm);
L.marker([42.225, 15.747])
.addTo(map)
.bindPopup('Questo è un popup CSS3.<br />Facilmente adattabile.')
.openPopup();
</script>
</body>
</html>
Ho guardato un po' in giro e ho trovato anche questo:
Dunque, sulla base del codice da te trovato e di quello esemplificativo della guida on line, sono riuscito a mostrare la mappa su una DrawingArea.
Ho effettuato qualche modifica e qualche aggiunta tenendo conto delle risorse della Classe Map.
Private hMap As New Map
Public Sub _new()
hMap.AddTile("OpenStreet", "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png")
hMap!OpenStreet.Copyright = "© OpenStreetMap contributors"
hMap.AddShape("MyShape")
hMap!MyShape.AddPoint("cognac", MapPoint(45.678, 9.120))
hMap.Center = hMap!MyShape!cognac.Points
hMap.Zoom = 12
' Crea un poligono (in questo caso un quadrilatero)
hMap!MyShape.AddPolygon("FARO", [[MapPoint(45.687, 9.13), MapPoint(45.671, 9.13), MapPoint(45.671, 9.11), MapPoint(45.687, 9.11)]])
' Aggiungendo 4 metodi "MapPoint", si crea ovviamente un ottagono:
'' hMap!MyShape.AddPolygon("FARO", [[MapPoint(45.687, 9.11), MapPoint(45.690, 9.120), MapPoint(45.687, 9.13), MapPoint(45.678, 9.134), MapPoint(45.671, 9.13), MapPoint(45.668, 9.120), MapPoint(45.671, 9.11), MapPoint(45.678, 9.106)]])
' Aggiunge un'immagine:
hMap!MyShape.Image = Image.Load("/usr/share/icons/hicolor/32x32/apps/vlc.png")
' Colora il poligono
hMap!MyShape.Color = &0090FF
hMap.Refresh
End
Public Sub Form_Open()
End
Public Sub DrawingArea1_Draw()
hMap.Width = Draw.Width
hMap.Height = Draw.Height
hMap.Draw()
DrawingArea1.Refresh()
End
Se dunque ora vuoi disegnare un cerchio colorato di rosso semitrasparente sulla DrawingArea, puoi fare così:
Public Sub DrawingArea1_Draw()
hMap.Width = Draw.Width
hMap.Height = Draw.Height
hMap.Draw()
DrawingArea1.Refresh()
With Paint
.Begin(DrawingArea1)
.Brush = Paint.Color(&AAFF0000)
.Ellipse(100, 200, 100, 100)
.Fill
.End
End With
End
... ma con gb.gui, non dovrebbe impiegare gtk o qt a seconda del tipo di desktop environment impiegato dalla distribuzione?
Forse a te viene impostata la libreria gtk. :-\
scusa, forse sono andato in tilt :rolleyes:
ma per acquisire le coordinate non devo usare una MapView?
Public Sub MapView1_MouseDown()
Dim po As New Point
po.X = Mouse.X
po.Y = Mouse.Y
With MapView1.Map.PixelToMapPointRel(po)
Print " "; .Lat, Null; .Lon
End With
End
Nella DrawArea non riesco a "girare" il mondo ... o sbaglio?
Tu cerchi una cosa tipo questa ? :-X
Private hMap As New Map
Private x As Short
Private y As Short
Public Sub _New()
With hMap.AddTile("OpenStreet", "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png")
.Copyright = "OpenStreetMap contributors"
End With
End
Public Sub Form_Open()
With Me
.W = 700
.H = 650
.Center
End With
With ValueBox1
.X = Me.W - 64
.Y = 30
End With
With Slider1
.X = Me.W - 60
.Y = ValueBox1.Y + ValueBox1.H + 10
.Value = 3
.MaxValue = 18
.MinValue = 1
End With
hMap.Zoom = Slider1.Value
With DrawingArea1
.W = 600
.H = 600
End With
With hMap
.Center.Lat = 41
.Center.Lon = 13
End With
DrawingArea1.Refresh()
End
Public Sub DrawingArea1_Draw()
With hMap
.Width = Draw.Width
.Height = Draw.Height
.Draw()
End With
DrawingArea1.Refresh()
End
Public Sub Slider1_Change()
hMap.Zoom = Slider1.Value
ValueBox1.Value = Slider1.Value
hMap.Refresh
End
Public Sub DrawingArea1_MouseMove()
With hMap
.Center.Lat = .Center.Lat - ((y - Mouse.Y) / (10 ^ Round(Slider1.Value / 3.3)))
.Center.Lon = .Center.Lon + ((x - Mouse.X) / (10 ^ Round(Slider1.Value / 3.3)))
End With
x = Mouse.X
y = Mouse.Y
DrawingArea1.Refresh()
End
Public Sub DrawingArea1_MouseDown()
x = Mouse.X
y = Mouse.Y
End
:rolleyes:
Dunque... ringrazio innanzitutto Gianluigi per aver re-inserito la mia richiesta di chiarimenti nella M.L. internazionale (dato che io ho problemi con il mio provider di posta elettronica).
Abbiamo avuto la risposta al riguardo da Fabien Bodard (l'autore del Componente gb.map), che può essere letta qui:
https://www.mail-archive.com/gambas-user@lists.sourceforge.net/msg38016.html
Ho provato quel codice, e devo dire che, in vero, anche io - come ho detto nel precedente mio messaggio - avevo scritto un codice analogo, ma mi dava un errore "Not an array" in basso a destra dell'IDE (Stato dello stack).
Tale problema lo riscontro anche con il codice di Fabien Bodard.
Vi chiedo di provare anche voi il codice di Bodard che è il seguente:
Public Sub Form_Open()
Dim hPolyLine As New MapPoint[]
MapView1.Map.AddTile("GoogleMap", "https://khms{s}.google.fr/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "702"]).SubDomains = ["0", "1", "2"]
MapView1.Map["GoogleMap"].Visible = True
With MapView1.Map.AddShape("Poly")
hPolyLine = [MapPoint(48.457454, -4.638139), MapPoint(51.123363, 2.217329), MapPoint(48.921609, 8.106001),
MapPoint(43.833550, 7.666547), MapPoint(42.487303, 3.008345), MapPoint(43.324192, -1.825640)]
.AddPolyLine("Section 1", hPolyLine)
End With
End
Ditemi se riscontrate anche voi quel errore.
.... ma che era necessario capire come realizzarla!
....innanzitutto implementando un metodo del tipo:
.AddShape(".....").AddPolyPoint("....", polypoint As Point[ ])
ed aggiungendo un po' di matematica, come nel seguente esempio, ove ad oggi è possibile usare solo il metodo .AddPolyLine( ):
Public Sub Form_Open()
Dim x_a, y_o, r, an As Short
Dim po As New Point
Dim mp As New MapPoint
Dim mmpp As New MapPoint[]
MapView1.Map.AddTile("GoogleMap", "https://khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "702"]).SubDomains = ["0", "1", "2"]
MapView1.Map["GoogleMap"].Visible = True
' Imposta il centro del cerchio: '
mp.Lat = 41.8902142
mp.Lon = 12.4900422
po = MapView1.Map.MapPointToPixelRel(mp)
x_a = po.X ' Rappresenta la distanza X dal punto 0 (angolo in alto a sinistra)'
y_o = po.y ' Rappresenta la distanza Y dal punto 0 (angolo in alto a sinistra)'
r = 11 ' Rappresenta la dimensione del raggio del cerchio
' Descrive il cerchio:
For an = 0 To 360 ' Rappresenta l'angolo della circonferenza
po.X = x_a + r * Cos(Rad(an))
po.Y = y_o + r * Sin(Rad(an))
mp = MapView1.Map.PixelToMapPointRel(po)
mmpp.Push(mp)
MapView1.Map.AddShape("italia").AddPolyLine("italia", mmpp)
Next
End