Autore Topic: [Risolto] Come disegnare cerchi su una mapview?  (Letto 3905 volte)

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.703
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
[Risolto] Come disegnare cerchi su una mapview?
« il: 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?
 :)
« Ultima modifica: 06 Gennaio 2018, 19:04:46 da Gianluigi »
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.307
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Come disegnare cerchi su una mapview?
« Risposta #1 il: 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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.703
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re: Come disegnare cerchi su una mapview?
« Risposta #2 il: 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:
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.307
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Come disegnare cerchi su una mapview?
« Risposta #3 il: 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 .

           :-\
« Ultima modifica: 05 Marzo 2015, 19:07:32 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.307
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Come disegnare cerchi su una mapview?
« Risposta #4 il: 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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.307
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Come disegnare cerchi su una mapview?
« Risposta #5 il: 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.
« Ultima modifica: 08 Marzo 2015, 17:54:22 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.703
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re: Come disegnare cerchi su una mapview?
« Risposta #6 il: 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:
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.703
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re: Come disegnare cerchi su una mapview?
« Risposta #7 il: 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:
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.307
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Come disegnare cerchi su una mapview?
« Risposta #8 il: 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.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.703
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re: Come disegnare cerchi su una mapview?
« Risposta #9 il: 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:
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.307
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Come disegnare cerchi su una mapview?
« Risposta #10 il: 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ù.    :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.703
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re: Come disegnare cerchi su una mapview?
« Risposta #11 il: 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!
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.307
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Come disegnare cerchi su una mapview?
« Risposta #12 il: 11 Marzo 2015, 20:45:27 »
.....il tuo Gambas è aggiornato ?    :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.703
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re: Come disegnare cerchi su una mapview?
« Risposta #13 il: 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
 :)
 :ciao:
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.307
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Come disegnare cerchi su una mapview?
« Risposta #14 il: 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()
« Ultima modifica: 13 Marzo 2015, 13:37:39 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »