PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

comment utiliser la valeur d'une colonne comme entrée d'une opération spatiale

S'ils doivent être dans une seule requête, il vous suffit d'utiliser les valeurs de sortie de ST_X et ST_Y dans le ST_MakePoint fonction. Si les valeurs x et y sont en colonnes ou sont le résultat d'une opération, il suffit de passer ces valeurs dans la fonction :

SELECT ST_MakePoint(column_x,column_y) FROM t;

Ou au cas où ils seraient à l'intérieur des géométries..

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

Utiliser un CTE ou une sous-requête (Voir commentaires). Le principe est similaire, mais en utilisant un CTE, vous créez en quelque sorte un ensemble temporaire et l'utilisez comme une table. L'exemple suivant génère des valeurs x et y et le nomme j , puis dans la requête externe, vous attrapez ces valeurs pour créer un point avec un autre SELECT , mais cette fois en utilisant j :

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

L'appliquer à votre requête ..

Démo (sous-requête) :db<>fiddle

Démo (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                  

Quelques réflexions sur votre requête (sans pouvoir voir la situation dans son ensemble) :

  • ST_AsText n'a certainement aucun sens dans votre requête. Vous pouvez vous en débarrasser.
  • Notez que le code que vous utilisez pour extraire les coordonnées x et y est identique, et ST_DumpPoints renvoie déjà des points. Donc, je pense que votre logique est erronée, puisque vous recréez le même point que vous avez précédemment divisé en valeurs séparées.