Jeśli muszą być w jednym zapytaniu, wystarczy użyć wartości wyjściowych ST_X
i ST_Y
w ST_MakePoint
funkcjonować. Jeśli wartości x i y są w kolumnach lub są wynikiem operacji, wystarczy przekazać te wartości w funkcji:
SELECT ST_MakePoint(column_x,column_y) FROM t;
Lub w przypadku, gdy są w geometrii.
SELECT ST_MakePoint(ST_X(a_geom),ST_Y(a_geom)) FROM t;
Korzystanie z CTE
lub podzapytanie (patrz komentarze). Zasada jest podobna, ale używając CTE tworzysz tymczasowy zestaw i używasz go jako tabeli. Poniższy przykład generuje wartości x i y i nazywa je j
, następnie w zewnętrznym zapytaniu przechwytujesz te wartości, aby utworzyć punkt z innym SELECT
, ale tym razem używając j
:
WITH j AS (
SELECT 1 AS X, 2 AS y -- your big query goes here
)
SELECT ST_MakePoint(X,Y) FROM j;
Stosowanie go do zapytania ..
Demo (podzapytanie):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
Kilka przemyśleń na temat Twojego zapytania (bez możliwości zobaczenia pełnego obrazu):
ST_AsText
zdecydowanie nie ma sensu w twoim pytaniu. Możesz się go pozbyć.- Zauważ, że kod, którego używasz do wyodrębnienia współrzędnych xiy, jest identyczny, a
ST_DumpPoints
już zwraca punkty. Uważam więc, że twoja logika jest błędna, ponieważ odtwarzasz ten sam punkt, który wcześniej podzieliłeś na oddzielne wartości.