https://foro.gambas-es.org/viewtopic.php?f=4&t=7996&p=48081#p48081
-----------------------------------
gatoviejo
Domingo, 26 Abril 2020, 19:31

Mapas Locales En Gb.map
-----------------------------------
Buenas,

He estado jugando con el componente gb.Map e incluso revisando su código y creo que al final entiendo más o menos como utilizarlo para visualizar mapas. O como mínimo he conseguido visualizar otros mapas además de los consabidos openstreetmap o google.

Para empezar, este componente puede obtener mapas, por defecto, de servicios WMTS (web map tile service) que utilizen el sistema de coordenadas epsg:4326. Un ejemplo podrían ser los siguientes mapas:

España (https://www.ign.es)
Cartografía:
[code linenumbers=false syntax=gambas]MapView1.Map.AddTile("España topo", "http://www.ign.es/wmts/mapa-raster?Layer=MTN&Style=default&TileMatrixSet=GoogleMapsCompatible&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image/jpeg&TileMatrix={z}&TileCol={x}&TileRow={y}")
[/code]
Ortofotos:
[code linenumbers=false syntax=gambas]MapView1.Map.AddTile("España orto", "http://www.ign.es/wmts/pnoa-ma?Layer=OI.OrthoimageCoverage&Style=default&TileMatrixSet=GoogleMapsCompatible&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image/png&TileMatrix={z}&TileCol={x}&TileRow={y}")
[/code]

Euskadi (http://www.geo.euskadi.eus)
Cartografía:
[code linenumbers=false syntax=gambas]MapView1.Map.AddTile("Euskadi topo", "https://www.geo.euskadi.eus/geoeuskadi/rest/services/U11/WMTS_TOPO/MapServer/WMTS/tile/1.0.0/U11_WMTS_TOPO/default/default028mm/{z}/{y}/{x}.png")
[/code]
Ortofotos:
[code linenumbers=false syntax=gambas]MapView1.Map.AddTile("Euskadi orto", "https://www.geo.euskadi.eus/geoeuskadi/rest/services/U11/WMTS_ORTO/MapServer/WMTS/tile/1.0.0/U11_WMTS_ORTO/default/default028mm/{z}/{y}/{x}.png")
[/code]

Catalunya (https://www.icgc.cat)
Cartografía:
[code linenumbers=false syntax=gambas]MapView1.Map.AddTile("Catalunya topo", "http://geoserveis.icc.cat/icc_mapesmultibase/noutm/wmts/topo/GRID3857/{z}/{x}/{y}.jpeg")
[/code]
Ortofotos:
[code linenumbers=false syntax=gambas]MapView1.Map.AddTile("Catalunya orto", "http://geoserveis.icc.cat/icc_mapesmultibase/noutm/wmts/orto/GRID3857/{z}/{x}/{y}.jpeg")
[/code]

Las diferencias entre los mapas estatales y autonómicos vienen dadas por la fecha de realización de los mapas (unos pueden ser más modernos que otros) o ser más detallados, pero siempre hay diferencias estéticas.


En el caso en que el sistema de coordenas utilizado por el servicio sea otro, hay que indicarlo en la propiedad WMSProjection. Por ejemplo en Navarra:

Navarra (https://idena.navarra.es)
Cartografía:
[code linenumbers=false syntax=gambas]With MapView1.Map.AddTile("Navarra topo", "https://idena.navarra.es/ogc/wmts/mapaTopografico/default/epsg25830/{z}/{y}/{x}.png")
   .WMSProjection = "epsg:25830"
End With
[/code]
Ortofotos:
[code linenumbers=false syntax=gambas]With MapView1.Map.AddTile("Navarra orto", "https://idena.navarra.es/ogc/wmts/ortofoto2019/default/epsg25830/{z}/{y}/{x}.jpeg")
   .WMSProjection = "epsg:25830"
End With
[/code]

Además de los servicios WMTS, el componente también puede obtener datos de servicios WMS (web map service), pero se requiere más parametrización. Ejemplos de estos casos son:

Andorra (https://www.cartografia.ad/geoportal)
Cartografía:
[code linenumbers=false syntax=gambas]With MapView1.Map.AddTile("Andorra topo", "https://www.ideandorra.ad/Serveis/wms_10k2003raster/ows?")
   .MaxBounds = MapBounds(MapPoint(42.67791461218689, 1.8089496730257377), MapPoint(42.405083084903076, 1.379699166254689))
   .WMSProjection = "epsg:27563"
   .UseWebMapService = True
   .WMSArgs!service = "WMS"
   .WMSArgs!version = "1.1.0"
   .WMSArgs!request = "GetMap"
   .WMSArgs!layers = "raster_10k_2003"
   .WMSArgs!bbox = "{lon},{lat2},{lon2},{lat}"
   .WMSArgs!width = 256
   .WMSArgs!height = 256
   .WMSArgs!srs = "EPSG:27563"
   .WMSArgs!format = "image/jpeg"
End With
[/code]
Ortofotos:
[code linenumbers=false syntax=gambas]With MapView1.Map.AddTile("Andorra orto", "https://www.ideandorra.ad/Serveis/wmsorto2003/ows?")
   .MaxBounds = MapBounds(MapPoint(42.67791461218689, 1.8089496730257377), MapPoint(42.405083084903076, 1.379699166254689))
   .WMSProjection = "epsg:27563"
   .UseWebMapService = True
   .WMSArgs!service = "WMS"
   .WMSArgs!version = "1.1.0"
   .WMSArgs!request = "GetMap"
   .WMSArgs!layers = "wmsorto2003:Orto5000_2003"
   .WMSArgs!bbox = "{lon},{lat2},{lon2},{lat}"
   .WMSArgs!width = 256
   .WMSArgs!height = 256
   .WMSArgs!srs = "EPSG:27563"
   .WMSArgs!format = "image/jpeg"
End With
[/code]

Francia
Cartografía:
[code linenumbers=false syntax=gambas]With MapView1.Map.AddTile("Francia topo", "http://mapsref.brgm.fr/wxs/refcom-brgm/refign?")
   .MaxBounds = MapBounds(MapPoint(51.1752, 10.8198), MapPoint(40.8523, -5.66635))
   .UseWebMapService = True
   .WMSArgs!service = "WMS"
   .WMSArgs!version = "1.1.1"
   .WMSArgs!request = "GetMap"
   .WMSArgs!layers = "FONDS_SCAN"
   .WMSArgs!bbox = "{lon},{lat2},{lon2},{lat}"
   .WMSArgs!width = 256
   .WMSArgs!height = 256
   .WMSArgs!srs = "EPSG:4326"
   .WMSArgs!format = "image/jpeg"
End With
[/code]
Ortofotos:
[code linenumbers=false syntax=gambas]With MapView1.Map.AddTile("Francia orto", "http://mapsref.brgm.fr/wxs/refcom-brgm/refign?")
   .MaxBounds = MapBounds(MapPoint(51.1752, 10.8198), MapPoint(40.8523, -5.66635))
   .UseWebMapService = True
   .WMSArgs!service = "WMS"
   .WMSArgs!version = "1.1.1"
   .WMSArgs!request = "GetMap"
   .WMSArgs!layers = "ORTHO"
   .WMSArgs!bbox = "{lon},{lat2},{lon2},{lat}"
   .WMSArgs!width = 256
   .WMSArgs!height = 256
   .WMSArgs!srs = "EPSG:4326"
   .WMSArgs!format = "image/jpeg"
End With
[/code]

Según el sistema operativo que estemos utilizando, puede ser necesario instalar la librería gdal y/o definir una variable de entorno:
[code linenumbers=false syntax=gambas]apt install gdal-bin python-gdal
export PROJ_LIB=/usr/share/proj
[/code]

Con todo esto, he tenido también errores, en concreto mapas de Italia, Aragón y WMTS de Andorra.
Para Italia consigo descargar una imagen si pego la url directamente en el explorador, pero si lo hago a través del componente, el servicio se bloquea y da error por "estar ocupado". He leído que hay servidores que si detectan descargas masivas se autoprotegen y bloquean la ip peticionaria. Ignoro si es ese el caso.

Los servicios WMTS y WMS están definidos por el Open Geospatial Consortium (OGC) y se establece que para el WMTS, el nivel de zoom 1 es un mosaico de 2x2 teselas, el nivel 2 de 4x4, y así sucesivamente y es lo que contempla el componente gb.map. Pero también define otra normativa donde el nivel 1 de zoom es un mosaico de 4x2 teselas, el nivel 2 de 8x4 teselas, y así sucesivamente. Los servidores de Aragón y Andorra tienen esa segunda normativa y fallan en el componente gb.map.

Espero que os sea de utilidad esta información.  Recordad que aunque sean servicios libres, al menos particularmente, a veces tienen un coste para utilizarlos profesionalmente. Y no está de más reconocer la autoría de la información con la propiedad Copyright.


