lunes, 12 de febrero de 2018

Añadiendo Google Maps Satellite Service con PyQGIS

Añadir el servicio de Google Maps Satellite a través de código PyQGIS es muy sencillo; tal como se evidencia a continuación. Los detalles de la conexión pueden visualizarlos en este link.

1
2
3
4
import requests
service_url = "https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}"
service_uri = "type=xyz&zmin=0&zmax=21&url="+requests.utils.quote(service_url)
tms_layer = iface.addRasterLayer(service_uri, "Google Sat", "wms")

Después de ejecutado el código anterior en la Python Console of QGIS se observa algo similar a la imagen siguiente:


Si cargamos una capa ráster (DEM con resolución de 73.9887 m) y hacemos Zoom In a la misma se obtiene:


Desmarcándola en la Map Legend y cambiando el CRS al que ésta posee de origen se tiene lo siguiente:


La imagen anterior tiene una resolución superior a los 150 m por lo que su utilidad pudiese parecer limitada. Por tanto, hacemos nuevamente un Zoom In arbitrario a un área dentro del huso correspondiente (12 N) y fijamos la escala a 1:2000. Esto resultará en una resolución sub métrica. El resultado se observa en la imagen siguiente:


La capa ráster anterior tiene un driver 'wms' y por tanto no admite la utilización de una herramienta como clipper. Por tanto, la estrategía es obtener cuál es la extensión del Map Canvas en unidades de mapa y añadirla a la imagen salvada de éste mediante el comando gdal_translate.

La serie siguiente de comandos producen el orden correcto de parámetros para la extensión a ser usada en el comando gdal_translate con el modificador -a_ullr.

1
2
3
4
5
6
7
8
mapcanvas = iface.mapCanvas()
mapcanvas.saveAsImage("/home/zeito/Desktop/convolutions-opencv/test.tif")

extent = mapcanvas.extent()
xmin, ymin, xmax, ymax = extent.toRectF().getCoords()
xmin, ymax, xmax, ymin

438819.2292659355 4457217.5520328125 439505.5584333043 4456912.752032501

Una vez ejecutados los comandos anteriores en la Python Console, nos ubicamos en el directorio donde está alojada la imagen salvada del Map Canvas y se ejecuta, en Consola de Bash, el comando siguiente:

gdal_translate -a_srs EPSG:32612 -a_ullr 438819.2292659355 4457217.5520328125 439505.5584333043 4456912.752032501 test.tif utah2.tif

Al cargar el ráster producido (resolución 0.529167x0.529167 m2) se puede observar en la imagen siguiente que éste empalma de manera perfecta en la zona correspondiente una vez desmarcada la capa wms.


El proceso anterior se puede automatizar completamente en un script de Python y su utilidad quedaría ampliada si se produjeran tiles contiguos con la misma resolución.

Nota:

Este código funciona en QGIS3.

1
2
3
4
import requests
service_url = "mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}" 
service_uri = "type=xyz&zmin=0&zmax=21&url=https://"+requests.utils.quote(service_url)
tms_layer = iface.addRasterLayer(service_uri, "Google Sat", "wms")


2 comentarios:

Anacaona dijo...

Hola, como siempre me parecen muy interesantes tus post. Muchas gracias.

He tratado de ejecutar el código en QSID desde la consola, pero da error en la primera linea

import requests

Pienso que no tengo esa librería, y podría ser porque tengo la v2.14 instalada, por un tema de limitaciones de determinados pluggins que hemos programado.

Aunque a lo mejor me puedes dar una idea para solucionarlo.

Muchas gracias y un Saludo
Agustín Solabre

José Guerrero dijo...

Hola, Agustín

Gracias por tu comentario.

Yo importé la librería en la versión 2.18 y no hay problemas. Baja e instala dicha versión de QGIS en tu máquina. En Windows pueden coexistir y ejecutarse independientemente tus dos versiones de QGIS (la 2.14 y la 2.18).

Por otra parte, no creo que exista mucha incompatibilidad para los plugins creados para ambas versiones. Si ocurre, es sólo cuestión de leer los mensajes de error y seguir las instrucciones del intérprete para la corrección.

Saludos