Differenze tra le versioni di "Mostrare la mappa topografica IGM 1 25000 fornita dal Geoportale Nazionale del Ministero dell'Ambiente"

Da Gambas-it.org - Wikipedia.
 
(64 versioni intermedie di uno stesso utente non sono mostrate)
Riga 4: Riga 4:
 
E' possibile richiamare dal Server le tessere (tile) della predetta mappa topografica, scaricarle e mostrarle riordinate su una DrawingArea senza l'uso del Componente ''gb.map'' di Gambas.
 
E' possibile richiamare dal Server le tessere (tile) della predetta mappa topografica, scaricarle e mostrarle riordinate su una DrawingArea senza l'uso del Componente ''gb.map'' di Gambas.
  
Riguardo al codice Gambas, di seguito descritto, va precisato che:
+
Riguardo all'esemplificativo codice Gambas, di seguito mostrato, va precisato che:
  
 
* si richiameranno e si utilizzeranno le tessere con lo zoom a 11. Detto valore non deve essere modificato, pena la non corrispondenza e l'incoerenza con i valori delle tessere prescelte.
 
* si richiameranno e si utilizzeranno le tessere con lo zoom a 11. Detto valore non deve essere modificato, pena la non corrispondenza e l'incoerenza con i valori delle tessere prescelte.
Riga 11: Riga 11:
  
 
Pertanto nelle risorse del codice:
 
Pertanto nelle risorse del codice:
<BR>- La Costante "LATINIZ" imposta il valore iniziale di y (latitudine a Sud) e rappresenta il valore della tessera più a Nord.
+
<BR>- La Costante "LATINIZ" imposta il valore iniziale di y (latitudine verso Sud) e rappresenta il valore della tessera più a Nord.
<BR>- La Costante "LONINIZ" imposta il valore iniziale di x (longitudine a Est) e rappresenta il valore della tessera più a Ovest.
+
<BR>- La Costante "LONINIZ" imposta il valore iniziale di x (longitudine verso Est) e rappresenta il valore della tessera più a Ovest.
 
<BR>- Le Costanti "LATINIZ" e "LONINIZ", insieme, individuano dunque la tessera più in alto e più a sinistra del quadrilatero di mappa da mostrare.
 
<BR>- Le Costanti "LATINIZ" e "LONINIZ", insieme, individuano dunque la tessera più in alto e più a sinistra del quadrilatero di mappa da mostrare.
<BR>- La Costante "LATMAX" imposta la quantità di tessere che saranno caricate a partire da quella impostata in LATMAX. In sostanza, di una griglia/matrice ideale tale Costante rappresenta la quantità di Righe, cosicché il valore della latitudine presente nel nome delle tessere aumenta con l'aumentare dello spostamento verso Sud.
+
<BR>- La Costante "LATMAX" imposta la <U>quantità</u> di tessere che saranno caricate a partire da quella impostata in LATMAX. In sostanza, di una griglia/matrice ideale tale Costante rappresenta la quantità di Righe, cosicché il valore della latitudine presente nel nome delle tessere aumenta con l'aumentare dello spostamento <U>verso Sud</u>.
<BR>- La Costante "LONMAX" imposta la quantità di tessere che saranno caricate a partire da quella impostata in LONINIZ. In sostanza di una griglia/matrice ideale tale Costante rappresenta la quantità di Colonne, cosicché il valore della longitudine presente nel nome delle tessere aumenta con l'aumentare dello spostamento verso Est.
+
<BR>- La Costante "LONMAX" imposta la <U>quantità</u> di tessere che saranno caricate a partire da quella impostata in LONINIZ. In sostanza di una griglia/matrice ideale tale Costante rappresenta la quantità di Colonne, cosicché il valore della longitudine presente nel nome delle tessere aumenta con l'aumentare dello spostamento <U>verso Est</u>.
 
<BR>- Per cambiare l'area da visualizzare, è possibile agire sia impostando la tessera più in alto a sinistra (spostando così il quadrilatero che ricomprende tale area da visualizzare) attraverso la modifica del valore di una o entrambe le Costanti "LATINIZ" e "LONINIZ", sia allungando il quadrilatero dell'area da visualizzare modificando i valori della quantità delle tessere da visualizzare attraverso "LATMAX" e "LONMAX".
 
<BR>- Per cambiare l'area da visualizzare, è possibile agire sia impostando la tessera più in alto a sinistra (spostando così il quadrilatero che ricomprende tale area da visualizzare) attraverso la modifica del valore di una o entrambe le Costanti "LATINIZ" e "LONINIZ", sia allungando il quadrilatero dell'area da visualizzare modificando i valori della quantità delle tessere da visualizzare attraverso "LATMAX" e "LONMAX".
 +
<BR>- Il valore dello zoom delle tessere è strettamente connesso con i valori (LATINIZ e LONINIZ) della tessera iniziale più in alto a sinistra, e quindi di tutte le altre tessere che saranno richiamate. Se, dunque, si intende modificare il valore dello zoom, si dovranno impostare nel codice anche i coerenti valori - con il nuovo valore dello zoom - di "y" (LATINIZ) e di "x" (LONINIZ) della tessera iniziale più in alto a sinistra.
 
<BR>- Le tessere in questo caso non sono georeferenziate, pertanto cliccando sulla mappa, mostrata dalla ''DrawingArea'', non sarà possibile (...per ora) ottenere le coordinate geografiche del punto cliccato.
 
<BR>- Le tessere in questo caso non sono georeferenziate, pertanto cliccando sulla mappa, mostrata dalla ''DrawingArea'', non sarà possibile (...per ora) ottenere le coordinate geografiche del punto cliccato.
<BR>- Poiché le tessere scaricate hanno una dimensione uguale a 512x512 pixel, e poiché allo zoom 11 la lunghezza di ogni lato del reticolato della mappa mostrata è uguale a circa mm. 63,5, per ottenere il valore originario delle carte topografiche IGM 1:25000 (dove mm 40 = km 1,00), sarà necessario effettuare le seguenti operazioni:
 
mm 63,5 : 100% = mm 40 : x ---> (40 * 100) / 63,5 = 62,992
 
512px : 100% = Xpx : 62,992 ---> (512 * 62,992) / 100 = 322,519
 
Pertanto, se si desidera ottenere il valore originario delle carte topografiche IGM 1:25000, ogni tessera dovrà essere ridotta dalle dimensioni 512x512 pixel a 322x322 pixel.
 
 
<BR>- E' possibile spostare con il mouse agevolmente la mappa, mostrata sulla ''DrawingArea''. Va detto al riguardo che non sarà spostata la ''DrawingArea'' (che resterà ferma sul Form), bensì il disegno della mappa visibile.
 
<BR>- E' possibile spostare con il mouse agevolmente la mappa, mostrata sulla ''DrawingArea''. Va detto al riguardo che non sarà spostata la ''DrawingArea'' (che resterà ferma sul Form), bensì il disegno della mappa visibile.
  
 
Per far funzionare il codice, sotto mostrato, è necessario attivare i Componenti ''gb.net'' e ''gb.net.curl'' .
 
Per far funzionare il codice, sotto mostrato, è necessario attivare i Componenti ''gb.net'' e ''gb.net.curl'' .
  Private Const CACHE As String = "/tmp/IGM Mase"       <FONT Color=gray>' ''Imposta il percorso ove verranno caricate tutte le tessere necessarie''</font>
+
  Private Const CACHE As String = "/tmp/IGM Mase" <FONT Color=gray>' ''Imposta il percorso ove verranno caricate tutte le tessere necessarie''</font>
 
  Private COPYR As String = "Mappa fornita da: © M.A.S.E. - Geoportale Nazionale"
 
  Private COPYR As String = "Mappa fornita da: © M.A.S.E. - Geoportale Nazionale"
 
  Private Const INFO1 As String = "tasto destro per visualizzare dimensione originale IGM 1:25000 della mappa"
 
  Private Const INFO1 As String = "tasto destro per visualizzare dimensione originale IGM 1:25000 della mappa"
 
  Private Const INFO2 As String = "tasto destro per visualizzare dimensione predefinita della mappa"
 
  Private Const INFO2 As String = "tasto destro per visualizzare dimensione predefinita della mappa"
Private Const ZOOM As Byte = 11                      <FONT Color=gray>' ''NON MODIFICARE ! Il valore dello zoom è connesso con i valori delle tessere !''</font>
 
 
  Private Const PIXEL512 As Short = 512
 
  Private Const PIXEL512 As Short = 512
  Private Const LATINIZ As Short = 2645
+
Private Const ZOOM As Byte = '''11'''                  <FONT Color=#B22222>' '''''NON MODIFICARE !'''</font> <FONT Color=gray>Il valore dello '''zoom''' è connesso con i valori delle tessere (LATINIZ e LONINIZ) !''</font>
  Private Const LONINIZ As Short = 2718
+
  Private Const LATINIZ As Short = 2645           <FONT Color=gray>' ''Numero della Latitudine (y) costituente il nome del file della tessera iniziale più in alto''</font>
  Private Const LATMAX As Short = 6
+
  Private Const LONINIZ As Short = 2718           <FONT Color=gray>' ''Numero della Longitudine (x) costituente il nome del file della tessera iniziale più a sinistra''</font>
  Private Const LONMAX As Short = 6
+
<FONT Color=gray>' ''Se si vuole - ad esempio - impostare lo zoom a '''10''', allora imposteremo (ad esempio per restare nella zona già individuata) i valori come seguono:''
 +
' Private Const ZOOM As Byte = 10
 +
' Private Const LATINIZ As Short = 1984
 +
' Private Const LONINIZ As Short = 2038</font>
 +
  Private Const LATMAX As Short = 6               <FONT Color=gray>' ''Quantità di tessere verso sud (verso il basso del monitor) che sarà caricata''</font>
 +
  Private Const LONMAX As Short = 6               <FONT Color=gray>' ''Quantità di tessere verso est (verso la destra del monitor) che sarà caricata''</font>
 
  Private DrawingArea1 As DrawingArea
 
  Private DrawingArea1 As DrawingArea
 
  Private ht As New HttpClient As "HTTP"
 
  Private ht As New HttpClient As "HTTP"
Private pixtess As Short = PIXEL512
 
Private riduzione As Short =  CShort((PIXEL512 * ((40 * 100) / 63.5)) / 100)
 
 
  Private lon As Short = LONINIZ
 
  Private lon As Short = LONINIZ
 
  Private lat As Short = LATINIZ
 
  Private lat As Short = LATINIZ
Riga 68: Riga 67:
 
   sc = (Me.W / 2) - Me.Font.TextWidth(tc)
 
   sc = (Me.W / 2) - Me.Font.TextWidth(tc)
 
   Repeat
 
   Repeat
     Me.Caption = Quote(tc) & String(sc, Chr(32))
+
     Me.Title = Quote(tc) & String(sc, Chr(32))
 
     Dec sc
 
     Dec sc
 
     Wait 0.05
 
     Wait 0.05
Riga 87: Riga 86:
 
     Case 2
 
     Case 2
 
       If Dir(CACHE, "*.png", gb.File).Count == 0 Then
 
       If Dir(CACHE, "*.png", gb.File).Count == 0 Then
         Me.Caption = "A T T E N Z I O N E. . .  tessere immagine assenti nella cartella: " & CACHE & " !"
+
         Me.Title = "A T T E N Z I O N E. . .  tessere immagine assenti nella cartella: " & CACHE & " !"
 
         Return
 
         Return
 
       Endif
 
       Endif
Riga 112: Riga 111:
 
   
 
   
 
   If online Then
 
   If online Then
     If lon > (LONINIZ + LONMAX) Then    <FONT Color=gray>' ''Fa sì che non sia superato il numero massimo di tessere verso la longitudine Est''</font>
+
     If lon == (LONINIZ + LONMAX) Then    <FONT Color=gray>' ''Fa sì che non sia superato il numero massimo di tessere verso la longitudine Est''</font>
 
       Inc lat
 
       Inc lat
 
       lon = LONINIZ
 
       lon = LONINIZ
 
     Endif
 
     Endif
 
+
     If lat > (LATINIZ + LATMAX) Then    <FONT Color=gray>' ''Fa sì che non sia superato il numero massimo di tessere verso la latitudine Sud''</font>
+
     If lat == (LATINIZ + LATMAX) Then    <FONT Color=gray>' ''Fa sì che non sia superato il numero massimo di tessere verso la latitudine Sud''</font>
       ht.Close                         <FONT Color=gray>' ''e termina il caricamento di tutte le tessere previste per disegnare l'intera mappa''</font>
+
       ht.Close                           <FONT Color=gray>' ''e termina il caricamento di tutte le tessere previste per disegnare l'intera mappa''</font>
 
       online = False
 
       online = False
 
       Carica()
 
       Carica()
 
     Endif
 
     Endif
 
+
 
     If online Then
 
     If online Then
 
       With ht
 
       With ht
Riga 168: Riga 167:
 
     For b = 0 To lonFine - lon
 
     For b = 0 To lonFine - lon
 
       im = Image.Load(CACHE &/ ss[n])
 
       im = Image.Load(CACHE &/ ss[n])
      If pixtess == riduzione Then im = im.Stretch((PIXEL512 * 62.992) / 100, (PIXEL512 * 62.992) / 100)  <FONT Color=gray>' ''per ridurre il rapporto all'originario IGM 1:25000''</font>
 
 
       iimm[a].Push(im)
 
       iimm[a].Push(im)
 
       Inc n
 
       Inc n
       Me.Caption = "Totale tessere caricate: " & CStr(n)
+
       Me.Title = "Totale tessere caricate: " & CStr(n)
 
     Next
 
     Next
 
   Next
 
   Next
Riga 181: Riga 179:
 
  <FONT Color=gray>' ''Algoritmo per porre nell'intestazione del "Form" tutto a sinistra il testo del copyright e al centro il messaggio INFO1 oppure INFO2:''</font>
 
  <FONT Color=gray>' ''Algoritmo per porre nell'intestazione del "Form" tutto a sinistra il testo del copyright e al centro il messaggio INFO1 oppure INFO2:''</font>
 
   c1 = (Me.W / 2) + (Me.Font.TextWidth(INFO2) / 2)
 
   c1 = (Me.W / 2) + (Me.Font.TextWidth(INFO2) / 2)
   If pixtess == PIXEL512 Then c1 = (Me.W / 2) + (Me.Font.TextWidth(INFO1) / 2)
+
   c1 = (Me.W / 2) + (Me.Font.TextWidth(INFO1) / 2)
 
   c2 = Me.W - c1
 
   c2 = Me.W - c1
 
   c3 = c2 - Me.Font.TextWidth(COPYR)
 
   c3 = c2 - Me.Font.TextWidth(COPYR)
Riga 188: Riga 186:
 
   s1 = COPYR & String(c4, Chr(32))
 
   s1 = COPYR & String(c4, Chr(32))
 
   s2 = String(c2 \ spz, Chr(32))
 
   s2 = String(c2 \ spz, Chr(32))
  If pixtess == PIXEL512 Then
 
    Me.Title = s1 & "tasto destro per visualizzare dimensione originale IGM 1:25000 della mappa" & s2
 
  Else
 
    Me.Title = s1 & "tasto destro per visualizzare dimensione predefinita della mappa" & s2
 
  Endif
 
 
   
 
   
 
  End
 
  End
Riga 198: Riga 191:
 
   
 
   
 
  Public Sub DrawingArea1_Draw()
 
  Public Sub DrawingArea1_Draw()
 
+
 
   Dim c, d As Short
 
   Dim c, d As Short
 
+
 
   If online Then Return
 
   If online Then Return
 
   
 
   
Riga 208: Riga 201:
 
         .Begin(DrawingArea1)
 
         .Begin(DrawingArea1)
 
         .Brush = .Color(Color.Blue)
 
         .Brush = .Color(Color.Blue)
         .DrawImage(iimm[c][d], dx + (d * pixtess), dy + (c * pixtess), pixtess, pixtess, 1)
+
         .DrawImage(iimm[c][d], dx + (d * PIXEL512), dy + (c * PIXEL512), PIXEL512, PIXEL512, 1)
 
         .end
 
         .end
 
       End With
 
       End With
Riga 238: Riga 231:
 
   
 
   
 
  Public Sub DrawingArea1_MouseUp()
 
  Public Sub DrawingArea1_MouseUp()
 
+
 
   DrawingArea1.Mouse = Mouse.Default
 
   DrawingArea1.Mouse = Mouse.Default
 
+
   If Mouse.Right Then
+
   If Mouse.Right Then Carica()
    If pixtess == PIXEL512 Then
 
      pixtess = riduzione        <FONT Color=gray>' ''Visualizza la mappa con le dimensioni e i rapporti originari IGM 1:25000 (mm 40 == km 1)''</font>
 
      Balloon.Delay = 3000
 
      Balloon.Info("Vista originale dimensioni IGM 1:25000", DrawingArea1, Mouse.X, Mouse.Y)
 
    Else
 
      pixtess = PIXEL512          <FONT Color=gray>' ''Visualizza la mappa con le dimensioni e i rapporti predefiniti''</font>
 
      Balloon.Delay = 3000
 
      Balloon.Info("Vista dimensioni predefinite.", DrawingArea1, Mouse.X, Mouse.Y)
 
    Endif
 
    Carica()
 
  Endif
 
 
   
 
   
 
  End
 
  End
Riga 263: Riga 245:
 
   
 
   
 
  End
 
  End
       
 
  
=Mostrare su una ImageView la mappa topografica IGM 1:25000, ma senza le tessere=
+
 
Si potrà mostrare la medesima mappa topografica IGM 1:25000, fornita dal Mi.T.E., senza però l'uso delle tessere. Bisognerà cambiare URL del Server.
+
=Mostrare la mappa topografica IGM 1:25000, ma <U>senza</u> le tessere=
 +
Si potrà mostrare la medesima mappa topografica IGM 1:25000, fornita dal M.A.S.E., <U>senza</u> però l'uso delle tessere.
 +
 
 +
==Usando una ImageView==
 +
Si potrà mostrare la medesima mappa topografica IGM 1:25000 su una ''ImageView''.
  
 
Mostriamo un esempio:
 
Mostriamo un esempio:
  <FONT Color=gray>' ''Nell'individuazione del Layer si dovrà impostare correttamente la Zona "32" o "33":''</font>
+
  <FONT Color=green>' ''Nell'individuazione del Layer si dovrà impostare correttamente la Zona "32" o "33":''</font>
 
  Private Const INDIRIZZO As String = "http&#058;//wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/IGM_25000.map&SERVICE=WMS&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=TRUE&STYLES=&VERSION=1.3.0&LAYERS=CB.IGM25000.33&"
 
  Private Const INDIRIZZO As String = "http&#058;//wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/IGM_25000.map&SERVICE=WMS&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=TRUE&STYLES=&VERSION=1.3.0&LAYERS=CB.IGM25000.33&"
 
  Private Const COPYR As String = "Mappa fornita da: © M.A.S.E. - Geoportale Nazionale"
 
  Private Const COPYR As String = "Mappa fornita da: © M.A.S.E. - Geoportale Nazionale"
  Private Const LATOAREA As Float = 6125        <FONT Color=gray>' ''Con il valore 6125 si ha la dimensione originaria di mm 40 del lato del reticolo presente nelle carte IGM 1:25000 (ovviamente il valore può essere impostato a piacere)''</font>
+
  <FONT Color=gray>' '''''Con il valore 6250.00 in una "ImageView" quadrata si ha la dimensione originaria di mm 40 del lato del reticolo presente nelle carte ufficiali IGM 1:25000''':''</font>
  Private f1 As Float = 1440000.00              <FONT Color=gray>' ''La coordinata minima (massima a Ovest) di Longitudine del quadrilatero d'area considerato''</font>
+
Private Const LATOAREA As Float = <FONT Color=green>6250.00</font>
  Private f2 As Float = 5000000.00 - LATOAREA  <FONT Color=gray>' ''La coordinata minima (massima a Sud) di Latitudine del quadrilatero d'area considerato''</font>
+
<FONT Color=gray>' ''In via generale si ha che:''
  Private f3 As Float = 1440000.00 + LATOAREA  <FONT Color=gray>' ''La coordinata massima a Est di Longitudine del quadrilatero d'area considerato''</font>
+
' '''''1''') modificando egualmente (ossia aggiungendo o sottraendo un identico valore) a "f1" e a "f3", ci si sposta in '''Longitudine''';''
  Private f4 As Float = 5000000.00             <FONT Color=gray>' ''La coordinata massima a Nord di Latitudine del quadrilatero d'area considerato''</font>
+
' '''''2''') modificando egualmente (ossia aggiungendo o sottraendo un identico valore) a "f2" e a "f4", ci si sposta in '''Latitudine''';''
 +
' '''''3''') modificando egualmente (ossia aggiungendo o sottraendo un identico valore) a "f3" e a "f4", si dimensiona (zoom) la mappa mostrata.''</font>
 +
<FONT Color=green>' ''I seguenti valori sono riferiti al sistema di coordinate <B>EPGS:3857 WGS 84/Pseudo-Mercator</b>.''</font>  <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
 +
  Private f1 As Float = 1440000.00              <FONT Color=darkgreen>' ''La coordinata minima (massima a Ovest) di Longitudine del quadrilatero d'area considerato''</font>
 +
  Private f2 As Float = 5000000.00             <FONT Color=darkgreen>' ''La coordinata minima (massima a Sud) di Latitudine del quadrilatero d'area considerato''</font>
 +
  Private f3 As Float = 1440000.00 + LATOAREA  <FONT Color=darkgreen>' ''La coordinata massima a Est di Longitudine del quadrilatero d'area considerato''</font>
 +
  Private f4 As Float = 5000000.00 + LATOAREA  <FONT Color=darkgreen>' ''La coordinata massima a Nord di Latitudine del quadrilatero d'area considerato''</font>
 
  Private imageview1 As ImageView
 
  Private imageview1 As ImageView
 
   
 
   
Riga 294: Riga 285:
 
     .Y = 0
 
     .Y = 0
 
   End With
 
   End With
 
 
<FONT Color=gray>' ''Se la dimensione della "ImageView" non rappresenta un quadrato, bensì un rettangolo con la longitudine come lato più lungo, allora è necessario un adeguamento del disegno della mappa considerando la lunghezza di detto lato più lungo:''</font>
 
  f3 += ((((Screen.AvailableWidth * 100) / Screen.AvailableHeight) - 100) * LATOAREA) / 100
 
 
    
 
    
 
   Carica()
 
   Carica()
Riga 307: Riga 295:
 
   Dim ind, s As String
 
   Dim ind, s As String
 
   Dim tp As New HttpClient
 
   Dim tp As New HttpClient
  Dim im As Image
 
 
    
 
    
 
   Me.Title = "ATTENDERE IL CARICAMENTO !"
 
   Me.Title = "ATTENDERE IL CARICAMENTO !"
 
    
 
    
 
   Wait 0.3
 
   Wait 0.3
 
+
 +
<FONT Color=gray>' ''La dimensione della "ImageView" deve rappresentare un "quadrato" avente ciascun lato uguale all'altezza della "ImageView":''</font>
 
   ind = INDIRIZZO &
 
   ind = INDIRIZZO &
         "WIDTH=" & CStr(imageview1.W) & "&HEIGHT=" & CStr(imageview1.H) & "&CRS=EPSG:900913&" &
+
         "WIDTH=" & CStr(imageview1.H) & "&HEIGHT=" & CStr(imageview1.H) & "&CRS=EPSG:900913&" &
      "BBOX=" & CStr(f1) & "," & CStr(f2) & "," & CStr(f3) & "," & CStr(f4)  
+
        "BBOX=" & CStr(f1) & "," & CStr(f2) & "," & CStr(f3) & "," & CStr(f4)  
 
        
 
        
 
   tp.Timeout = 15
 
   tp.Timeout = 15
Riga 321: Riga 309:
 
    
 
    
 
   tp.Close
 
   tp.Close
 
 
  im = Image.FromString(s)
 
 
   
 
   
 
   With imageview1
 
   With imageview1
 
  <FONT Color=gray>' ''Modifica il valore del colore dello sfondo dell'immagine caricata:''</font>
 
  <FONT Color=gray>' ''Modifica il valore del colore dello sfondo dell'immagine caricata:''</font>
     .Image = im.Replace(&FFFFFFFF&, &FFFFDF)
+
     .Image = Image.FromString(s)
 
  <FONT Color=gray>' ''Salva l'immagine caricata della mappa in un file formato PNG:''</font>
 
  <FONT Color=gray>' ''Salva l'immagine caricata della mappa in un file formato PNG:''</font>
 
     .Image.Save("/tmp/IGM.png", 100)
 
     .Image.Save("/tmp/IGM.png", 100)
 
   End With
 
   End With
 
   
 
   
   Me.Title = COPYR & String(Me.Font.TextWidth(COPYR), Chr(32))
+
   Me.Title = COPYR
 +
 +
End
 +
 
 +
==Usando una WebView==
 +
Si potrà mostrare la medesima mappa topografica IGM 1:25000 su una ''WebView''.
 +
 
 +
Mostriamo un esempio, nel quale la mappa topografica sarà mostrata su un'area dello schermo pari al quadrato dell'altezza disponibile dello schermo medesimo:
 +
Private WebView1 As WebView
 +
Private Const COPYR As String = "Mappa fornita da: © M.A.S.E. - Geoportale Nazionale"
 +
<FONT Color=green>' ''I seguenti valori sono riferiti al sistema di coordinate <B>EPGS:3857 WGS 84/Pseudo-Mercator</b>.''</font>  <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
 +
Private Const LONGMIN As Single = 1440000.00  <FONT Color=gray>' ''La coordinata minima (massima a Ovest) di Longitudine del quadrilatero d'area considerato''</font>
 +
Private Const LATMIN As Single = 5000000.00  <FONT Color=gray>' ''La coordinata minima (massima a Sud) di Latitudine del quadrilatero d'area considerato''</font>
 +
Private Const LONGMAX As Single = 144<FONT Color=green>6250</font>.00  <FONT Color=gray>' ''La coordinata massima a Est di Longitudine del quadrilatero d'area considerato''</font>
 +
Private Const LATMAX As Single = 500<FONT Color=green>6250</font>.00  <FONT Color=gray>' ''La coordinata massima a Nord di Latitudine del quadrilatero d'area considerato''</font>
 +
 +
Public Sub _new()
 +
 +
  With Me
 +
    .W = Screen.AvailableWidth
 +
    .H = Screen.AvailableHeight
 +
    .Arrangement = Arrange.Fill
 +
  End With
 +
 +
  With WebView1 = New WebView(Me) As "WebView1"
 +
    .W = 0
 +
    .H = 0
 +
  End With
 +
 +
End
 +
 +
 +
Public Sub Form_Arrange()
 +
 +
<FONT Color=gray>' ''Come nell'esempio precedente si ha che:''
 +
' '''''1''') modificando egualmente (ossia aggiungendo o sottraendo un identico valore) al primo e al terzo parametro del TAG "BBOX", ci si sposta in '''Longitudine''';''
 +
' '''''2''') modificando egualmente (ossia aggiungendo o sottraendo un identico valore) al secondo e al quarto parametro del TAG "BBOX", ci si sposta in '''Latitudine''';''
 +
' '''''3''') modificando egualmente (ossia aggiungendo o sottraendo un identico valore) al terzo e al quarto parametro del TAG "BBOX", si dimensiona (zoom) la mappa mostrata.''</font>
 +
  WebView1.Url = "http&#058;//wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/IGM_25000.map&SERVICE=WMS&REQUEST=GetMap" &
 +
                "&FORMAT=image/png&TRANSPARENT=TRUE&STYLES=&VERSION=1.3.0&LAYERS=CB.IGM25000.33&WIDTH=" & CStr(WebView1.H) & "&HEIGHT=" &
 +
                CStr(WebView1.H) & "&CRS=EPSG:900913&BBOX=" & CStr(LONGMIN) & "," & CStr(LATMIN) & "," & CStr(LONGMAX) & "," & CStr(LATMAX)
 +
 +
  Me.Title = COPYR
 +
 +
End
 +
 +
 +
Public Sub WebView1_MouseUp()
 +
 +
<FONT Color=gray>' ''Calcola e mostra la Longitudine e la Latitudine del punto della mappa cliccato con il mouse:''</font>
 +
  Dim ln As Float = ((((Mouse.ScreenX - ((Screen.AvailableWidth / 2) - (Screen.AvailableHeight / 2))) * ((LONGMAX - LONGMIN)) / WebView1.H)) + LONGMIN)
 +
  Dim lt As Float = CFloat((WebView1.H - Mouse.Y) * ((LATMAX - LATMIN) / WebView1.H) + LATMIN)
 +
 +
  Me.Title = Space(CInt(Screen.AvailableWidth / 8)) & "Lat. = " & Format(lt, "#.00") & "  Long. = " & Format(ln, "#.00") &
 +
            Space(CInt(Screen.AvailableWidth / 14)) & COPYR
 
   
 
   
 
  End
 
  End
       
+
 
 +
====Mostrando la mappa topografica sull'intera superficie dello schermo====
 +
Un altro esempio, simile al precedente, ma mostrando la mappa topografica sull'intera superficie dello schermo:
 +
Private WebView1 As WebView
 +
Private Const COPYR As String = "Mappa fornita da: © M.A.S.E. - Geoportale Nazionale"
 +
<FONT Color=green>' ''I seguenti valori sono riferiti al sistema di coordinate <B>EPGS:3857 WGS 84/Pseudo-Mercator</b>.''</font>  <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
 +
Private Const LONGMIN As Single = 1440000.00    <FONT Color=gray>' ''La coordinata minima (massima a Ovest) di Longitudine del quadrilatero d'area considerato''</font>
 +
Private Const LATMIN As Single = 5000000.00    <FONT Color=gray>' ''La coordinata minima (massima a Sud) di Latitudine del quadrilatero d'area considerato''</font>
 +
Private Const ESTENSIONE As Single = 16000.00  <FONT Color=gray>' ''Imposta lo zoom''</font>
 +
 +
 +
Public Sub _new()
 +
 +
  With Me
 +
    .W = Screen.AvailableWidth
 +
    .H = Screen.AvailableHeight
 +
    .Arrangement = Arrange.Fill
 +
  End With
 +
 +
  With WebView1 = New WebView(Me) As "WebView1"
 +
    .W = 0
 +
    .H = 0
 +
  End With
 +
 +
End
 +
 +
 +
Public Sub Form_Arrange()
 +
 +
  Dim LONGMAX, LATMAX As Single
 +
 
 +
  Me.Text = "Attendere !"
 +
 +
<FONT Color=gray>' ''La coordinata massima a Est di Longitudine del quadrilatero d'area considerato:''</font>
 +
  LONGMAX = LONGMIN + ESTENSIONE
 +
 +
<FONT Color=gray>' ''La coordinata massima a Nord di Latitudine del quadrilatero d'area considerato:''</font>
 +
  LATMAX = LATMIN + ((ESTENSIONE * WebView1.H) / WebView1.W)
 +
 +
  WebView1.Url = "http&#058;//wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/IGM_25000.map&SERVICE=WMS&REQUEST=GetMap" &
 +
                "&FORMAT=image/png&TRANSPARENT=TRUE&STYLES=&VERSION=1.3.0&LAYERS=CB.IGM25000.33&WIDTH=1920&HEIGHT=1048&CRS=EPSG:900913&BBOX=" &
 +
                CStr(LONGMIN) & "," & CStr(LATMIN) & "," & CStr(LONGMAX) & "," & CStr(LATMAX)
 +
 +
End
 +
 +
 +
Public Sub WebView1_Finish()
 +
 +
  Me.Title = COPYR
 +
 +
End
 +
 +
 +
Public Sub WebView1_MouseUp()
 +
 +
  Dim lat, lon, es As Float
 +
 +
  es = ESTENSIONE / WebView1.W
 +
 +
<FONT Color=gray>' ''Calcola e mostra la Longitudine e la Latitudine del punto della mappa cliccato con il mouse:''</font>
 +
  lon = LONGMIN + (es * Mouse.X)
 +
  lat = LATMIN + (es * (WebView1.H - Mouse.Y))
 +
 +
  Me.Title = "Lat.: " & Format(lat, "#.00") & "    " & "long.: " & Format(lon, "#.00") & Space(20) & COPYR
 +
 +
End
 +
 
 +
====Copiando dal sito del M.A.S.E. l'indirizzo dell'immagine dell'area mostrata nel visualizzatore====
 +
In questo esempio, ampiamente commentato, sarà mostrata dal sito del M.A.S.E. la cartografia IGM 1:25000, e se ne copierà l'indirizzo dell'immagine web per poi salvarla come file immagine.
 +
<BR>Per questo esempio è necessario attivare anche i Componenti ''gb.desktop'' e ''gb.desktop.x11'' .
 +
Private WebView1 As WebView
 +
 +
 +
Public Sub Form_Open()
 +
 +
  With Me
 +
    .W = Screen.AvailableWidth
 +
    .H = Screen.AvailableHeight
 +
    .Arrangement = Arrange.Fill
 +
  End With
 +
 
 +
  With WebView1 = New WebView(Me) As "WebView1"
 +
<FONT Color=gray>' ''Apre il sito web del visualizzatore di mappe del "Ministro dell'Ambiente e della Sicurezza Energetica":''</font>
 +
    .url = "http&#058;//www.pcn.minambiente.it/viewer/"
 +
  End With
 +
 +
End
 +
 +
 +
<FONT Color=gray>' ''Dopo aver fatto apparire il layer principale, per far mostrare su questo anche il layer della mappa topografica IGM 1:25000, cliccare sulla voce "Servizi" della finestra di menu denominata "Strumenti" e posta in alto a sinistra del sito.
 +
' ''Nel sub-menu, che si apre a tendina, fare doppio-clic sulla voce "WMS".''
 +
' ''Nella finestra "", che si apre al centro del video cliccare in sequenza:''
 +
' '' - sulla voce "Ente..." e scegliere l'opzione "wms.pcn.minambiente.it";''
 +
' '' - sulla voce "Servzio" e scegliere l'opzione "Cartografia di base - IGM 25.000";''
 +
' '' - sul tasto virtuale "Visualizza Layer".''
 +
' ''Attivare quindi la copertura o le coperture regionali desiderate (WGS84-UTM32 oppure WGS84-UTM33).''
 +
' ''Cliccare sul tasto virtuale "Aggiungi Layer".''
 +
' ''Aumentare lo zoom della mappa per far apparire la cartografia IGM prescelta.''
 +
' ''Cliccare sul "WebView" con il tasto destro del mouse: si aprirà un Menu a finestra, nel quale scegliere l'opzione "Copy image address".''
 +
' ''Cliccare quindi sul "WebView" con il tasto centrale del mouse: si aprirà la finestra dell'Oggetto "InputBox".''
 +
' ''Cliccare con il tasto destro del mouse all'interno dello spazio testuale della finestra dell'InputBox: nel menu a tendina, che appare, scegliere l'opzione "Paste" (Incolla), per incollare nell'InputBox l'indirizzo che è stato appena prima copiato.''
 +
' ''Premere su "OK".''</font>
 +
Public Sub WebView1_MouseUp()
 +
 +
  If Not Mouse.Middle Then Return
 +
  Dim s As String = InputBox("Immettere indirizzo:")
 +
  If IsNull(s) Then Return
 +
 +
  WebView1.Url = s
 +
 +
End
 +
 +
 +
<FONT Color=gray>' ''Cliccando con il tasto sinistro del mouse, portare al massimo la dimensione della mappa mostrata.''
 +
' ''Il programma effettuerà una schermata dell'immagine, che però, non essendo estesa al massimo, non sarà di buona qualità visiva.''
 +
' ''Quindi cliccare nuovamente con il tasto sinistro, per ridurla.''
 +
' ''Il programma effettuerà una nuova schermata dell'immagine, che, essendo stata posta precedentemente al massimo della sua dimensione, sarà visivamente ottimale e pertanto sarà quella da preferire.''</font>
 +
Public Sub WebView1_MouseDown()
 +
 +
  If Not Mouse.Left Then Return
 +
 +
  Dim dw As DesktopWindow
 +
  Dim pc As Picture
 +
 +
<FONT Color=gray>' ''Crea un Oggetto "DesktopWindow" che punta all'Oggetto "WebView":''</font>
 +
  With dw = New DesktopWindow(WebView1.Handle)
 +
<FONT Color=gray>' ''Esegue una schermata del contenuto corrente dell'Oggetto "WebView", generandone un'immagine di tipo "Picture":'' </font><SUP>&#091;[[#Note|nota 2]]&#093;</sup>
 +
    pc = .GetScreenshot(True)
 +
  End With
 +
 +
<FONT Color=gray>' ''Salva l'immagine di tipo "Picture" finale della pagina web caricata inizialmente:''</font>
 +
  pc.Save("/tmp/MASE-IGM_25000.png", 100)
 +
 +
End
 +
 
  
 
=Mostrare in un WebView una sola tessera della mappa topografica IGM 1:25000=
 
=Mostrare in un WebView una sola tessera della mappa topografica IGM 1:25000=
Per mostrare in un "WebView" una sola tessera della mappa topografica IGM 1:25000, fornita dal Mi.T.E., si dovranno individuare i numeri corrispondenti alle coordinate "x" e "y" di ciascuna tessera tenendo bene in conto del valore dello zoom prescelto.
+
Per mostrare in un "WebView" una sola tessera della mappa topografica IGM 1:25000, fornita dal M.A.S.E., si dovranno individuare i numeri corrispondenti alle coordinate "x" e "y" di ciascuna tessera tenendo bene in conto del valore dello zoom prescelto.
  
Mostriamo un esempio, nel quale lo zoom è impostato a "11". E' necessario ricordare che:
+
Mostriamo un esempio, nel quale lo zoom è impostato a "11".
 +
<BR>E' necessario ricordare che:
 
<BR>- le tessere in questione hanno una dimensione 512x512 pixel;
 
<BR>- le tessere in questione hanno una dimensione 512x512 pixel;
<BR>- in questo caso il protocollo per individuare la tessera è: "zoom", "y" e "x".
+
<BR>- in questo caso il protocollo per individuare la tessera è: "zoom", "y" e "x";
Poiché si provvederà a scaricare i dati immagine di ciascuna tessera visualizzata e contestualmente salvarli in file immagine in un'apposita cartella, bisognerà attivare anche i Componenti ''gb.net'' e ''gb.net.curl'' .
+
<BR>- per mostrare la tessera contigua, bisognerà cliccare su un lato della cornice arancione che inquadra la tessera corrente;
 +
<BR>- poiché si provvederà a scaricare i dati immagine di ciascuna tessera visualizzata e contestualmente a salvarli in file immagine in un'apposita cartella, è necessario attivare anche i Componenti ''gb.net'' e ''gb.net.curl'' .
 
  Private Const TESSERA As Short = 512  <FONT Color=gray>' ''Indica la dimensione in pixel di ciascuna tessera costituente la mappa IGM 1:25000''</font>
 
  Private Const TESSERA As Short = 512  <FONT Color=gray>' ''Indica la dimensione in pixel di ciascuna tessera costituente la mappa IGM 1:25000''</font>
  Private Const ZOOM As Byte = 11      <FONT Color=gray>' ''Imposta lo zoom dell'immagine riprodotta su ciascuna tessera''</font>
+
  Private Const ZOOM As Byte = '''11'''       <FONT Color=gray>' ''Imposta lo zoom dell'immagine riprodotta su ciascuna tessera''</font>
 
  Private Const COPYR As String = "Mappa fornita da: © M.A.S.E. - Geoportale Nazionale"
 
  Private Const COPYR As String = "Mappa fornita da: © M.A.S.E. - Geoportale Nazionale"
 
  Private WebView1 As WebView
 
  Private WebView1 As WebView
Riga 351: Riga 527:
 
  Private Label2 As Label
 
  Private Label2 As Label
 
  Private Label3 As Label
 
  Private Label3 As Label
  Private x As Integer    <FONT Color=gray>' ''Indica lo spostamento in Longitudine (Ovest-Est)''</font>
+
  Private y As Integer    <FONT Color=gray>' ''Indica lo spostamento in Latitudine (Nord-->Sud)''</font>
  Private y As Integer    <FONT Color=gray>' ''Indica lo spostamento in Latitudine (Nord-Sud)''</font>
+
  Private x As Integer    <FONT Color=gray>' ''Indica lo spostamento in Longitudine (Ovest-->Est)''</font>
 
   
 
   
 
   
 
   
 
  Public Sub _new()
 
  Public Sub _new()
 
   
 
   
   Me.Move((Screen.AvailableWidth / 2) - 375, 0, 750, Screen.AvailableHeight)
+
   With Me
 +
    .W = Screen.AvailableWidth * 0.39
 +
    .H = Screen.AvailableHeight * 0.71
 +
    .Center
 +
  End With
 
   With Panel1 = New Panel(Me) As "Panel1"
 
   With Panel1 = New Panel(Me) As "Panel1"
 
     .X = 50
 
     .X = 50
Riga 387: Riga 567:
 
   End With
 
   End With
 
   
 
   
   MkDir "/tmp/TESSERE"
+
   If Not Exist("/tmp/TESSERE") Then MkDir "/tmp/TESSERE"
 
   
 
   
 
  End  
 
  End  
Riga 393: Riga 573:
 
  Public Sub Form_Open()
 
  Public Sub Form_Open()
 
   
 
   
  <FONT Color=gray>' ''Imposta le coordinate "x,y" della tessera iniziale da mostrare:''</font>
+
  <FONT Color=gray>' ''Imposta le coordinate "y" e "x" della tessera iniziale da mostrare:''</font>
   y = 2650
+
   y = 2648
   x = 2727
+
   x = 2722
 
   
 
   
 
   AggiornaLabel()
 
   AggiornaLabel()
Riga 442: Riga 622:
 
   
 
   
 
   With WebView1 = New WebView(Panel1) As "WebView1"
 
   With WebView1 = New WebView(Panel1) As "WebView1"
     .X = 50
+
     .X = 44
     .Y = 50
+
     .Y = 44
 
     .W = TESSERA
 
     .W = TESSERA
 
     .H = TESSERA
 
     .H = TESSERA
Riga 455: Riga 635:
 
   
 
   
 
  End
 
  End
 +
Se si vuole - ad esempio - impostare lo zoom a '''10''', allora imposteremo (volendo restare nella zona già individuata) i valori come seguono:
 +
Private Const ZOOM As Byte = 10
 +
......
 +
  <FONT Color=gray>' ''Imposta le coordinate "y" e "x" della tessera iniziale da mostrare:''</font>
 +
y = 1986
 +
x = 2042
 +
......
 +
 +
 +
 +
=Note=
 +
[1] Vedere anche le seguenti pagine web:
 +
* https://epsg.io/
 +
* https://epsg.io/3857
 +
* https://products.aspose.app/gis/transformation
 +
* https://gis.stackexchange.com/questions/40538/what-is-the-difference-between-epsg900913-and-epsg3857
 +
* https://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/
 +
 +
[2] Sulle modalità per ottenere l'immagine di una pagina web, vedere la seguente pagina: [[Ottenere l'immagine di una pagina web]]

Versione attuale delle 17:01, 17 ott 2024

Mostrare su una DawingArea la mappa topografica IGM 1:25000 fornita dal Ministero dell'Ambiente e della Sicurezza Energetica (M.A.S.E.)

Il Geoportale Nazionale del Ministero dell'Ambiente e della Sicurezza Energetica dispone, come Servizio WMS, anche della carta topografica I.G.M. 1:25000, che solitamente va sovrapposta agli altri strati di mappe presenti nel sito del Geoportale Nazionale.

E' possibile richiamare dal Server le tessere (tile) della predetta mappa topografica, scaricarle e mostrarle riordinate su una DrawingArea senza l'uso del Componente gb.map di Gambas.

Riguardo all'esemplificativo codice Gambas, di seguito mostrato, va precisato che:

  • si richiameranno e si utilizzeranno le tessere con lo zoom a 11. Detto valore non deve essere modificato, pena la non corrispondenza e l'incoerenza con i valori delle tessere prescelte.
  • Il nome del file immagine .png di ciascuna tessera della mappa è formato dal valore dello Zoom, dal numero di tessera in Latitudine e dal numero di tessera in Longitudine.
  • Le tessere vengono lette da Nord verso Sud e da Ovest verso Est.

Pertanto nelle risorse del codice:
- La Costante "LATINIZ" imposta il valore iniziale di y (latitudine verso Sud) e rappresenta il valore della tessera più a Nord.
- La Costante "LONINIZ" imposta il valore iniziale di x (longitudine verso Est) e rappresenta il valore della tessera più a Ovest.
- Le Costanti "LATINIZ" e "LONINIZ", insieme, individuano dunque la tessera più in alto e più a sinistra del quadrilatero di mappa da mostrare.
- La Costante "LATMAX" imposta la quantità di tessere che saranno caricate a partire da quella impostata in LATMAX. In sostanza, di una griglia/matrice ideale tale Costante rappresenta la quantità di Righe, cosicché il valore della latitudine presente nel nome delle tessere aumenta con l'aumentare dello spostamento verso Sud.
- La Costante "LONMAX" imposta la quantità di tessere che saranno caricate a partire da quella impostata in LONINIZ. In sostanza di una griglia/matrice ideale tale Costante rappresenta la quantità di Colonne, cosicché il valore della longitudine presente nel nome delle tessere aumenta con l'aumentare dello spostamento verso Est.
- Per cambiare l'area da visualizzare, è possibile agire sia impostando la tessera più in alto a sinistra (spostando così il quadrilatero che ricomprende tale area da visualizzare) attraverso la modifica del valore di una o entrambe le Costanti "LATINIZ" e "LONINIZ", sia allungando il quadrilatero dell'area da visualizzare modificando i valori della quantità delle tessere da visualizzare attraverso "LATMAX" e "LONMAX".
- Il valore dello zoom delle tessere è strettamente connesso con i valori (LATINIZ e LONINIZ) della tessera iniziale più in alto a sinistra, e quindi di tutte le altre tessere che saranno richiamate. Se, dunque, si intende modificare il valore dello zoom, si dovranno impostare nel codice anche i coerenti valori - con il nuovo valore dello zoom - di "y" (LATINIZ) e di "x" (LONINIZ) della tessera iniziale più in alto a sinistra.
- Le tessere in questo caso non sono georeferenziate, pertanto cliccando sulla mappa, mostrata dalla DrawingArea, non sarà possibile (...per ora) ottenere le coordinate geografiche del punto cliccato.
- E' possibile spostare con il mouse agevolmente la mappa, mostrata sulla DrawingArea. Va detto al riguardo che non sarà spostata la DrawingArea (che resterà ferma sul Form), bensì il disegno della mappa visibile.

Per far funzionare il codice, sotto mostrato, è necessario attivare i Componenti gb.net e gb.net.curl .

Private Const CACHE As String = "/tmp/IGM Mase"  ' Imposta il percorso ove verranno caricate tutte le tessere necessarie
Private COPYR As String = "Mappa fornita da: © M.A.S.E. - Geoportale Nazionale"
Private Const INFO1 As String = "tasto destro per visualizzare dimensione originale IGM 1:25000 della mappa"
Private Const INFO2 As String = "tasto destro per visualizzare dimensione predefinita della mappa"
Private Const PIXEL512 As Short = 512
Private Const ZOOM As Byte = 11                  ' NON MODIFICARE ! Il valore dello zoom è connesso con i valori delle tessere (LATINIZ e LONINIZ) !
Private Const LATINIZ As Short = 2645            ' Numero della Latitudine (y) costituente il nome del file della tessera iniziale più in alto
Private Const LONINIZ As Short = 2718            ' Numero della Longitudine (x) costituente il nome del file della tessera iniziale più a sinistra
' Se si vuole - ad esempio - impostare lo zoom a 10, allora imposteremo (ad esempio per restare nella zona già individuata) i valori come seguono:
' Private Const ZOOM As Byte = 10
' Private Const LATINIZ As Short = 1984
' Private Const LONINIZ As Short = 2038
Private Const LATMAX As Short = 6                ' Quantità di tessere verso sud (verso il basso del monitor) che sarà caricata
Private Const LONMAX As Short = 6                ' Quantità di tessere verso est (verso la destra del monitor) che sarà caricata
Private DrawingArea1 As DrawingArea
Private ht As New HttpClient As "HTTP"
Private lon As Short = LONINIZ
Private lat As Short = LATINIZ
Private latFine As Short
Private lonFine As Short
Private t As Short
Private spx As Short
Private spy As Short
Private dx As Short
Private dy As Short
Private iimm As Image[][]
Private online As Boolean
Private sc As Short


Public Sub Form_Open()

 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
   .Show()
   Wait
 End With

 If Not Exist(CACHE) Then Mkdir CACHE

 Dim tc As String = "tasto sinistro per caricare online  -  tasto destro per caricare offline"
 sc = (Me.W / 2) - Me.Font.TextWidth(tc)
 Repeat
   Me.Title = Quote(tc) & String(sc, Chr(32))
   Dec sc
   Wait 0.05
 Until sc == 0

End


Public Sub Form_MouseUp()
 
 sc = 0

 Select Case Mouse.Button
   Case 1
     online = True
     CreaDraw()
     Scarica()
   Case 2
     If Dir(CACHE, "*.png", gb.File).Count == 0 Then
       Me.Title = "A T T E N Z I O N E. . .  tessere immagine assenti nella cartella: " & CACHE & " !"
       Return
     Endif
     CreaDraw()
     Carica()
 End Select

End


Private Procedure CreaDraw()

 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
   .X = 0
   .Y = 0
   .Border = Border.Plain
   .Background = Color.DarkGray
 End With

End


Private Procedure Scarica()

 If online Then
   If lon == (LONINIZ + LONMAX) Then    ' Fa sì che non sia superato il numero massimo di tessere verso la longitudine Est
     Inc lat
     lon = LONINIZ
   Endif

   If lat == (LATINIZ + LATMAX) Then    ' Fa sì che non sia superato il numero massimo di tessere verso la latitudine Sud
     ht.Close                           ' e termina il caricamento di tutte le tessere previste per disegnare l'intera mappa
     online = False
     Carica()
   Endif

   If online Then
     With ht
' Invia la richiesta al server per scaricare il file immagine:
       .URL = "http://www.pcn.minambiente.it/arcgis/rest/services/immagini/IGM_25000/MapServer/tile" &/ CStr(ZOOM) &/ CStr(lat) &/ CStr(lon)
       .Timeout = 15
' Scarica i dati del file immagine in un percorso prescelto, contenente anche il nome del file immagine ricreato:
       .Get(Null, cache &/ CStr(ZOOM) & "-" & CStr(lat) & "-" & CStr(lon) & ".png")
     End With
     Inc t
     Me.Title = "ATTENDERE scarico tessere della mappa:  " & Format((t * 100) / ((LONMAX + 1) * (LATMAX + 1)), "#.0") & "%"
   Endif
 Endif

End


Public Sub HTTP_Finished()  

 If online Then
   Inc lon
   Scarica()
 Endif

End


Private Procedure Carica()
 
 Dim a, b, n As Short
 Dim c1, c2, c3, c4, spz As Short
 Dim im As Image
 Dim ss As String[]
 Dim s1, s2 As String
 
 iimm = New Image[][]
 
 ss = Dir(CACHE, "*.png", gb.File).Sort()
 lat = Val(Scan(ss[0], "*-*-*.*")[1])
 lon = Val(Scan(ss[0], "*-*-*.*")[2])
 latFine = Val(Scan(ss[ss.Max], "*-*-*.*")[1])
 lonFine = Val(Scan(ss[ss.Max], "*-*-*.*")[2])
 For a = 0 To latFine - lat
   iimm.Push([])
   For b = 0 To lonFine - lon
     im = Image.Load(CACHE &/ ss[n])
     iimm[a].Push(im)
     Inc n
     Me.Title = "Totale tessere caricate: " & CStr(n)
   Next
 Next
 
 DrawingArea1.Refresh
 
 Wait
 
' Algoritmo per porre nell'intestazione del "Form" tutto a sinistra il testo del copyright e al centro il messaggio INFO1 oppure INFO2:
 c1 = (Me.W / 2) + (Me.Font.TextWidth(INFO2) / 2)
 c1 = (Me.W / 2) + (Me.Font.TextWidth(INFO1) / 2)
 c2 = Me.W - c1
 c3 = c2 - Me.Font.TextWidth(COPYR)
 spz = Me.Font.TextWidth(Chr(32))
 c4 = c3 \ spz
 s1 = COPYR & String(c4, Chr(32))
 s2 = String(c2 \ spz, Chr(32))

End


Public Sub DrawingArea1_Draw()

 Dim c, d As Short

 If online Then Return

 For c = 0 To iimm.Max
   For d = 0 To iimm[0].Max
     With Paint
       .Begin(DrawingArea1)
       .Brush = .Color(Color.Blue)
       .DrawImage(iimm[c][d], dx + (d * PIXEL512), dy + (c * PIXEL512), PIXEL512, PIXEL512, 1)
       .end
     End With
   Next
 Next

End


Public Sub DrawingArea1_MouseDown()
   
 spx = Mouse.X - dx
 spy = Mouse.Y - dy

End


Public Sub DrawingArea1_MouseMove()
 
 DrawingArea1.Mouse = 18
 
 dx = Mouse.X - spx
 dy = Mouse.Y - spy
 
 DrawingArea1.Refresh

End


Public Sub DrawingArea1_MouseUp()

 DrawingArea1.Mouse = Mouse.Default

 If Mouse.Right Then Carica()

End


Public Sub Form_Close()
 
 sc = 0
 ht.Close

End


Mostrare la mappa topografica IGM 1:25000, ma senza le tessere

Si potrà mostrare la medesima mappa topografica IGM 1:25000, fornita dal M.A.S.E., senza però l'uso delle tessere.

Usando una ImageView

Si potrà mostrare la medesima mappa topografica IGM 1:25000 su una ImageView.

Mostriamo un esempio:

' Nell'individuazione del Layer si dovrà impostare correttamente la Zona "32" o "33":
Private Const INDIRIZZO As String = "http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/IGM_25000.map&SERVICE=WMS&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=TRUE&STYLES=&VERSION=1.3.0&LAYERS=CB.IGM25000.33&"
Private Const COPYR As String = "Mappa fornita da: © M.A.S.E. - Geoportale Nazionale"
' Con il valore 6250.00 in una "ImageView" quadrata si ha la dimensione originaria di mm 40 del lato del reticolo presente nelle carte ufficiali IGM 1:25000:
Private Const LATOAREA As Float = 6250.00
' In via generale si ha che:
' 1) modificando egualmente (ossia aggiungendo o sottraendo un identico valore) a "f1" e a "f3", ci si sposta in Longitudine;
' 2) modificando egualmente (ossia aggiungendo o sottraendo un identico valore) a "f2" e a "f4", ci si sposta in Latitudine;
' 3) modificando egualmente (ossia aggiungendo o sottraendo un identico valore) a "f3" e a "f4", si dimensiona (zoom) la mappa mostrata.
' I seguenti valori sono riferiti al sistema di coordinate EPGS:3857 WGS 84/Pseudo-Mercator.  [nota 1]
Private f1 As Float = 1440000.00              ' La coordinata minima (massima a Ovest) di Longitudine del quadrilatero d'area considerato
Private f2 As Float = 5000000.00              ' La coordinata minima (massima a Sud) di Latitudine del quadrilatero d'area considerato
Private f3 As Float = 1440000.00 + LATOAREA   ' La coordinata massima a Est di Longitudine del quadrilatero d'area considerato
Private f4 As Float = 5000000.00 + LATOAREA   ' La coordinata massima a Nord di Latitudine del quadrilatero d'area considerato
Private imageview1 As ImageView


Public Sub Form_Open()
 
 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
   .Show
 End With
 
' La dimensione della "ImageView" deve rappresentare un "quadrato"...:
 With imageview1 = New ImageView(Me)
   .X = 0
   .Y = 0
 End With
 
 Carica()
  
End


Private Procedure Carica()
 
 Dim ind, s As String
 Dim tp As New HttpClient
 
 Me.Title = "ATTENDERE IL CARICAMENTO !"
 
 Wait 0.3

' La dimensione della "ImageView" deve rappresentare un "quadrato" avente ciascun lato uguale all'altezza della "ImageView":
 ind = INDIRIZZO &
       "WIDTH=" & CStr(imageview1.H) & "&HEIGHT=" & CStr(imageview1.H) & "&CRS=EPSG:900913&" &
       "BBOX=" & CStr(f1) & "," & CStr(f2) & "," & CStr(f3) & "," & CStr(f4) 
      
 tp.Timeout = 15
 s = tp.Download(ind)
 
 tp.Close

 With imageview1
' Modifica il valore del colore dello sfondo dell'immagine caricata:
   .Image = Image.FromString(s)
' Salva l'immagine caricata della mappa in un file formato PNG:
   .Image.Save("/tmp/IGM.png", 100)
 End With

 Me.Title = COPYR

End

Usando una WebView

Si potrà mostrare la medesima mappa topografica IGM 1:25000 su una WebView.

Mostriamo un esempio, nel quale la mappa topografica sarà mostrata su un'area dello schermo pari al quadrato dell'altezza disponibile dello schermo medesimo:

Private WebView1 As WebView
Private Const COPYR As String = "Mappa fornita da: © M.A.S.E. - Geoportale Nazionale"
' I seguenti valori sono riferiti al sistema di coordinate EPGS:3857 WGS 84/Pseudo-Mercator.  [nota 1]
Private Const LONGMIN As Single = 1440000.00  ' La coordinata minima (massima a Ovest) di Longitudine del quadrilatero d'area considerato
Private Const LATMIN As Single = 5000000.00   ' La coordinata minima (massima a Sud) di Latitudine del quadrilatero d'area considerato
Private Const LONGMAX As Single = 1446250.00  ' La coordinata massima a Est di Longitudine del quadrilatero d'area considerato
Private Const LATMAX As Single = 5006250.00   ' La coordinata massima a Nord di Latitudine del quadrilatero d'area considerato

Public Sub _new()

 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
 End With

 With WebView1 = New WebView(Me) As "WebView1"
   .W = 0
   .H = 0
 End With

End


Public Sub Form_Arrange()

' Come nell'esempio precedente si ha che:
' 1) modificando egualmente (ossia aggiungendo o sottraendo un identico valore) al primo e al terzo parametro del TAG "BBOX", ci si sposta in Longitudine;
' 2) modificando egualmente (ossia aggiungendo o sottraendo un identico valore) al secondo e al quarto parametro del TAG "BBOX", ci si sposta in Latitudine;
' 3) modificando egualmente (ossia aggiungendo o sottraendo un identico valore) al terzo e al quarto parametro del TAG "BBOX", si dimensiona (zoom) la mappa mostrata.
 WebView1.Url = "http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/IGM_25000.map&SERVICE=WMS&REQUEST=GetMap" &
                "&FORMAT=image/png&TRANSPARENT=TRUE&STYLES=&VERSION=1.3.0&LAYERS=CB.IGM25000.33&WIDTH=" & CStr(WebView1.H) & "&HEIGHT=" &
                CStr(WebView1.H) & "&CRS=EPSG:900913&BBOX=" & CStr(LONGMIN) & "," & CStr(LATMIN) & "," & CStr(LONGMAX) & "," & CStr(LATMAX)

 Me.Title = COPYR

End


Public Sub WebView1_MouseUp()

' Calcola e mostra la Longitudine e la Latitudine del punto della mappa cliccato con il mouse:
 Dim ln As Float = ((((Mouse.ScreenX - ((Screen.AvailableWidth / 2) - (Screen.AvailableHeight / 2))) * ((LONGMAX - LONGMIN)) / WebView1.H)) + LONGMIN)
 Dim lt As Float = CFloat((WebView1.H - Mouse.Y) * ((LATMAX - LATMIN) / WebView1.H) + LATMIN)

 Me.Title = Space(CInt(Screen.AvailableWidth / 8)) & "Lat. = " & Format(lt, "#.00") & "   Long. = " & Format(ln, "#.00") &
            Space(CInt(Screen.AvailableWidth / 14)) & COPYR

End

Mostrando la mappa topografica sull'intera superficie dello schermo

Un altro esempio, simile al precedente, ma mostrando la mappa topografica sull'intera superficie dello schermo:

Private WebView1 As WebView
Private Const COPYR As String = "Mappa fornita da: © M.A.S.E. - Geoportale Nazionale"
' I seguenti valori sono riferiti al sistema di coordinate EPGS:3857 WGS 84/Pseudo-Mercator.  [nota 1]
Private Const LONGMIN As Single = 1440000.00    ' La coordinata minima (massima a Ovest) di Longitudine del quadrilatero d'area considerato
Private Const LATMIN As Single = 5000000.00     ' La coordinata minima (massima a Sud) di Latitudine del quadrilatero d'area considerato
Private Const ESTENSIONE As Single = 16000.00   ' Imposta lo zoom


Public Sub _new()

 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
 End With

 With WebView1 = New WebView(Me) As "WebView1"
   .W = 0
   .H = 0
 End With

End


Public Sub Form_Arrange()

 Dim LONGMAX, LATMAX As Single
 
 Me.Text = "Attendere !"

' La coordinata massima a Est di Longitudine del quadrilatero d'area considerato:
 LONGMAX = LONGMIN + ESTENSIONE

' La coordinata massima a Nord di Latitudine del quadrilatero d'area considerato:
 LATMAX = LATMIN + ((ESTENSIONE * WebView1.H) / WebView1.W)

 WebView1.Url = "http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/IGM_25000.map&SERVICE=WMS&REQUEST=GetMap" &
                "&FORMAT=image/png&TRANSPARENT=TRUE&STYLES=&VERSION=1.3.0&LAYERS=CB.IGM25000.33&WIDTH=1920&HEIGHT=1048&CRS=EPSG:900913&BBOX=" &
                CStr(LONGMIN) & "," & CStr(LATMIN) & "," & CStr(LONGMAX) & "," & CStr(LATMAX)

End


Public Sub WebView1_Finish()

 Me.Title = COPYR

End


Public Sub WebView1_MouseUp()

 Dim lat, lon, es As Float

 es = ESTENSIONE / WebView1.W

' Calcola e mostra la Longitudine e la Latitudine del punto della mappa cliccato con il mouse:
 lon = LONGMIN + (es * Mouse.X)
 lat = LATMIN + (es * (WebView1.H - Mouse.Y))

 Me.Title = "Lat.: " & Format(lat, "#.00") & "    " & "long.: " & Format(lon, "#.00") & Space(20) & COPYR

End

Copiando dal sito del M.A.S.E. l'indirizzo dell'immagine dell'area mostrata nel visualizzatore

In questo esempio, ampiamente commentato, sarà mostrata dal sito del M.A.S.E. la cartografia IGM 1:25000, e se ne copierà l'indirizzo dell'immagine web per poi salvarla come file immagine.
Per questo esempio è necessario attivare anche i Componenti gb.desktop e gb.desktop.x11 .

Private WebView1 As WebView


Public Sub Form_Open()

  With Me
    .W = Screen.AvailableWidth
    .H = Screen.AvailableHeight
    .Arrangement = Arrange.Fill
  End With
 
  With WebView1 = New WebView(Me) As "WebView1"
' Apre il sito web del visualizzatore di mappe del "Ministro dell'Ambiente e della Sicurezza Energetica":
   .url = "http://www.pcn.minambiente.it/viewer/"
  End With

End


' Dopo aver fatto apparire il layer principale, per far mostrare su questo anche il layer della mappa topografica IGM 1:25000, cliccare sulla voce "Servizi" della finestra di menu denominata "Strumenti" e posta in alto a sinistra del sito.
' Nel sub-menu, che si apre a tendina, fare doppio-clic sulla voce "WMS".
' Nella finestra "", che si apre al centro del video cliccare in sequenza:
'  - sulla voce "Ente..." e scegliere l'opzione "wms.pcn.minambiente.it";
'  - sulla voce "Servzio" e scegliere l'opzione "Cartografia di base - IGM 25.000";
'  - sul tasto virtuale "Visualizza Layer".
' Attivare quindi la copertura o le coperture regionali desiderate (WGS84-UTM32 oppure WGS84-UTM33).
' Cliccare sul tasto virtuale "Aggiungi Layer".
' Aumentare lo zoom della mappa per far apparire la cartografia IGM prescelta.
' Cliccare sul "WebView" con il tasto destro del mouse: si aprirà un Menu a finestra, nel quale scegliere l'opzione "Copy image address".
' Cliccare quindi sul "WebView" con il tasto centrale del mouse: si aprirà la finestra dell'Oggetto "InputBox".
' Cliccare con il tasto destro del mouse all'interno dello spazio testuale della finestra dell'InputBox: nel menu a tendina, che appare, scegliere l'opzione "Paste" (Incolla), per incollare nell'InputBox l'indirizzo che è stato appena prima copiato.
' Premere su "OK".
Public Sub WebView1_MouseUp()

 If Not Mouse.Middle Then Return 
 Dim s As String = InputBox("Immettere indirizzo:")
 If IsNull(s) Then Return 

 WebView1.Url = s

End


' Cliccando con il tasto sinistro del mouse, portare al massimo la dimensione della mappa mostrata.
' Il programma effettuerà una schermata dell'immagine, che però, non essendo estesa al massimo, non sarà di buona qualità visiva.
' Quindi cliccare nuovamente con il tasto sinistro, per ridurla.
' Il programma effettuerà una nuova schermata dell'immagine, che, essendo stata posta precedentemente al massimo della sua dimensione, sarà visivamente ottimale e pertanto sarà quella da preferire.
Public Sub WebView1_MouseDown()

  If Not Mouse.Left Then Return 

  Dim dw As DesktopWindow
  Dim pc As Picture

' Crea un Oggetto "DesktopWindow" che punta all'Oggetto "WebView":
  With dw = New DesktopWindow(WebView1.Handle)
' Esegue una schermata del contenuto corrente dell'Oggetto "WebView", generandone un'immagine di tipo "Picture": [nota 2]
    pc = .GetScreenshot(True)
  End With

' Salva l'immagine di tipo "Picture" finale della pagina web caricata inizialmente:
  pc.Save("/tmp/MASE-IGM_25000.png", 100)

End


Mostrare in un WebView una sola tessera della mappa topografica IGM 1:25000

Per mostrare in un "WebView" una sola tessera della mappa topografica IGM 1:25000, fornita dal M.A.S.E., si dovranno individuare i numeri corrispondenti alle coordinate "x" e "y" di ciascuna tessera tenendo bene in conto del valore dello zoom prescelto.

Mostriamo un esempio, nel quale lo zoom è impostato a "11".
E' necessario ricordare che:
- le tessere in questione hanno una dimensione 512x512 pixel;
- in questo caso il protocollo per individuare la tessera è: "zoom", "y" e "x";
- per mostrare la tessera contigua, bisognerà cliccare su un lato della cornice arancione che inquadra la tessera corrente;
- poiché si provvederà a scaricare i dati immagine di ciascuna tessera visualizzata e contestualmente a salvarli in file immagine in un'apposita cartella, è necessario attivare anche i Componenti gb.net e gb.net.curl .

Private Const TESSERA As Short = 512  ' Indica la dimensione in pixel di ciascuna tessera costituente la mappa IGM 1:25000
Private Const ZOOM As Byte = 11       ' Imposta lo zoom dell'immagine riprodotta su ciascuna tessera
Private Const COPYR As String = "Mappa fornita da: © M.A.S.E. - Geoportale Nazionale"
Private WebView1 As WebView
Private Panel1 As Panel
Private Label1 As Label
Private Label2 As Label
Private Label3 As Label
Private y As Integer     ' Indica lo spostamento in Latitudine (Nord-->Sud)
Private x As Integer     ' Indica lo spostamento in Longitudine (Ovest-->Est)


Public Sub _new()

 With Me
   .W = Screen.AvailableWidth * 0.39
   .H = Screen.AvailableHeight * 0.71
   .Center
 End With
 With Panel1 = New Panel(Me) As "Panel1"
   .X = 50
   .Y = 50
   .W = 600
   .H = 600
   .Background = Color.Orange
 End With
 With Label1 = New Label(Me)
   .X = Me.W * 0.9
   .Y = Me.H * 0.3
   .Alignment = Align.Right
   .W = .Font.TextWidth(.Text)
   .H = 20
 End With
 With Label2 = New Label(Me)
   .X = Me.W * 0.9
   .Y = Label1.Y + Label1.H + 10
   .Alignment = Align.Right
   .W = .Font.TextWidth(.Text)
   .H = 20
 End With
 With Label3 = New Label(Me)
   .X = Me.W * 0.9
   .Y = Label2.Y + Label2.H + 10
   .Alignment = Align.Right
   .W = .Font.TextWidth(.Text)
   .H = 20
 End With

 If Not Exist("/tmp/TESSERE") Then MkDir "/tmp/TESSERE"

End 

Public Sub Form_Open()

' Imposta le coordinate "y" e "x" della tessera iniziale da mostrare:
 y = 2648
 x = 2722

 AggiornaLabel()
 Ricarica()

 Me.Title = COPYR

End


Public Sub Panel1_MouseUp()

 If Mouse.X < WebView1.X Then x -= 1
 If Mouse.X > (WebView1.X + WebView1.W) Then x += 1

 If Mouse.Y < WebView1.Y Then y -= 1
 If Mouse.Y > (WebView1.Y + WebView1.H) Then y += 1

 AggiornaLabel()

 Ricarica()

End


Private Procedure AggiornaLabel()

 Label1.Text = "x = " & Format(x, "########")
 Label1.W = Label1.Font.TextWidth(Label1.Text)
 Label2.Text = "y = " & Format(y, "########")
 Label2.W = Label2.Font.TextWidth(Label2.Text)
 Label3.Text = "z = " & Format(ZOOM, "########")
 Label3.W = Label3.Font.TextWidth(Label3.Text)

End


Private Procedure Ricarica()

 Dim prc As String = "http://www.pcn.minambiente.it/arcgis/rest/services/immagini/IGM_25000/MapServer/tile" &/
                      CStr(ZOOM) &/ CStr(y) &/ CStr(x)
 Dim tp As New HttpClient
 Dim s As String

 If Object.IsValid(WebView1) Then WebView1.Delete

 With WebView1 = New WebView(Panel1) As "WebView1"
   .X = 44
   .Y = 44
   .W = TESSERA
   .H = TESSERA
   .Url = prc
 End With

 s = tp.Download(prc)
 tp.Close

 File.Save("/tmp/TESSERE" &/ CStr(ZOOM) & "-" & CStr(y) & "-" & CStr(x) & ".png", s)

End

Se si vuole - ad esempio - impostare lo zoom a 10, allora imposteremo (volendo restare nella zona già individuata) i valori come seguono:

Private Const ZOOM As Byte = 10
......
 ' Imposta le coordinate "y" e "x" della tessera iniziale da mostrare:
y = 1986
x = 2042
......


Note

[1] Vedere anche le seguenti pagine web:

[2] Sulle modalità per ottenere l'immagine di una pagina web, vedere la seguente pagina: Ottenere l'immagine di una pagina web