sql >> Base de Datos >  >> RDS >> PostgreSQL

cómo usar el valor de una columna como entrada para una operación espacial

Si tienen que estar en una sola consulta, simplemente necesita usar los valores de salida de ST_X y ST_Y en el ST_MakePoint función. Si los valores de x e y están en columnas o son el resultado de una operación, simplemente necesita pasar estos valores en la función:

SELECT ST_MakePoint(column_x,column_y) FROM t;

O en caso de que sean geometrías internas..

SELECT ST_MakePoint(ST_X(a_geom),ST_Y(a_geom)) FROM t;

Usando un CTE o una subconsulta (Ver comentarios). El principio es similar, pero al usar un CTE creas un conjunto temporal y lo usas como una tabla. El siguiente ejemplo genera valores x e y y asígnele el nombre j , luego, en la consulta externa, captura estos valores para crear un punto con otro SELECT , pero esta vez usando j :

WITH j AS (
  SELECT 1 AS X, 2 AS y -- your big query goes here
) 
SELECT ST_MakePoint(X,Y) FROM j;

Aplicándolo a su consulta ..

Demostración (subconsulta):db<>fiddle

Demostración (CTE):db<>fiddle

WITH j AS (
 SELECT 
    ST_X((ST_DumpPoints(ST_AsText(ST_Intersection(
        ST_SetSRID(
            ST_MakeEnvelope(
            ST_X(point),
            ST_Y(point),
            ST_X(point)+{width}, 
            ST_Y(point)+{height}),
            25832),ST_Buffer(j.geometry, {bufferRadius}) 
        )))).geom) AS XOfLowerLeftOfGridCellIntersectingWithBuffer,
        ST_Y((ST_DumpPoints(ST_AsText(ST_Intersection(
        ST_SetSRID(
            ST_MakeEnvelope(
            ST_X(point),
            ST_Y(point),
            ST_X(point)+{width}, 
            ST_Y(point)+{height}),
            25832),ST_Buffer(j.geometry, {bufferRadius}) 
        )))).geom) AS YOfLowerLeftOfGridCellIntersectingWithBuffer, 
    ....
)
SELECT ST_MakePoint(XOfLowerLeftOfGridCellIntersectingWithBuffer,
                    YOfLowerLeftOfGridCellIntersectingWithBuffer)
FROM j                  

Algunas reflexiones sobre su consulta (sin poder ver el panorama general):

  • ST_AsText definitivamente no tiene sentido en su consulta. Puedes deshacerte de él.
  • Tenga en cuenta que el código que está utilizando para extraer las coordenadas x e y son idénticos y ST_DumpPoints ya devuelve puntos. Entonces, creo que su lógica es defectuosa, ya que está recreando el mismo punto que dividió previamente en valores separados.