PostGIS рассчитывает расстояния от одной точки до нескольких точек - PullRequest
1 голос
/ 22 февраля 2020

В PostgreSQL 12.1 64-битной и PostGIS 3.0 у меня есть две маленькие таблицы точек. Я хочу определить расстояние от одной точки в одной таблице до нескольких точек в другой таблице. Обе таблицы имеют один и тот же SRID: 26910.

WKT для таблицы с несколькими точками, ebd_sampl, имеет следующие координаты:

ID           geom
'S6485705'  'POINT(473697.203011859 5107286.1114417)'
'S16187642' 'POINT(473388.313557094 5107381.77541894)'
'S21737009' 'POINT(473304.975396136 5107449.75936742)'
'S27967642' 'POINT(472992.535028299 5107506.05876625)'
'S30893534' 'POINT(472638.34972214 5107604.73782347)'
'S35264483  'POINT(473106.919925334 5107464.0012127)'

Точка WKT из другой таблицы, grid_sampl, это: 'POINT(473144.563851624 5107073.33440939)'

Я могу написать внутренний запрос с предложением WHERE, чтобы выбрать одну точку в первом внутреннем запросе и получить одно расстояние между одной точкой в ​​каждой таблице. Я подумал, убрав предложение WHERE в первом внутреннем запросе, этот запрос будет более общим и вернет таблицу с расстояниями для всех точек в первой таблице до выбранной точки во второй таблице. Но я не знаю, как написать SQL для этого.

Я пытался:

SELECT ST_Distance(
    (SELECT geom FROM p_loc.ebd_sampl),
    (SELECT geom FROM p_loc.grid_sampl WHERE data = '441062')
);

И вот результат:

ERROR:  more than one row returned by a subquery used as an expression

Я бы хотел таблицу как (значения расстояния здесь составлены):

ID          distance
'S6485705'  400
'S16187642' 550
'S21737009' 633
'S27967642' 401
'S30893534' 700
'S35264483' 501

Что SQL следует использовать, чтобы возвращались соответствующие расстояния для каждой точки в первой таблице до одной выбранной точки во второй таблице?

1 Ответ

1 голос
/ 22 февраля 2020

Попробуйте передать обе таблицы в предложении FROM и отфильтровать нужные значения в предложении WHERE, например,

SELECT id,ST_Distance(t.geom,grid_sampl.geom) 
FROM t,grid_sampl
WHERE grid_sampl.data = '441062' ;

Пример

CREATE TABLE t (id TEXT, geom GEOMETRY);
INSERT INTO t VALUES
('S6485705',  'SRID=26910;POINT(473697.203011859 5107286.1114417)'),
('S16187642', 'SRID=26910;POINT(473388.313557094 5107381.77541894)'),
('S21737009', 'SRID=26910;POINT(473304.975396136 5107449.75936742)'),
('S27967642', 'SRID=26910;POINT(472992.535028299 5107506.05876625)'),
('S30893534', 'SRID=26910;POINT(472638.34972214 5107604.73782347)'),
('S35264483', 'SRID=26910;POINT(473106.919925334 5107464.0012127)');

CREATE TABLE grid_sampl (data TEXT, geom GEOMETRY);
INSERT INTO grid_sampl VALUES ('441062','SRID=26910;POINT(473144.563851624 5107073.33440939)');

SELECT id,ST_Distance(t.geom,grid_sampl.geom) 
FROM t,grid_sampl
WHERE grid_sampl.data = '441062' ;

    id     |   st_distance    
-----------+------------------
 S6485705  | 592.185871921898
 S16187642 | 393.128191928728
 S21737009 | 409.179193802818
 S27967642 | 458.653608010902
 S30893534 | 733.922566341344
 S35264483 | 392.476262206356
(6 Zeilen)
...