Cómo realizar un análisis de visibilidad con QGIS

análisis de visibilidad con QGISEl objeto del análisis de visibilidad es determinar las áreas visibles desde cada punto o conjunto de puntos, bien simultáneamente o en secuencia, con vistas a la posterior evaluación de la medida en que cada área contribuye a la percepción del paisaje y la obtención de ciertos parámetros globales que permitan caracterizar un territorio en términos visuales.

Los análisis de visibilidad son de gran interés, especialmente en trabajos medioambientales, siendo muy útil en la evaluación de impacto ambiental. En definitiva, se trata de conocer qué áreas pueden ser vistas desde uno o más puntos dados, o lo que es igual, desde que áreas pueden ser vistos esos mismos puntos.

horizonte análisis de visibilidad con QGIS

Dada una superficie del terreno y un punto de vista, el problema clásico de la visibilidad es detectar la porción de terreno visible desde dicho punto, lo que se conoce como la cuenca visual.

Para la realización de este tipo de análisis es imprescindible contar con información altimétrica de la zona de estudio, pues solo a partir de ella es posible predecir, de forma teórica, que zonas son visibles o no.

En los modelos raster la altimetría se asocia al centro de cada celdilla y, por ende, a toda su superficie. Como consecuencia, la unidad mínima de información es la celdilla, y a ella se adjudican, en su caso, los valores de Visto/No Visto.

En el presente tutorial vamos a mostraros cómo realizar un análisis de visibilidad con QGIS, empleando el plugin Visibility Analysis.

Si deseas seguir el tutorial, puedes descargarte los datos para el mismo pinchando aquí.

Factores que influyen en el análisis

Un dato a tener en cuenta es que, si bien el relieve se puede considerar como elemento esencial de este tipo de estudios, no es el único, pues hemos de considerar los siguientes elementos que influyen, a veces de forma determinante, en el análisis:

  • Aunque en ocasiones aparece el suelo o rocas desnudas, generalmente suele estar cubierto por algo que dificulta la visibilidad. Este componente puede ser desde la cobertura vegetal hasta núcleos urbanos.
  • El hecho de que La Tierra sea redonda hace que, a medida que un elemento se aleja en el espacio, su altura disminuya. Esta pérdida de altura relativa se ve compensada por la refracción de la luz.
  • En tercer lugar, habría que conocer la altura del observador sobre el terreno, la altura de lo que se observe, y la máxima distancia a la que algo puede ser distinguido.
  • Por último, hay que tener muy en cuenta que la localización de las telecomunicaciones sólo se relacionan de un modo muy general con los análisis de visibilidad.

relieve

¿En qué consiste el plugin Visibility Analysis?

El plugin Visibility Analysis permite realizar avanzados análisis de visibilidad con QGIS, devolviendo una imagen ráster que indica valores sí/no para cada píxel.

Entre sus principales características se encuentran:

  • Generación de visibilidad Con ella podemos conocer la cuenca visual desde un punto dado, es posible generarlas además de forma acumulada desde más de un punto
  • Extracción del horizonte visible. Permite conocer el horizonte topográfico que puede ver el observador desde un punto dado.
  • Profundidad de invisibilidad. Indica el tamaño que debe de tener un objeto para ser visible desde el punto de observación.
  • Generación de redes de intervisibilidad. Crea una red de relaciones visuales entre dos conjuntos de puntos (o dentro de un mismo conjunto).

Instalación desde los complementos de QGIS

Se trata de un plugin que no se encuentra instalado por defecto en el núcleo de plugins de QGIS por lo que, en primer lugar, accede al Administrador e Instalador de complementos (menú Complementos) y digitaliza en el buscador Visibility Analysis.

Selecciona el plugin en la ventana de resultados y haz clic sobre el botón Instalar complemento.

Una vez instalado, podrás acceder al plugin a través de la Caja de herramientas de Procesos.

Cálculo de la cuenca visual

Con el plugin Visibility Analysis ya instalado ya podemos comenzar el análisis de visibilidad con QGIS de nuestra zona de estudio. En este caso calcularemos la cuenca visual acumulada de un conjunto de puntos localizados en una serie de municipios de la provincia de Cádiz (España).

Carga en QGIS tanto el MDT, que guarda los datos de altimetría de la zona de estudio, MDT_1050_100.tiff, como la capa que contiene los puntos de observación (con los municipios indicados) nucleos_1050_100.shp

Puedes crear un Hillshade y clasificar los valores del MDT para mejorar el aspecto visual de los resultados, como te mostramos en la captura de pantalla anterior.

Accede a la Caja de herramientas de Procesos/Visibility Analysis y, en Analysis, selecciona la herramienta Create viewpoints. Introduce los siguientes parámetros en la herramienta:

  • Observer location: nucleos_1050_100
  • Digital elevation model: MDT_1050_100
  • Radius of analysis: 5000
  • Field value for observed height: Indica el campo ALTURA (que guarda la altura de cada punto de observación)
  • Observer height: deja el valor por defecto pues indicamos el valor en el campo ALTURA
  • Output layer: Guarda el resultado como viewshed_points (por ejemplo)

Haz clic en Ejecutar y carga la capa resultado a la interfaz.

Accede ahora a la herramienta Viewshed para generar la cuenca visual.

Rellena los parámetros del siguiente modo:

  • Observer location: viewshed_points
  • Digital elevation model: MDT_1050_100
  • Atmospheric refraction: Deja el valor por defecto
  • Output file: Denomina al resultado, por ejemplo, viewshed.tif

Haz clic en Ejecutar y tras unos segundos aparecerá el ráster resultado con la visibilidad acumulada para los puntos de observación indicados en los municipios.

Representación de las celdillas visibles

Para visualizar mejor aquellas celdillas visibles en nuestro estudio, podemos crear una máscara que podemos sobreponer al MDT.

Para ello, accede a la Calculadora ráster desde el menú Ráster e introduce los siguientes parámetros:

  • Expresión de la calculadora de campos: «Viewshed_cumulative@1» = 0
  • Capa de salida: Viewshed_mask
  • Deja el resto de parámetros por defecto

De este modo, otorgamos el valor 0 para todas aquellas celdillas visibles en el archivo ráster generado con Visibility Analysis.

Accede a la pestaña Simbología de viewshed_mask y establece los siguientes parámetros:

  • Tipo de renderizado: Pseudocolor monobanda
  • Banda: Banda 1 (Gray)
  • Interpolación de color: Lineal
  • Modo: Intervalo igual
  • Classes: 2

Haz doble clic ahora sobre la simbología del valor 0 y establece el valor de opacidad en un 0%.

Acepta todos los cambios y vuelve a la interfaz de QGIS. Sitúa la máscara por encima del MDT de partida (MDT_1050_100) y observa el resultado.

Viewshed_Mask

Si quieres aprender a realizar análisis de visibilidad con QGIS y trabajar de forma más profesional con QGIS, inscríbete ya en nuestro curso online de QGIS avanzado.

12 comentarios en «Cómo realizar un análisis de visibilidad con QGIS»

  1. Muchas gracias también de mi parte por éstos tutoriales tan concisos, Diego!

    Hay alguna manera de conocer, a partir del resultado de cuenca visual acumulada de un conjunto de puntos, cuál es la cuenca visual de cada punto de observación? De lo contrario, si se realiza una cuenca visual considerando cada punto de observación de manera independiente se genera un archivo raster para cada punto de observación, lo cuál puede ser problemático si tenemos una capa de 9000 puntos de observación (como es mi caso). Muchas gracias por tu tiempo, paciencia y ayuda!

    • Hola Alex,

      Mediante el plugin Viewshed no es posible calcular la cuenca visual desde cada punto de observación de forma independiente, por lo que podrías dividir el fichero en conjuntos de puntos atendiendo, por ejemplo, a proximidad entre ellos.

      Un saludo!

  2. Hola Diego, son estupendos estos tutoriales. ¿Serías tan amable de explicar algo más estas opciones de settings?:

    – Search radius: ¿entiendo que 5 km es más o menos la distancia que podemos percibir desde un punto dado?
    – ¿La altura del observador (observer height) se refiere a la altura sobre el nivel del mar?
    – Y target height, ¿se refiere a donde está mirando el observador? Si es así no lo entiendo muy bien porque según donde mire la altura será diferente, ¿no?

    Por último, no entiendo que son los «pixels for observer» y los «pixels for target».

    Muchas gracias por tus comentarios y un saludo.

    • Hola Jose Miguel,

      Gracias por tu comentario y por seguir nuestro blog. Te comento acerca de tus dudas:

      – Search radius: Es la distancia desde el observador a la que llega el análisis.
      – Observer height: Es la altura del observador sobre el modelo. Por defecto 1 a no ser que se indique otro valor o campo.
      – Target height. Es la altura de lo observado sobre el modelo. Por defecto 0 a no ser que se indique otro valor o campo.

      Por último, pixels for observer y pixels for target es el número de píxeles que deseamos establecer como tolerancia de distancia sobre el punto más alto.

      Un saludo!

    • Hola Samuel,

      Me alegro de que el tutorial haya sido de tú interés, muchas gracias por seguirnos!.

      Un saludo!

  3. Hola Mariateresa,

    No es recomendable que tengas varias versiones de QGIS instaladas en tu pc, puesto que pueden darse incongruencias a la hora de que el software busque la ruta para determinados algoritmos.

    Yo te recomendaría que desinstalases todas las instalaciones de QGIS, eliminases la carpeta .qgis2 de la carpeta de usuario y realizases una limpieza de registro.
    Una vez hecho esto vuelve a instalar la versión que desees de QGIS y ejecuta de nuevo el proceso.

    Un saludo!

      • Hola Mariateresa,

        Puedes limpiarlo directamente entrando en el registro de Windows, introduciendo regedit en el buscador de Inicio del mismo.

        Un saludo!

    • Hola Diego.
      hablé con usuarios italiano de la comunidad de QGIS y me aconsejado de escribir al autor del Plugin para resolver el problema; esto es el mensaje que enviè y, a continuacion, su contesta:

      Mensaje:
      «Hello,
      few days ago I wanted to test the Viewshed analysis Plugin following a spanish tutorial found in the web; I state on my PC it’s installed Windows 10 and simultaneously Qgis 2.12.3 and Qgis 2:13 … (due to an unchecked update of a few days ago). I also have virtualbox in which is installed OSGEOLIVE 8.
      After entering all the required data and starting plugin it’s came out an error message:
      PYTHON ERROR
      “UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\xe0′ in position 36: ordinal not in range(128)
      Traceback (most recent call last):
      File “C:/Users/Terry/.qgis2/python/plugins\ViewshedAnalysis\viewshedanalysis.py”, line 161, in run
      outPath = ViewshedAnalysisDialog.returnOutputFile(self.dlg)
      File “C:/Users/Terry/.qgis2/python/plugins\ViewshedAnalysis\viewshedanalysisdialog.py”, line 60, in returnOutputFile
      return str(l)
      UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\xe0′ in position 36: ordinal not in range(128)
      Versione Python: 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)]
      Versione di QGIS: 2.12.3-Lyon Lyon, 99ac688″

      and also it specified these files were missing: grassrasterprovider6.dll, grassprovider6.dll, grassplugin6.dll.

      Today I uninstalled the QGIS latest versions through OSGEO4 setup, I cleaned out the PC (I have not yet restarted PC… maybe I should have it), and I only installed Qgis 2.12.3 GRASS 6.4.3 and leaving the rest unchanged.

      After starting Qgis I found these messages (some words are in italian), respectively:

      PYTHON NOTICES
      «2016-02-19T22:01:57 1 warning:C:\OSGEO4~1\apps\Python27\lib\site-packages\PyQt4\uic\uiparser.py:844: PendingDeprecationWarning: This method will be removed in future versions. Use ‘elem.iter()’ or ‘list(elem.iter())’ instead.
      for include in elem.getiterator(«include»):

      traceback: File «», line 1, in
      File «C:/OSGEO4~1/apps/qgis/./python\qgis\utils.py», line 271, in loadPlugin
      import(packageName)
      File «C:/OSGEO4~1/apps/qgis/./python\qgis\utils.py», line 572, in import
      mod = _builtin_import(name, globals, locals, fromlist, level)
      File «C:/Users/Terry/.qgis2/python/plugins\processing\_init__.py», line 29, in
      from processing.tools.general import *
      File «C:/OSGEO4~1/apps/qgis/./python\qgis\utils.py», line 572, in import
      mod = _builtin_import(name, globals, locals, fromlist, level)
      File «C:/Users/Terry/.qgis2/python/plugins\processing\tools\general.py», line 28, in
      from processing.core.Processing import Processing
      File «C:/OSGEO4~1/apps/qgis/./python\qgis\utils.py», line 572, in _import
      mod = _builtin_import(name, globals, locals, fromlist, level)
      File «C:/Users/Terry/.qgis2/python/plugins\processing\core\Processing.py», line 42, in
      from processing.gui.MessageBarProgress import MessageBarProgress
      File «C:/OSGEO4~1/apps/qgis/./python\qgis\utils.py», line 572, in _import
      mod = _builtin_import(name, globals, locals, fromlist, level)
      File «C:/Users/Terry/.qgis2/python/plugins\processing\gui\MessageBarProgress.py», line 34, in
      from processing.gui.MessageDialog import MessageDialog
      File «C:/OSGEO4~1/apps/qgis/./python\qgis\utils.py», line 572, in _import
      mod = _builtin_import(name, globals, locals, fromlist, level)
      File «C:/Users/Terry/.qgis2/python/plugins\processing\gui\MessageDialog.py», line 38, in
      os.path.join(pluginPath, ‘ui’, ‘DlgMessage.ui’))
      File «C:\OSGEO4~1\apps\Python27\lib\site-packages\PyQt4\uic\_init__.py», line 210, in loadUiType
      winfo = compiler.UICompiler().compileUi(uifile, code_string, from_imports, resource_suffix)
      File «C:\OSGEO4~1\apps\Python27\lib\site-packages\PyQt4\uic\Compiler\compiler.py», line 139, in compileUi
      w = self.parse(input_stream, resource_suffix)
      File «C:\OSGEO4~1\apps\Python27\lib\site-packages\PyQt4\uic\uiparser.py», line 933, in parse
      actor(elem)
      File «C:\OSGEO4~1\apps\Python27\lib\site-packages\PyQt4\uic\uiparser.py», line 844, in readResources
      for include in elem.getiterator(«include»):

      2016-02-19T22:01:58 1 warning:C:/OSGEO4~1/apps/qgis/./python\qgis\utils.py:572: UserWarning: Module owslib was already imported from C:/OSGEO4~1/apps/qgis/./python\owslib\__init__.pyc, but c:\osgeo4~1\apps\python27\lib\site-packages\owslib-0.7.2-py2.7.egg is being added to sys.path
      mod = _builtin_import(name, globals, locals, fromlist, level)

      traceback: File «», line 1, in
      File «C:/OSGEO4~1/apps/qgis/./python\qgis\utils.py», line 306, in startPlugin
      plugins[packageName] = package.classFactory(iface)
      File «C:/OSGEO4~1/apps/qgis/./python/plugins\MetaSearch\__init__.py», line 29, in classFactory
      from MetaSearch.plugin import MetaSearchPlugin
      File «C:/OSGEO4~1/apps/qgis/./python\qgis\utils.py», line 572, in import
      mod = _builtin_import(name, globals, locals, fromlist, level)
      File «C:/OSGEO4~1/apps/qgis/./python/plugins\MetaSearch\plugin.py», line 31, in
      from MetaSearch.dialogs.maindialog import MetaSearchDialog
      File «C:/OSGEO4~1/apps/qgis/./python\qgis\utils.py», line 572, in _import
      mod = _builtin_import(name, globals, locals, fromlist, level)
      File «C:/OSGEO4~1/apps/qgis/./python/plugins\MetaSearch\dialogs\maindialog.py», line 44, in
      from owslib.csw import CatalogueServiceWeb
      File «C:/OSGEO4~1/apps/qgis/./python\qgis\utils.py», line 572, in _import
      mod = _builtin_import(name, globals, locals, fromlist, level)
      File «C:/OSGEO4~1/apps/qgis/./python\owslib\csw.py», line 18, in
      from owslib.util import OrderedDict
      File «C:/OSGEO4~1/apps/qgis/./python\qgis\utils.py», line 572, in _import
      mod = _builtin_import(name, globals, locals, fromlist, level)
      File «C:/OSGEO4~1/apps/qgis/./python\owslib\util.py», line 13, in
      import pytz
      File «C:/OSGEO4~1/apps/qgis/./python\qgis\utils.py», line 572, in _import
      mod = _builtin_import(name, globals, locals, fromlist, level)
      File «C:\OSGEO4~1\apps\Python27\lib\site-packages\pytz-2012j-py2.7.egg\pytz\_init__.py», line 35, in
      from pkg_resources import resource_stream
      File «C:/OSGEO4~1/apps/qgis/./python\qgis\utils.py», line 572, in _import
      mod = _builtin_import(name, globals, locals, fromlist, level)
      File «build\bdist.win-amd64\egg\pkg_resources.py», line 3027, in
      add_activation_listener(lambda dist: dist.activate())
      File «build\bdist.win-amd64\egg\pkg_resources.py», line 741, in subscribe
      callback(dist)
      File «build\bdist.win-amd64\egg\pkg_resources.py», line 3027, in
      add_activation_listener(lambda dist: dist.activate())
      File «build\bdist.win-amd64\egg\pkg_resources.py», line 2511, in activate
      self.insert_on(path)
      File «build\bdist.win-amd64\egg\pkg_resources.py», line 2608, in insert_on
      self.check_version_conflict()
      File «build\bdist.win-amd64\egg\pkg_resources.py», line 2650, in check_version_conflict
      » to sys.path» % (modname, fn, self.location),»

      PLUGIN
      2016-02-19T21:20:44 0 Caricato Cattura coordinate (Percorso: C:/OSGEO4~1/apps/qgis/plugins/coordinatecaptureplugin.dll)
      2016-02-19T21:20:44 0 Caricato Convertitore Dxf2Shp (Percorso: C:/OSGEO4~1/apps/qgis/plugins/dxf2shpconverterplugin.dll)
      2016-02-19T21:20:44 0 Caricato eVis (Percorso: C:/OSGEO4~1/apps/qgis/plugins/evis.dll)
      2016-02-19T21:20:44 0 Caricato Georeferenziatore raster (GDAL) (Percorso: C:/OSGEO4~1/apps/qgis/plugins/georefplugin.dll)
      2016-02-19T21:20:44 0 Caricato Strumenti GPS (Percorso: C:/OSGEO4~1/apps/qgis/plugins/gpsimporterplugin.dll)
      2016-02-19T21:20:44 1 Impossible upload C:/OSGEO4~1/apps/qgis/plugins/heatmapplugin.dll (Motivo: Cannot load library C:/OSGEO4~1/apps/qgis/plugins/heatmapplugin.dll: Can not find the specified procedure.
      2016-02-19T21:20:44 0 Caricato Plugin interpolazione (Percorso: C:/OSGEO4~1/apps/qgis/plugins/interpolationplugin.dll)
      2016-02-19T21:20:44 0 Caricato OfflineEditing (Percorso: C:/OSGEO4~1/apps/qgis/plugins/offlineeditingplugin.dll)
      2016-02-19T21:20:44 1 Impossible Upload C:/OSGEO4~1/apps/qgis/plugins/oracleplugin.dll (Motivo: Cannot load library C:/OSGEO4~1/apps/qgis/plugins/oracleplugin.dll: Can not find the specified procedure.)
      2016-02-19T21:20:44 0 Caricato Plugin per l’analisi geomorfologica (Percorso: C:/OSGEO4~1/apps/qgis/plugins/rasterterrainplugin.dll)
      2016-02-19T21:20:44 0 Caricato Grafo strade (Percorso: C:/OSGEO4~1/apps/qgis/plugins/roadgraphplugin.dll)
      2016-02-19T21:20:44 0 Caricato Plugin di interrogazione spaziale (Percorso: C:/OSGEO4~1/apps/qgis/plugins/spatialqueryplugin.dll)
      2016-02-19T21:20:44 0 Caricato SPIT (Percorso: C:/OSGEO4~1/apps/qgis/plugins/spitplugin.dll)
      2016-02-19T21:20:44 0 Caricato Validatore topologico (Percorso: C:/OSGEO4~1/apps/qgis/plugins/topolplugin.dll)
      2016-02-19T21:20:44 0 Caricato Plugin di statistica zonale (Percorso: C:/OSGEO4~1/apps/qgis/plugins/zonalstatisticsplugin.dll)
      2016-02-19T21:20:48 0 Caricato Processing (pacchetto: processing)
      2016-02-19T21:20:48 0 Caricato Viewshed Analysis (pacchetto: ViewshedAnalysis)
      2016-02-19T21:20:48 0 Caricato DB Manager (pacchetto: db_manager)
      2016-02-19T21:20:48 0 Caricato fTools (pacchetto: fTools)
      2016-02-19T21:20:48 0 Caricato GdalTools (pacchetto: GdalTools)
      2016-02-19T21:20:51 0 Caricato MetaSearch Catalogue Client (pacchetto: MetaSearch)
      If then I test the plugin again, the error message this time is:

      PYTHON ERROR
      «2016-02-19T21:43:17 1 Traceback (most recent call last):
      File «C:/Users/Terry/.qgis2/python/plugins\ViewshedAnalysis\viewshedanalysis.py», line 194, in run
      z_obs_field, z_target_field, curv, refraction)
      File «C:/Users/Terry/.qgis2/python/plugins\ViewshedAnalysis\doViewshed.py», line 403, in Viewshed
      RasterPath= str(QgsMapLayerRegistry.instance().mapLayer(Raster_layer).dataProvider().dataSourceUri())
      UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\xe0′ in position 36: ordinal not in range(128)»

      Do You know tell me if there are more concurrent problems, whether it is a single problem, what’s the cause and anyway how could I solve?

      Thank you
      Mariateresa»

      CONTESTA:
      «Aggiornato da Zoran Čučković 8 giorni fa
      •Priorità modificata da Normal a Low

      Comment

      Hello!
      I get this question quite often! The viewshed plugin does not support special characters, such as é, ç, ñ, č, đ, ž etc. (not only in file names, but also in folder names). I’m not planinng to fiddle whith that problem…»

      Usted en que version de qgis utilizas el plugin?

      Gracias Mariateresa

      • Hola Mariateresa,

        El tutorial ha sido creado en la versión de QGIS 2.12 Lyon, pero puedo confirmarte de que en la última versión, QGIS 2.14 Essen, funciona correctamente.

        Un saludo!

  4. Hola Diego,
    busquè un problema en la esujucion del pluginn: en la ejecución del comando aparece un mensaje de error de Pyton. Faltan estos file: grassrasterprovider6.dll, grassprovider6.dll, grassplugin6.dll. Esto sucede en las dos ultimas versión creo: yo tengo la 2.12.3 y la 2.13.0 He instalado todo el paquete de Qgis atraves de la ventana de setup osgeo.

    Esto es el mensaje:

    «UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\xe0′ in position 36: ordinal not in range(128)
    Traceback (most recent call last):
    File «C:/Users/Terry/.qgis2/python/plugins\ViewshedAnalysis\viewshedanalysis.py», line 161, in run
    outPath = ViewshedAnalysisDialog.returnOutputFile(self.dlg)
    File «C:/Users/Terry/.qgis2/python/plugins\ViewshedAnalysis\viewshedanalysisdialog.py», line 60, in returnOutputFile
    return str(l)
    UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\xe0′ in position 36: ordinal not in range(128)

    Versione Python: 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)]
    Versione di QGIS: 2.12.3-Lyon Lyon, 99ac688″

    Pero tambien tengo la version 2.8.1 en una virtual box…y allì funciona perfectamente.

    Ciao

Los comentarios están cerrados.