Gambas-it

Gambas3 => Programmazione => Topic aperto da: kicco - 04 Marzo 2015, 20:54:49

Titolo: [Risolto] Come disegnare cerchi su una mapview?
Inserito da: kicco - 04 Marzo 2015, 20:54:49
 :ciao:
Come da titolo.
Sono partito in quinta, ma mi sono accorto che una MapView non si può disegnare usando le classi Draw o Paint.
 :'(
Come posso fare?
Devo portare la cartina in una DrawArea?
 :)
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 04 Marzo 2015, 22:26:27
Questo esempio può aiutarti in qualche modo ?   :-\
Codice: gambas [Seleziona]
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
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: kicco - 05 Marzo 2015, 13:06:23
Grazie Vuott
Questo esempio l'avevo già provato, ma non mi funziona, cioè non mi carica la cartina: la DrawArea rimane vuota :-\
 :hard:
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 05 Marzo 2015, 18:19:24
...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:
Codice: gambas [Seleziona]
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 .

           :-\
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 06 Marzo 2015, 00:35:34
...non mi funziona, cioè non mi carica la cartina: la DrawArea rimane vuota


Bisogna porre un Refresh:
Codice: gambas [Seleziona]
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
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 06 Marzo 2015, 20:02:20
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:
Codice: gambas [Seleziona]
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.
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: kicco - 08 Marzo 2015, 21:26:05
 :ciao:
scusa se non mi sono fatto vivo, ma solo aggi riesco ad accendere il computer dopo una dura influenza.
Grazie per il materiale che sicuramente guarderò nei prossimi giorni, ho già visto che ci sono diversi spunti su cui posso fare ipotesi!
 :ciao: :ciao:
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: kicco - 10 Marzo 2015, 22:38:05
 :ciao:
Ho guardato un po' in giro e ho trovato anche questo:
Codice: gambas [Seleziona]
' 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:
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 11 Marzo 2015, 01:10:53
Con questa:
MapView1.Map!MyShape.AddPolygon("FARO", [[MapPoint(45.689, 9.14), MapPoint(45.671, 9.12), MapPoint(45.690, 9.11)]])
ti puoi realizzare un poligono sulla mappa impostando tre o più coordinate.
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: kicco - 11 Marzo 2015, 14:13:39
Citazione
ti puoi realizzare un poligono sulla mappa impostando tre o più coordinate.
..sì, è quello che ho fatto nell'esempio sopra, ma pensare di impiegare le coordinate geografiche di un punto per generare un cerchio, ad esempio di 200m intorno al punto stesso, diventa non tanto banale, ma magari è la strada giusta... chissà?
Certo, peccato che il primo esempio che hai postato, non funzioni, altrimenti il gioco sarebbe stato fatto!
La tua proposta di scaricare le immagini e di caricarle in una DrawArea potrebbe essere la soluzione.
Adesso sto ancora valutando se rimanere legato alla mappa mondiale, diciamo rimanere "georeferenziato", ONLINE, oppure estrarre la parte di cartina e lavorare, diciamo, OFFLINE.
In realtà devo ancora capire a che "gioco" giocare :)

Quello che meno capisco del programma sopra, quello che hai citato
Citazione
MapView1.Map!MyShape.AddPolygon("FARO", [[MapPoint(45.689, 9.14), MapPoint(45.671, 9.12), MapPoint(45.690, 9.11)]])
è l'uso del ! punto esclamativo...
 :ciao:
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 11 Marzo 2015, 17:12:08
...peccato che il primo esempio che hai postato, non funzioni....


Come ho già scritto qui sopra:
http://www.gambas-it.org/smf/index.php?topic=3946.msg35171#msg35171
è sufficiente porre un
Codice: gambas [Seleziona]
DrawingArea1.Refresh()

Inoltre basta porre escusivamente la DrawingArea, senza utilizzare l'oggetto MapView .
E' possibile vedere in questo modo la mappa dell'intero mondo:
"http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
Se vengono impostate le coordinate specifiche di un'area particolare, però non funziona più.    :-\
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: kicco - 11 Marzo 2015, 17:50:58
scusa Vuott, ma a me non funziona anche mettendo il refresh :-\ ..purtroppo!

...a meno che non stia sbagliando qualcosa!
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 11 Marzo 2015, 20:45:27
.....il tuo Gambas è aggiornato ?    :-\
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: kicco - 12 Marzo 2015, 09:19:23
Citazione
... il tuo Gambas è aggiornato?
3.6.2

Ho trovato invece questa:
https://developers.google.com/maps/documentation/javascript/examples/circle-simple (https://developers.google.com/maps/documentation/javascript/examples/circle-simple)
 :)
 :ciao:
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 13 Marzo 2015, 01:32:32
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):
Codice: [Seleziona]
<!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:
Codice: gambas [Seleziona]
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()
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 13 Marzo 2015, 11:23:56
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.

Codice: [Seleziona]
<!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 = '&copy; <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: '&amp;copy; &lt;a href="http://osm.org/copyright"&gt;OpenStreetMap&lt;/a&gt; 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. &lt;br&gt; Facilmente adattabile.')
  .openPopup();
</code></pre>


<script>
  var osmUrl = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
    osmAttrib = '&copy; <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>
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 13 Marzo 2015, 13:27:17
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.

Codice: gambas [Seleziona]
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
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: kicco - 13 Marzo 2015, 14:29:06
L'HTML lo provo con calma, invece l'esempio qua sopra, l'ho provato ma non mi funziona!
Cioè: vedo l'area rettangolare che hai disegnato e anche l'icona, ma non mi carica le mappe.
Mi sto scervellando per capire come mai non riesce a trasferire le mappe nella DrawingArea!
Io ho attivato gb.map solamente perchè credo che non serva altro giusto?
Se la stessa operazione la faccio nella MapView anzichè in Map allora funziona!
 :rolleyes:
 :ciao:
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 13 Marzo 2015, 14:37:02
Quello che meno capisco del programma sopra, quello che hai citato
Citazione
MapView1.Map!MyShape.AddPolygon("FARO", [[MapPoint(45.689, 9.14), MapPoint(45.671, 9.12), MapPoint(45.690, 9.11)]])
è l'uso del ! punto esclamativo...


Hai già posto questa domanda su altra questione, e ti fu risposto da Pigavbg:
http://www.gambas-it.org/smf/index.php?topic=2614.0

C'è un riferimento anche qui:
http://www.gambas-it.org/smf/index.php?topic=1600.msg18408#msg18408
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 13 Marzo 2015, 14:46:28
non riesce a trasferire le mappe nella DrawingArea!


Devi impostare i componenti grafici gb.qt4 e gb.qt4.ext, oppure  gb.gtk3  !
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: kicco - 13 Marzo 2015, 17:46:43
 :ciao:
scusa, in effetti avevo poi guardato quei post che hai citato e ho anche capito :)

Citazione
Devi impostare i componenti grafici gb.qt4 e gb.qt4.ext, oppure  gb.gtk3  !
Ok effettivamente adesso funziona, avevo attivato gb.gui!
 :ok:
... ma con gb.gui, non dovrebbe impiegare gtk o qt a seconda del tipo di desktop environment impiegato dalla distribuzione?
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 13 Marzo 2015, 20:39:47
Se dunque ora vuoi disegnare un cerchio colorato di rosso semitrasparente sulla DrawingArea, puoi fare così:
Codice: gambas [Seleziona]
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.    :-\

Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: kicco - 30 Marzo 2015, 10:53:44
 :ciao:
Alla fine della fiera ho deciso di visualizzare la mappa di OpenStreetMap su una Mapview usando gli strumenti a disposizione e una volta individuata l'area copiarla in una DrawArea per poter sfruttare .Draw e .Paint.
La copia funziona ok se pongo DrawArea.cache =false
Per generare i cerchi ho impiegato due pulsanti, ma per disegnare i cerchi devo porre DrawArea.cache = true ma a questo punto la mappa scompare e appare il cerchio...

Allego il "giochino"
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 30 Marzo 2015, 11:02:46
Alla fine della fiera ho deciso di visualizzare la mappa di OpenStreetMap su una Mapview


Perché non hai seguito quest'altra soluzione che non utilizza l'oggetto MapView, ma solo la DrawingArea ?
http://www.gambas-it.org/smf/index.php?topic=3976.msg35304#msg35304
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: kicco - 30 Marzo 2015, 11:30:38
Citazione
Perché non hai seguito quest'altra soluzione che non utilizza l'oggetto MapView, ma solo la DrawingArea ?
così non posso navigare nella cartina, dovrei gestire io le coordinate.
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 30 Marzo 2015, 11:36:43
dovrei gestire io le coordinate.

..gestire in che senso ? Come ?
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: kicco - 30 Marzo 2015, 11:43:23
Se uso MapView, ho disponibili come strumenti sia lo slicer per lo zoom (o la rotelle del mouse) e il pan della mappa, quindi posso "girare" il mondo. Nella DrawArea non riesco a "girare" il mondo ... o sbaglio?
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 30 Marzo 2015, 11:59:12
Se uso MapView, ho disponibili come strumenti sia lo slicer per lo zoom.....

...ed allora questo ?    :-\

http://www.gambas-it.org/smf/index.php?topic=3976.msg35304#msg35304
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: kicco - 30 Marzo 2015, 12:15:39
Hai ragione, ma devo conoscere le coordinate a priori!
Per questo l'idea era di navigare e poi copiare nella DrawArea... e funziona, ma come dicevo solo se DrawArea.cached= FALSE
 :hard:
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 30 Marzo 2015, 12:17:31
Hai ragione, ma devo conoscere le coordinate a priori!


Già lo sapevo che lo avresti scritto !   :hard:


http://www.gambas-it.org/smf/index.php?topic=3960.msg35231#msg35231
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: kicco - 30 Marzo 2015, 12:48:58
scusa, forse sono andato in tilt :rolleyes:
ma per acquisire le coordinate non devo usare una MapView?

Codice: gambas [Seleziona]
    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 
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 30 Marzo 2015, 13:01:21
scusa, forse sono andato in tilt :rolleyes:
ma per acquisire le coordinate non devo usare una MapView?


...... :rolleyes: .... sì, perdonami, hai ragione.   ;D
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: vuott - 30 Marzo 2015, 18:13:07
Nella DrawArea non riesco a "girare" il mondo ... o sbaglio?

Tu cerchi una cosa tipo questa ?      :-X

Codice: gambas [Seleziona]
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:
Titolo: Re: Come disegnare cerchi su una mapview?
Inserito da: kicco - 31 Marzo 2015, 12:09:50
 :)
mi rimane da capire come premendo un pulsante riesca a sovrapporre alla mappa il famigerato cerchio...
Mi metto al lavoro
 :ciao:
Titolo: Re:Come disegnare cerchi su una mapview?
Inserito da: gianfry56 - 30 Ottobre 2016, 16:33:01
Salve a tutti  :),
mi permetto di riaprire questo vecchio post per chiedere se qualcuno è mai riuscito ad utilizzare il metodo AddPolyline di MapView.Map.
Non ho problemi con AddPoint e AddPolygon che funzionano perfettamente, ma AddPolyline non ne vuole sapere... e sì che dovrebbe utilizzare, come AddPolygon, un array di MapPoint  :rolleyes: dico 'dovrebbe' perché purtroppo la documentazione a riguardo manca (o io non l'ho trovata)

Ho la necessità di usare AddPolyline perché vorrei sovrapporre alla MapView una serie di punti, collegati, per generare un percorso.

Grazie in anticipo.
Titolo: Re:Come disegnare cerchi su una mapview?
Inserito da: vuott - 30 Ottobre 2016, 17:55:15
AddPolyline......dovrebbe utilizzare, come AddPolygon, un array di MapPoint 
Effettivamente il secondo parametro del Metodo AddPolyline( ) prevede una variabile vettoriale di tipo MapPoint[ ].
Ma poi a me il programma non lo accetta, come andasse in crash, e dà un errore: " Not an array " !    :-\

Ad ogni modo ho invato una richiesta di esempio/spiegazione nella Mailing List Internazionale.
Restiamo in attesa.
Titolo: Re:Come disegnare cerchi su una mapview?
Inserito da: vuott - 31 Ottobre 2016, 12:18:45
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:
Codice: [Seleziona]
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.
Titolo: Re:Come disegnare cerchi su una mapview?
Inserito da: Gianluigi - 31 Ottobre 2016, 14:31:39
Confermo stesso errore anche qui.
Non è che devo aggiornare? Io sono fermo alla r7884
 :ciao:
Titolo: Re:Come disegnare cerchi su una mapview?
Inserito da: vuott - 31 Ottobre 2016, 14:32:19
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.
Ho segnalato il problema direttamente a Fabien Bodard, e con la rev. 7950 via SVN l'errore è stato eliminato.
Ora il metodo .AddPolyLine( ) funziona regolarmente.
Titolo: Re:Come disegnare cerchi su una mapview?
Inserito da: Gianluigi - 31 Ottobre 2016, 15:18:36
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.
Ho segnalato il problema direttamente a Fabien Bodard, e con la rev. 7950 via SVN l'errore è stato eliminato.
Ora il metodo .AddPolyLine( ) funziona regolarmente.

Si funziona, a spanne ma funziona  ;D
Titolo: Re:Come disegnare cerchi su una mapview?
Inserito da: kicco - 01 Novembre 2016, 18:46:42
 :ciao:
io rimango ancora senza i "miei" cerchi :'(
Per la cronaca (si fa per dire), qualche mese fa ho chiesto a Fabien se pensava di integrare questa possibilità.
Mi ha riposto che la richiesta era interessante ma che era necessario capire come realizzarla!
Gli avevo spiegato che il centro doveva essere identificato con coordinate geografiche mentre il raggio con una lunghezza espressa, ad esempio, in metri.
Ha risposto ok si vedrà! :-\
Speriamo trovi il tempo di accontentarmi :)
 :ciao:
Titolo: Re:Come disegnare cerchi su una mapview?
Inserito da: gianfry56 - 01 Novembre 2016, 21:00:26
Grazie a tutti per l'interessamento, sembra che questo codice sia stato corretto...
Ho trovato nella pagina https://sourceforge.net/p/gambas/code/7950/ (https://sourceforge.net/p/gambas/code/7950/) le modifiche da fare alla classe _MapShape.class ma, perdonate la mia ignoranza, è sufficiente trovare il file che contiene questa classe e correggerlo?
Se sì, qualcuno gentilmente può dirmi sotto quale cartella posso trovare il file in questione?
 :ciao:
Titolo: Re:Come disegnare cerchi su una mapview?
Inserito da: vuott - 01 Novembre 2016, 22:28:46
Se sì, qualcuno ....
Tu... come effettui gli aggiornamenti di Gambas ?
Titolo: Re:Come disegnare cerchi su una mapview?
Inserito da: gianfry56 - 02 Novembre 2016, 00:09:46
Normalmente tramite Muon, il gestore aggiornamenti di Kubuntu..., ovviamente quando li rendono disponibili;
però se potessi imparare un modo di aggiornarmi più spesso, tutto di guadagnato.

grazie comunque  :)
Titolo: Re:Come disegnare cerchi su una mapview?
Inserito da: vuott - 02 Novembre 2016, 01:32:49
.... 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( ):

Codice: [Seleziona]
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
Titolo: Re:Come disegnare cerchi su una mapview?
Inserito da: Gianluigi - 02 Novembre 2016, 16:21:46
Come giustamente suggeritomi da Vuott, ho diviso la parte inerente  l'installazione di Gambas qui (http://www.gambas-it.org/smf/index.php?topic=5196.msg39290#new)
Titolo: Re:Come disegnare cerchi su una mapview?
Inserito da: kicco - 06 Gennaio 2018, 16:44:30
 :ciao:
Con il Commit f71115e8 del 4 gennaio 2018, Fabien Bodard ha introdotto .AddCircle negli shape disponibile nel componente gb.map.
 :ciao:
Titolo: Re:[Risolto] Come disegnare cerchi su una mapview?
Inserito da: vuott - 29 Luglio 2020, 19:46:29
Per entrambi gli argomenti trattati (e sugli altri attinenti al Componente gb.map) segnalo l'apposita sezione nella nostra Wiki:

  https://www.gambas-it.org/wiki/index.php?title=Guide_della_comunit%C3%A0#Map_-_MapView_-_Coordinate_geografiche_-_Georeferenziazione

ed in particolare:

   https://www.gambas-it.org/wiki/index.php?title=Disegnare_un_cerchio_o_un_punto_su_una_MapView