PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

come utilizzare il valore di una colonna come input per un'operazione spaziale

Se devono trovarsi in una singola query, devi semplicemente utilizzare i valori di output di ST_X e ST_Y nel ST_MakePoint funzione. Se i valori xey sono in colonne o sono il risultato di un'operazione, devi semplicemente passare questi valori nella funzione:

SELECT ST_MakePoint(column_x,column_y) FROM t;

O nel caso siano all'interno di geometrie..

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

Utilizzando un CTE o una sottoquery (vedi commenti). Il principio è simile, ma usando un CTE crei un set temporaneo e lo usi come tabella. L'esempio seguente genera valori xey e lo chiama j , quindi nella query esterna catturi questi valori per creare un punto con un altro SELECT , ma questa volta usando j :

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

Applicandolo alla tua richiesta ..

Demo (sottoquery):db<>fiddle

Demo (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                  

Alcuni pensieri sulla tua domanda (senza poter vedere il quadro generale):

  • ST_AsText sicuramente non ha senso nella tua query. Puoi liberartene.
  • Nota che il codice che stai usando per estrarre le coordinate xey è identico e ST_DumpPoints restituisce già punti. Quindi, credo che la tua logica sia imperfetta, dal momento che stai ricreando lo stesso punto che in precedenza hai diviso in valori separati.