как использовать подзапрос с помощью st_distance

#sql #postgresql

Вопрос:

Я пытаюсь запустить подзапрос внутри st_distance, но он дает мне неверную геометрию

Мой подзапрос

 SELECT ST_AsText(ST_Centroid('MULTIPOINT ( 0 0, 0 0, 0 0, 0 0 )')) as centroid;
  centroid  
------------
 POINT(0 0)
(1 row)
 

Я попробовал несколько способов

Первый способ

 select ST_Distance('SRID=4326;POINT(0 0)'::geometry, "SRID=4326;(SELECT ST_AsText(ST_Centroid('MULTIPOINT ( 0 0, 0 0, 0 0, 0 0 )'))) as centroid"::geometry);
NOTICE:  identifier "SRID=4326;(SELECT ST_AsText(ST_Centroid('MULTIPOINT ( 0 0, 0 0, 0 0, 0 0 )'))) as centroid" will be truncated to "SRID=4326;(SELECT ST_AsText(ST_Centroid('MULTIPOINT ( 0 0, 0 0,"
ERROR:  column "SRID=4326;(SELECT ST_AsText(ST_Centroid('MULTIPOINT ( 0 0, 0 0," does not exist
LINE 1: ...ect ST_Distance('SRID=4326;POINT(0 0)'::geometry, "SRID=4326...
 

2-й способ

 select ST_Distance('SRID=4326;POINT(0 0)'::geometry, 'SRID=4326;(SELECT ST_AsText(ST_Centroid(''MULTIPOINT ( 0 0, 0 0, 0 0, 0 0 )''))) as centroid'::geometry);
ERROR:  parse error - invalid geometry
LINE 1: ...ect ST_Distance('SRID=4326;POINT(0 0)'::geometry, 'SRID=4326...
                                                             ^
HINT:  "SRID=4326;(S" <-- parse error at position 12 within geometry
 

Ответ №1:

Вы можете переместить подзапрос из st_distance функции.

 SELECT ST_Distance('SRID=4326;POINT(0 0)'::geometry, subqry.centroid)
FROM 
 (SELECT ST_Centroid('SRID=4326;MULTIPOINT ( 0 0, 0 0, 0 0, 0 0 )'::geometry) as centroid
 ) as subqry;
 

Но если у вас есть один закодированный ввод, вам вообще не нужен подзапрос

 SELECT ST_Distance('SRID=4326;POINT(0 0)'::geometry, 'SRID=4326;MULTIPOINT ( 0 0, 0 0, 0 0, 0 0 )'::geometry);
 

И последнее, но не менее важное: бессмысленно вычислять расстояния в 4326 с использованием геометрии, поскольку выходные данные будут в градусах, но градус широты не имеет такой же длины земли, как градус долготы. Возможно, вы захотите бросить, чтобы geography вместо geometry того, чтобы получить расстояние в метрах