Utilizzare in una MapView mappe fornite secondo lo standard WMS (Web Map Service)

Da Gambas-it.org - Wikipedia.

Come è noto, il Componente gb.map di Gambas è in grado di ottenere e gestire mappe predefinite di servizi WMTS (Web Map Tile Service) che utilizzano il sistema di coordinate EPSG:4326.


Oltre ai servizi WMTS, il componente può anche ottenere dati da servizi WMS (Web Map Service), ma ciò richiede più parametrizzazione.
Esempi di questi casi sono:

............


I servizi WMTS e WMS sono definiti dall'Open Geospatial Consortium (OGC) ed è stabilito che per il WMTS, il livello di zoom 1 è un mosaico di 2x2 tessere, il livello 2 di 4x4, e così via, ed è quello che contempla il Componente gb.map. Ma definisce anche un'altra normativa in cui il livello 1 di zoom è un mosaico di 4x2 tessere, il livello 2 di 8x4 tessere, e così via. Alcuni server hanno questa seconda normativa e falliscono nel loro uso con il Componente gb.map.

E' bene ricordare che, anche se sono servizi liberi, è opportuno riconoscere l'autore delle informazioni con la proprietà Copyright.


Procedura per impostare correttamente il codice per visualizzare le mappe da un servizio WMS

Innanzitutto bisogna individuare un servizio WMS che mette a disposizione mappe (che solitamente rappresentano porzioni di territorio).
Qui prenderemo - come esempio - le mappe relative alla Carta Topografica d'Italia in scala 1:25.000, edita dall'I.G.M., e messe a disposizione del Servizio Geologico d'Italia dell'I.S.P.R.A., e raggiungibile al seguente indirizzo web:

http://portalesgi.isprambiente.it/en/categorie-servizi-wms

Cliccheremo all'interno della pagina del Geoportale dell'I.S.P.R.A. sul collegamento "Raster Data", raggiungibile anche al seguente indirizzo web:

http://portalesgi.isprambiente.it/lista-servizi-wms/Raster%20Data

Cercheremo la mappa prescelta (in questo nostro esempio sarà la mappa 1:25000 della Regione Lazio, che si troverà nella lista al di sotto della voce "Raster Topografia IGM 1:25.000".
E' fondamentale visualizzare e prendere cognizione delle "capacità" della mappa da utilizzare. Pertanto nel nostro esempio cliccheremo sul collegamento "GetCapabilities" sulla destra della riga relativa alla mappa della Regione Lazio.
All'interno della pagina viene mostrato un codice in linguaggio "xml".
Innanzitutto si cercherà l'URL del ServerMap, che si troverà all'interno dell'informazione individuata dall'etichetta <OnlineResource ....>:

http://sgi2.isprambiente.it/arcgis/services/raster/igm25k_lazio_wgs/ImageServer/WMSServer

Nel codice Gambas si dovranno inserire le informazioni:

  • l'informazione contenuta nel livello <Name> dell'etichetta <Service>:
<Name>WMS</Name>
  • l'informazione <GetMap> quale sottolivello dell'etichetta <Request>.


Si cercherà poi l'etichetta <Layer>, che contiene le informazioni dei vari strati, e in questo caso si trova un livello con etichetta <Title>:

<Title>igm25k_lazio_wgs</Title>

Nella successiva etichetta <Abstract> è riportata una breve sintesi del contenuto:

<Abstract>Carta topografia regione lazio scala 1:25.000</Abstract>

Altre informazioni necessarie sono:

  • l'etichetta <CRS>, che indica quale sistema geografico è utilizzato dalla mappa. Si può notare che vi sono diversi sistemi (individuati con l'etichetta <CRS>) supportati dalla mappa. Si può scegliere uno qualsiasi, noi preferiamo il sistema EPSG:4326:
<CRS>EPSG:4326</CRS>
  • l'etichetta <BoundingBox ....>, che specifica i limiti dell'intera mappa che sarà mostrata.


Bisogna individuare in tal caso i valori conformi al sistema geografico scelto; nel nostro caso "EPSG:4326".
Per il sistema EPSG:4326 vediamo che - nel nostro esempio - i limiti sono:

 <BoundingBox CRS="EPSG:4326" minx="40.781553" miny="11.449740" maxx="42.921401" maxy="14.086235"/>

In questo caso la relazione è:

minx = {lat2}
miny = {lon}
maxx = {lat}
maxy = {lon2}
  • la versione, che dovrà essere cercata all'interno della pagina, e che nel nostro esempio si troverà specificata nella prima riga:
<WMS_Capabilities version="1.3.0" ....>
  • l'etichetta <layer>, che rappresenta lo strato da visualizzare. Nel nostro caso verrà presa dal sub-livello "<Name>" dell'etichetta "<layer>":
igm25k_lazio_wgs
  • l'etichetta format, che rappresenta il formato dell'immagine esportata. Vi possono essere diversi formatp immagine. Nel nostro caso si imposterà "image/png".


Oltre i precedenti parametri parte gli altri parametri per un WMS bisogna specificare:

  • Dimensione dell'immagine in coordinate. Di solito sono gli angoli SW e NE, cioè le coppie minima e massima della latitudine-longitudine, ma possono variare gli angoli (NW-SE), come l'ordine: latitudine-longitudine o longitudine-latitudine.
  • dimensione dell'immagine in pixel.


Il componente gb.map costruisce l'url in modo dinamico, ma è un componente pensato per servizi WMTS, dove la dimensione dell'immagine è fisso a 256x256 pixel.
Per un determinato zoom il Componente gb.map calcola le coordinate di ogni pezzo di mappa di 256x256 che deve chiedere al servizio WMS e costruisce l'url per ogni pezzo di mappa a partire dalle proprietà della classe _Maptile.
In particolare, il componente riceve il dato di tipo String "{lat2},{lon},{lat},{lon2}" e fa le sostituzioni:

sTemp = Replace(sTemp, "{lat}", CStr(hBound.Lat))
sTemp = Replace(sTemp, "{lon}", CStr(hBound.Lon))
sTemp = Replace(sTemp, "{lat2}", CStr(hBound.lat2))
sTemp = Replace(sTemp, "{lon2}", CStr(hBound.lon2))

Se si osserva la classe "Mapbounds" di gb.map, si potrà notare che utilizza le proprietà .Lat, .Lat2, .Lon, .Lon2 per riferirsi ai 4 angoli.
Per le mappe WMTS riceve i dati di tipo String {x},{y},{z} e li sostituisce in modo simile, ma invece di coordinate, mette la riga e colonna della tessitura nel mosaico della mappa.

Detto ciò, nel codice Gambas avremo:
- il parametro bbox: parte variabile dell'url secondo la porzione della mappa che visualizziamo. La documentazione lo descrive come l'estensione (afferente al riquadro di selezione) dell'immagine esportata. Tenendo conto della relazione sopra esposta riguardo alle coordinate geografiche riportate nel livello dell'etichetta <BoundingBox ....>, imposteremo la sintassi del parametro "bbox" con: "{lat2},{lon},{lat},{lon2}".

- i parametri "width" e "height": che rappresentano la dimensione in pixel di ogni tile immagine risultante (solitamente questa dimnesione è 256x256; ed è la dimensione supportata dal Componente gb.map).


Va sottolineato che nel codice Gambas va posto a "True" la proprietà ".UseWebMapService" della Classe nascosta "_MapTile".

Un esempio pratico di codice è quello mostrato nel paragrafo seguente, nel quale si mostrerà la mappa 1:25000 della Regione Lazio, basata sulle carte I.G.M., e fornita dal Servizio Geologico d'Italia dell'I.S.P.R.A..

Usare le mappe topografiche IGM 1:25000 di ciascuna Regione, fornite dal Servizio Geologico d'Italia dell'I.S.P.R.A.

Mostriamo un esempio pratico, usando le carte topografiche 1:25000, edite dall'I.G.M. e messe a disposizione dal Servizio Geologico d'Italia dell'I.S.P.R.A. [Nota 3], relative all'intero territorio della Regione Lazio:

Private mv As MapView


Public Sub Form_Open()
 
 Dim tile As _MapTile
 
 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
 End With
 
 With mv = New MapView(Me) As "MapView1"
   .Background = Color.White
   .Font.Size = 6
   .Map.Zoom = 14
   .Map.Center = MapPoint(41.890250, 12.492295)
 End With
 
 With tile = mv.Map.AddTile("Italia Lazio", "http://sgi2.isprambiente.it/arcgis/services/raster/igm25k_lazio_wgs/ImageServer/WMSServer?")
   .MaxBounds = MapBounds(MapPoint(40.781553, 11.449740), MapPoint(42.921401, 14.086235))
   .UseWebMapService = True
   .Copyright = "© I.S.P.R.A. - Servizio Geologico d'Italia - http://portalesgi.isprambiente.it/it"
   .WMSArgs!service = "WMS"
   .WMSArgs!request = "GetMap"
   .WMSArgs!version = "1.3.0"
   .WMSArgs!layers = "igm25k_lazio_wgs"
   .WMSArgs!crs = "EPSG:4326"
   .WMSArgs!bbox = "{lat2},{lon},{lat},{lon2}"
   .WMSArgs!format = "image/png"
   .WMSArgs!width = 256
   .WMSArgs!height = 256
 End With
 
End
 

Public Sub MapView1_MouseUp()
 
 Dim pt As New Point(Mouse.X, Mouse.Y)
 
' Otteniamo le coordinate geografiche del punto della carta topografica sul quale si è cliccato con il mouse:
 Me.Text = "Lat. " & Format(mv.Map.PixelToMapPointRel(pt).Lat, "0.000000") &
           " - Lon. " & Format(mv.Map.PixelToMapPointRel(pt).Lon, "0.000000")
 
End


Usare la mappa topografica IGM 1:25000 fornita dal Geoportale Nazionale del Ministero dell'Ambiente e della Sicurezza Energetica

Mostriamo un esempio pratico, usando le carte topografiche 1:25000, edite dall'I.G.M. e messe a disposizione dal Geoportale Nazionale del Ministero dell'Ambiente e della Sicurezza Energetica.

Nella pagina del servizio di consultazione WMS cercheremo nell'apposito catalogo WMS il collegamento alle capabilities relative alla "Cartografia di base - IGM 25.000", ed inseriremo le necessarie informazioni nel codice come appresso rappresentato:

Private mv As MapView


Public Sub Form_Open()
 
 Dim tile As _MapTile
 
 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
 End With
 
 With mv = New MapView(Me) As "MapView1"
   .Background = Color.White
   .Font.Size = 6
   .Map.Zoom = 14
   .Map.Center = MapPoint(41.8903, 12.492255)
 End With
 
 With tile = mv.Map.AddTile("Mappa IGM 1:25000", "http://wms.pcn.minambiente.it/ogc?")
   .MaxBounds = MapBounds(MapPoint(40.781553, 11.449740), MapPoint(42.921401, 14.086235))
   .UseWebMapService = True
   .Copyright = "© Ministero dell'Ambiente e della Sicurezza Energetica - Geoportale Nazionale"
   .WMSArgs!map = "/ms_ogc/WMS_v1.3/raster/IGM_25000.map"
   .WMSArgs!service = "WMS"
   .WMSArgs!request = "GetMap"
   .WMSArgs!version = "1.3.0"
   .WMSArgs!layers = "CB.IGM25000.33"
   .WMSArgs!crs = "EPSG:4326"
   .WMSArgs!bbox = "{lat2},{lon},{lat},{lon2}"
   .WMSArgs!format = "image/png"
   .WMSArgs!width = 256
   .WMSArgs!height = 256
 End With
 
End
 

Public Sub MapView1_MouseUp()
 
 Dim pt As New Point(Mouse.X, Mouse.Y)
 
' Otteniamo le coordinate geografiche del punto della carta topografica sul quale si è cliccato con il mouse:
 Me.Text = "Lat. " & Format(mv.Map.PixelToMapPointRel(pt).Lat, "0.000000") &
           " - Lon. " & Format(mv.Map.PixelToMapPointRel(pt).Lon, "0.000000") &
           " - Zoom " & CStr(mv.Map.Zoom)
  
End

Al riguardo notiamo che:
1) è visualizzabile soltanto un livello di zoom;
2) viene visualizzata soltanto una porzione di territorio;
3) il server remoto impone un'attesa di almeno 25 secondi dalla chiusura del programma, affinché possa essere visualizzata nuovamente una mappa.


Note

[1] Questa pagina è stata redatta seguendo le preziose indicazioni fornite da gatoviejo, membro del forum www.gambas-es.org.
[2] Vedere qui: http://sgi2.isprambiente.it/arcgis/sdk/rest/index.html#/Export_Image/02ss00000075000000/
[3] Vedere anche questa pagina: Utilizzare il Geoportale del Servizio Geologico d'Italia dell'I.S.P.R.A.: Utilizzare il codice Gambas


Riferimenti