#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
того, чтобы получить расстояние в метрах