2 votos

PostGIS ST_Union con sentencia IF

Tengo un conjunto de datos que contiene edificios donde cada edificio tiene un determinado valor/puntuación. Lo que quiero hacer es agrupar estos edificios en función de sus valores/puntuaciones. Lo que he hecho hasta ahora es crear un búfer alrededor de cada edificio, de modo que sea posible determinar cuál y cuántos otros edificios son intersectados por un edificio. Este búfer tiene el correspondiente valor / puntuación del edificio donde el búfer se construye alrededor.

Lo que quiero hacer ahora, es que quiero disolver estos buffers como uno, cuando/si los edificios que el buffer intersecta tienen el mismo o mayor valor/puntuación que el edificio alrededor del cual se está construyendo el buffer (edificio origen).

Así que creo que una "simple" sentencia if o where debería funcionar. Sin embargo, soy un principiante en PostGIS y por lo tanto no estoy seguro de cómo y dónde escribir esto en PostGIS.

Mi consulta SQL hasta ahora es:

        WITH sum AS (
WITH buffertest AS (
    SELECT Building_score, Building_ID, ST_Buffer(geom, 30)::geometry(polygon,28992) AS buffer 
     FROM postgis_export)

        SELECT b.Building_score AS bufferscores, b.Building_ID AS bufferID,  a.Building_score AS building, b.buffer 
FROM postgis_export a, buffertest b WHERE ST_intersects(b.buffer, a.geom)  AND b.gebouw_sco - a.gebouw_sco <= 0 )

        SELECT bufferscores, bufferid, SUM(gebouw), COUNT(*), buffer 
FROM sum 
GROUP BY bufferscores, bufferid, buffer 
ORDER BY bufferid

2voto

mathieu Puntos 53

Dos cosas:

  • como ya has probado, en SQL las relaciones condicionales pueden traducirse en JOIN condiciones en la mayoría de los casos
  • las búsquedas de proximidad se realizan mejor utilizando funciones optimizadas en las geometrías iniciales; las geometrías derivadas no están cubiertas por el índice

Teniendo esto en cuenta, podría ejecutar

SELECT a."Building_ID",
       COUNT(b.*),
       SUM(b."Building_Score"),
       ST_Union(ST_Buffer(b.geom, 30)) AS geom
FROM   postgis_export AS a
JOIN   postgis_export AS b
  ON   ST_DWithin(a.geom, b.geom, 30)
WHERE  a."Building_Score" <= b."Building_Score"
GROUP BY
       1
-- HAVING COUNT(b.*) > 1
;

Para cada edificio de a Esto

  • encontrar todos los edificios en b (ambos son alias de postgis_export mesa; a autounión ) que se encuentren en una proximidad de 30 metros (utilizando ST_DWithin en las geometrías indexadas originales) y con un "Building_Score" mayor o igual que la fila actual en a
  • resumen sus "Building_Score"
  • unión (disolución) de los topes a su alrededor

Tenga en cuenta que esto también creará polígonos de amortiguación para los edificios que no superen la condición (por ejemplo, cualquier edificio aislado, o aquellos rodeados por edificios con menor "Building_Score" ). Si sólo desea obtener resultados con "grupos" de más de un edificio, desactive la casilla HAVING declaración.

Tenga en cuenta también que no estoy seguro de qué valores desea agregar exactamente... parece que ha mezclado los nombres reales de las columnas y los nombres ficticios en su consulta...

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X