sql >> Databasteknik >  >> RDS >> PostgreSQL

hur man använder värdet av en kolumn som input till en rumslig operation

Om de måste vara i en enda fråga behöver du helt enkelt använda utdatavärdena för ST_X och ST_Y i ST_MakePoint fungera. Om x- och y-värdena finns i kolumner eller är resultatet av en operation behöver du bara skicka dessa värden i funktionen:

SELECT ST_MakePoint(column_x,column_y) FROM t;

Eller om de är inom geometrier...

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

Använda en CTE eller en underfråga (Se kommentarer). Principen är liknande, men med en CTE skapar du liksom en tillfällig uppsättning och använder den som en tabell. Följande exempel genererar x- och y-värden och ger det namnet j , sedan i den yttre frågan fångar du dessa värden för att skapa en punkt med en annan SELECT , men den här gången med j :

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

Tillämpar det på din fråga ..

Demo (underfråga):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                  

Några tankar om din fråga (utan att kunna se helheten):

  • ST_AsText definitivt ingen mening i din fråga. Du kan bli av med det.
  • Observera att koden du använder för att extrahera x- och y-koordinaterna är identiska och ST_DumpPoints ger redan poäng. Så jag tror att din logik är felaktig, eftersom du återskapar samma punkt som du tidigare delade upp i separerade värden.



  1. Operand bör innehålla 1 kolumn - MySQL NOT IN

  2. SQL-frågan går sönder av någon anledning

  3. Hur man undviker variabelsubstitution i Oracle SQL Developer med "trinidad &tobago"

  4. Konvertera tidsstämpelkolumnsvärden till epok i PostgreSQL-valsfrågan