PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

как да използвате стойност на колона като вход за пространствена операция

Ако те трябва да бъдат в една заявка, просто трябва да използвате изходните стойности на ST_X и ST_Y в ST_MakePoint функция. Ако стойностите x и y са в колони или са резултат от операция, просто трябва да предадете тези стойности във функцията:

SELECT ST_MakePoint(column_x,column_y) FROM t;

Или в случай, че са вътре в геометрии...

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

Използване на CTE или подзаявка (Вижте коментарите). Принципът е подобен, но с помощта на CTE създавате временен набор и го използвате като таблица. Следващият пример генерира x и y стойности и го наименува j , след това във външната заявка улавяте тези стойности, за да създадете точка с друг SELECT , но този път използвайки j :

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

Прилага се към вашата заявка ..

Демо (подзаявка):db<>fiddle

Демо (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                  

Няколко мисли относно вашето запитване (без да можете да видите голямата картина):

  • ST_AsText определено няма смисъл в запитването ви. Можете да се отървете от него.
  • Имайте предвид, че кодът, който използвате за извличане на координатите x и y, е идентичен и ST_DumpPoints вече връща точки. Така че смятам, че логиката ви е погрешна, тъй като пресъздавате същата точка, която преди това сте разделили на отделни стойности.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. psycopg2 изтичаща памет след голяма заявка

  2. Свържете се като потребител без зададена парола на Postgresql 8.4 чрез JDBC

  3. Някакви недостатъци при използването на текст от тип данни за съхранение на низове?

  4. Django OperationalError:не можа да разклони нов процес за свързване

  5. Репликация на Postgres