Más

¿Hay alguna manera de tener un búfer 'en vivo' en QGIS?

¿Hay alguna manera de tener un búfer 'en vivo' en QGIS?


Utilizo QGIS (2.10.1) para crear búferes alrededor de polígonos. A menudo creo una serie de búferes y luego necesito editar los polígonos subyacentes. Es frustrante empezar de cero a volver a crear varios búferes basados ​​en los cambios cuando esto sucede.

¿Hay alguna forma de crear un búfer 'en vivo', que se actualizará automáticamente a los cambios realizados en el polígono principal, o como segundo mejor, un medio para replicar con un clic, la configuración del búfer y el formato que creó originalmente?


Crear una vista en PostGIS para tener un "búfer en vivo" es, por supuesto, la mejor opción si está dispuesto a configurar un RDBMS. Tenía curiosidad por ver si también podía obtener algún tipo de búfer en vivo sin PostGIS, así que lo probé con Spacialite y también funciona. La diferencia es solo que parece que no puede crear una Vista con un tipo de geometría diferente en Spatialite. Encontré esta información aquí: https://groups.google.com/forum/#!topic/spatialite-users/ZZIPwYt8-uA allí estaba escrito:

"No hay absolutamente ninguna forma de mostrar una geometría de vista en espacialite-gis, si la clase de geometría no es exactamente la misma que la utilizada para la tabla principal"

Entonces tienes que usar una tabla de búfer y tres disparadores:

CREATE TABLE líneas (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, nombre TEXT NOT NULL); SELECCIONE AddGeometryColumn ('líneas', 'geometría', 3857, 'LINESTRING', 'XY'); CREATE TABLE lines_buffer (id INTEGER PRIMARY KEY AUTOINCREMENT, gid INTEGER, nombre TEXT NOT NULL); SELECCIONE AddGeometryColumn ('lines_buffer', 'geo', 3857, 'POLYGON', 'XY'); CREAR TRIGGER "lines_buffer_insert" DESPUÉS DE INSERTAR EN "lines" PARA CADA FILA COMIENZO INSERT INTO lines_buffer (gid, name, geo) SELECT new.id, new.name, ST_Buffer (new.geometry, 1000); FIN CREAR TRIGGER "lines_buffer_update" DESPUÉS DE ACTUALIZAR EN "lines" PARA CADA FILA COMIENZA ACTUALIZAR lines_buffer SET geo = (ST_Buffer (NEW.geometry, 1000)) DONDE gid = NEW.id; ACTUALIZAR lines_buffer SET name = NEW.name DONDE gid = NEW.id; FIN CREAR DISPARADOR "lines_buffer_delete" DESPUÉS DE BORRAR EN "líneas" PARA CADA FILA COMIENZA ELIMINAR DE lines_buffer DONDE gid = OLD.id; FIN

No lo he probado excesivamente, pero creé, actualicé y eliminé varias líneas y el búfer siempre se actualizó (después de actualizar / hacer panorámicas de QGIS, por supuesto). Entonces, esta podría ser una alternativa en la que solo tiene un archivo espacial para almacenar los datos y no tiene que configurar una base de datos PostGIS ...


Publicar una respuesta de otra pregunta (Cómo agregar un búfer en QGIS que se actualice a sí mismo) como alternativa a las soluciones postgis / rdbms ya compartidas.

Para una visualización simple e infalible, pruebe el generador de geometría.

  1. Vaya al panel Estilo de capa -> seleccione estilo -> Tipo de capa de símbolo: generador de geometría
  2. seleccione el tipo de geometría: Polígono / Multipolígono
  3. ingrese la siguiente expresiónbúfer ($ geometría, CANTIDAD)
  4. CANTIDAD puede ser un número fijo en las unidades de su CRS, o un campo en sus datos, en cuyo caso seríabuffer ($ geometría, "buffer_field")
  5. los búferes aparecerán tan pronto como agregue o edite un punto en qgis, incluso si no ha guardado las ediciones

Para generar polígonos de los que pueda calcular áreas, etc., intente capas virtuales.

  1. Vaya a Capa -> Agregar capa -> Agregar / editar capa virtual
  2. haga clic en Importar y seleccione su capa
  3. ingrese la siguiente consulta:SELECCIONE campo_deseado, campo_deseado2, 'campo deseado', st_buffer (geometría, CANTIDAD) COMO geometría de 'Nombre de capa';- los campos deseados son opcionales. Todos los nombres de capas o campos con espacios, o la mayoría de los caracteres no alfanuméricos, deben ir entre comillas simples. Haga clic en Probar para verificar que no haya errores antes de hacer clic en Aceptar.
  4. los búferes se guardan como una capa separada, que se actualizará solo cuando presione Actualizar, y las ediciones se guardan (si edita su capa de origen fuera de qgis)

Solo haz

from qgis.analysis import QgsGeometryAnalyzer # Seleccione su capa layer_ref = iface.activeLayer () # Get layer tree root root = QgsProject.instance (). layerTreeRoot () # Prepare la función que actuará como ranura def save_after_edit (layer, qgsgeometrymap): output_filename = "output.shp" # Crea búfer y guárdalo en un shp QgsGeometryAnalyzer (). buffer (layer_ref, output_filename, 500, False, False, -1) # Si la capa tiene un nombre 'búfer', quítala (solo una capa 'buffer' permitido) si 'buffer' en [i.name () para i en QgsMapLayerRegistry.instance (). mapLayers (). values ​​()]: QgsMapLayerRegistry.instance (). removeMapLayer ([i.id () para i en QgsMapLayerRegistry.instance (). mapLayers (). values ​​() if i.name () == "buffer"] [0]) # Agregue el búfer creado y agréguelo justo debajo de la capa en la parte superior si 'búfer' no en [i.name () para i en QgsMapLayerRegistry.instance (). mapLayers (). values ​​()]: mylayer = QgsVectorLayer (output_filename, "buffer", "ogr") QgsMapLayerRegistry.instance (). addMapLayer (mylayer, False ) root.insertLayer ( 1, mylayer) # Posición en el árbol de capas # Usa la señal emitida desde la capa cuando realizas cambios # Otras señales disponibles en http://www.qgis.org/api/classQgsVectorLayer.html layer_ref.committedGeometriesChanges.connect (save_after_edit)

Ver el vídeo: BUFFER - Área de Influencia QGIS