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.