PostGIS- GROUP BY para valores de datos continuos?

8

En el código de muestra para la función PostGIS ST_ConvexHull , se crearían múltiples polígonos basados ​​en valores diferentes y discretos encontrados en el campo "enfermedad_tipo".

--Get estimate of infected area based on point observations
SELECT d.disease_type,
    ST_ConvexHull(ST_Collect(d.the_geom)) As the_geom
    FROM disease_obs As d
    GROUP BY d.disease_type;

Digamos que había un campo numérico (llamémoslo "myfield") con valores continuos de 0-5. ¿Cómo produciría resultados similares a GROUP BY pero definiendo sus propios puntos de corte (por ejemplo: 0-1.25, 1.25-3.5, 3.5-5)?

RyanKDalton
fuente
No es realmente una pregunta SIG pero ya que ya ha sido respondida.
oscuro

Respuestas:

9

Puedes usar CASE para crear clases. Algo como eso:

SELECT 
d.disease_type,
ST_ConvexHull(ST_Collect(d.the_geom)) As the_geom
FROM 
    (
    SELECT
    diseaseobs.the_geom,
    (CASE diseaseobs.number WHEN number BETWEEN 0 AND 1.5 THEN 'type one'
         WHEN number BETWEEN 1.6 AND 3 THEN 'type two'       
         ELSE 'other'
    END ) as disease_type
    FROM schema.diseaseobs

    ) AS d

GROUP BY d.disease_type;
Pablo
fuente
Gracias pablo. Esto es genial ... Necesito probarlo yo mismo, pero espero que esta sea la respuesta que estaba buscando.
RyanKDalton
2

Hola

Lo que suelo hacer en esos casos es crear una tabla con las clases y unirlas contra ellas o usar una subconsulta para crear una lista de clases.

Creo que eso ofrece un enfoque más intuitivo y creo que es más flexible ya que puede actualizar las clases simplemente actualizando una tabla.

Otro beneficio es que también puedes obtener las clases vacías.

El enfoque de subconsulta podría ser similar a:

SELECT
d.disease_type,
ST_ConvexHull(ST_Collect(d.the_geom)) AS the_geom FROM disease_obs
RIGHT JOIN
(SELECT 0::float AS classbottom, 1.25::float AS classtop, 1::int AS classid
UNION ALL    
SELECT 1.25::float AS classbottom, 3.5::float AS classtop, 2::int AS classid
UNION ALL    
SELECT 3.5::float AS classbottom, 5::float AS classtop, 3::int AS classid) AS classes
ON disease_obs.continuous_value>=classes.classbottom AND disease_obs.continuous_value<classes.classbottom
GROUP BY classes.id;

Aquí utilicé una combinación correcta para obtener también las clases vacías, que a veces pueden ser útiles. Si no desea los vacíos, simplemente cambie a una unión interna.

Si mueve las clases a una tabla y coloca el resto de la consulta en una vista, puede cambiar las clases sin tocar la consulta.

HTH / Nicklas

Nicklas Avén
fuente
Gracias por la sugerencia. Pensé en seguir esta ruta, pero finalmente me gustaría poner esto en una aplicación donde el usuario pueda elegir sus propios puntos de interrupción, lo que hace que esta solución no sea tan propicia.
RyanKDalton