PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

wie man den Wert einer Spalte als Eingabe für eine räumliche Operation verwendet

Wenn sie in einer einzigen Abfrage sein müssen, müssen Sie einfach die Ausgabewerte von ST_X verwenden und ST_Y im ST_MakePoint Funktion. Wenn sich die x- und y-Werte in Spalten befinden oder das Ergebnis einer Operation sind, müssen Sie diese Werte einfach an die Funktion übergeben:

SELECT ST_MakePoint(column_x,column_y) FROM t;

Oder falls sie innerhalb von Geometrien sind..

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

Verwendung eines CTE oder eine Unterabfrage (siehe Kommentare). Das Prinzip ist ähnlich, aber mit einem CTE erstellen Sie eine Art temporäres Set und verwenden es als Tabelle. Das folgende Beispiel generiert x- und y-Werte und nennt sie j , dann fangen Sie in der äußeren Abfrage diese Werte ab, um einen Punkt mit einem weiteren SELECT zu erstellen , aber diesmal mit j :

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

Anwenden auf Ihre Abfrage ..

Demo (Unterabfrage):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                  

Ein paar Gedanken zu Ihrer Anfrage (ohne das große Ganze sehen zu können):

  • ST_AsText definitiv keinen Sinn in Ihrer Abfrage. Du kannst es loswerden.
  • Beachten Sie, dass der Code, den Sie zum Extrahieren der x- und y-Koordinaten verwenden, identisch ist, und ST_DumpPoints gibt bereits Punkte zurück. Ich glaube also, dass Ihre Logik fehlerhaft ist, da Sie denselben Punkt neu erstellen, den Sie zuvor in getrennte Werte aufgeteilt haben.