Tengo dos tablas en PostGIS, una tabla point y una tabla point_buffer. La tabla de puntos tiene un campo buffer_distance, con un valor predeterminado que dice 200. Ahora quiero cambiar la geometría de la tabla de buffer cada vez que cambie el valor de buffer_distance en mi tabla de puntos. Puedo hacer esto para una sola fila en mi tabla point_buffer usando lo siguiente:
UPDATE point_buffer
SET the_geom = (SELECT ST_Buffer(the_geom,500) FROM point WHERE gid = 1)
FROM point
WHERE point.gid = point_buffer.gid
Pero cada vez que intento cambiar toda la tabla point_buffer (cláusula WHERE en mi subconsulta) recibo un mensaje de error:
'ERROR: más de una fila devuelta por una subconsulta utilizada como expresión'.
Mi pregunta es, ¿puedo cambiar toda la tabla point_buffer de una vez? Sé que una opción es usar un for lopp, con el límite superior como el valor de conteo de mi tabla de puntos e incrementando el valor de point.gid. Pero quiero hacer esto en SQL simple .
fuente
Puede usar una vista, pero también puede usar disparadores para actualizar automáticamente su tabla de búfer cuando modifica la tabla de puntos original. Esto es realmente útil si no desea regenerar los búferes cada vez que ve su tabla, ya que el cálculo del búfer es una tarea intensiva de la CPU.
Aquí hay un ejemplo de código completo que lo implementa: una tabla de puntos y una tabla point_buffer que se actualiza automáticamente en función de las modificaciones de la tabla de puntos.
Puede probarlo con QGIS: abra ambas tablas, ingrese al modo de edición en la tabla de puntos. Mueva un punto o cambie el valor de buffer_distance, y cada vez que guarde, la capa de búfer se actualizará.
disfruta :)
fuente