Nếu chúng phải nằm trong một truy vấn, bạn chỉ cần sử dụng các giá trị đầu ra của ST_X
và ST_Y
trong ST_MakePoint
hàm số. Nếu các giá trị x và y nằm trong cột hoặc là kết quả của một phép toán, bạn chỉ cần chuyển các giá trị này vào hàm:
SELECT ST_MakePoint(column_x,column_y) FROM t;
Hoặc trong trường hợp chúng nằm bên trong các hình học ..
SELECT ST_MakePoint(ST_X(a_geom),ST_Y(a_geom)) FROM t;
Sử dụng CTE
hoặc một truy vấn con (Xem nhận xét). Nguyên tắc tương tự, nhưng sử dụng CTE, bạn sắp xếp tạo một tập hợp tạm thời và sử dụng nó như một bảng. Ví dụ sau tạo các giá trị x và y và đặt tên là j
, sau đó trong truy vấn bên ngoài, bạn bắt các giá trị này để tạo một điểm với SELECT
khác , nhưng lần này sử dụng j
:
WITH j AS (
SELECT 1 AS X, 2 AS y -- your big query goes here
)
SELECT ST_MakePoint(X,Y) FROM j;
Áp dụng nó vào truy vấn của bạn ..
Demo (truy vấn con): 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
Một vài suy nghĩ về truy vấn của bạn (mà không thể nhìn thấy bức tranh toàn cảnh):
-
ST_AsText
chắc chắn không có ý nghĩa trong truy vấn của bạn. Bạn có thể loại bỏ nó. - Lưu ý rằng mã bạn đang sử dụng để trích xuất các tọa độ x và y là giống hệt nhau và
ST_DumpPoints
đã trả lại điểm. Vì vậy, tôi tin rằng logic của bạn còn thiếu sót, vì bạn đang tạo lại chính điểm mà trước đó bạn đã chia thành các giá trị riêng biệt.