在PostgreSQL 12.1 64bit和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,以便返回第一个表中每个点到第二个表中一个选定点的距离?
答案 0 :(得分:1)
尝试在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)