Postgresql PostGIS两个集合的最小距离,包括两个表中的其他变量

Postgresql PostGIS两个集合的最小距离,包括两个表中的其他变量,postgresql,postgis,Postgresql,Postgis,我有两个表(表1和表2),有三列:id、value和geometry。几何图形是点特征 我想在两个表之间进行连接,结果表包含表1的每个点、到表2点的最小距离、表1的值和表2对应点的值 我尝试了以下代码,但从逻辑上讲,这为表1的每个点提供了到表2的每个点的距离。但是,我不能将v2从GROUPBY子句中删除。我怎样才能得到我想要的桌子 SELECT t1.value AS v1, t2.value AS v2, MIN(st_distance(t1.eometry, t2.geome

我有两个表(表1和表2),有三列:
id
value
geometry
。几何图形是点特征

我想在两个表之间进行连接,结果表包含表1的每个点、到表2点的最小距离、表1的值和表2对应点的值

我尝试了以下代码,但从逻辑上讲,这为表1的每个点提供了到表2的每个点的距离。但是,我不能将v2从GROUPBY子句中删除。我怎样才能得到我想要的桌子

SELECT t1.value AS v1,
    t2.value AS v2,
    MIN(st_distance(t1.eometry, t2.geometry)) AS dis                        
   FROM table1 t1, table2 t2
GROUP BY v1, v2

为了简单起见,我只取了整数值及其差值,而不是点之间的距离(但应该完全相同:只需更改
st_distance
函数的减法):

我的桌子:

table1.point: 1, 2, 4, 8, 16
table2.point: 2, 3, 5, 7, 11, 13
| point | point | abs |
|-------|-------|-----|
|     1 |     2 |   1 |
|     2 |     2 |   0 |
|     4 |     3 |   1 |
|     8 |     7 |   1 |
|    16 |    13 |   3 |
结果:

table1.point: 1, 2, 4, 8, 16
table2.point: 2, 3, 5, 7, 11, 13
| point | point | abs |
|-------|-------|-----|
|     1 |     2 |   1 |
|     2 |     2 |   0 |
|     4 |     3 |   1 |
|     8 |     7 |   1 |
|    16 |    13 |   3 |
说明:

table1.point: 1, 2, 4, 8, 16
table2.point: 2, 3, 5, 7, 11, 13
| point | point | abs |
|-------|-------|-----|
|     1 |     2 |   1 |
|     2 |     2 |   0 |
|     4 |     3 |   1 |
|     8 |     7 |   1 |
|    16 |    13 |   3 |
你必须计算所有的差异,知道哪一个是最小的。这就是交叉连接的原因。现在,您可以按表1中的点和差异(或距离)排序。请注意
abs()
函数:这将使所有负值都为正值。否则将采用差异
-42
,而不是
+1

DISTINCT ON(v1.point)
获取每个v1.point的第一个有序行

注意:

table1.point: 1, 2, 4, 8, 16
table2.point: 2, 3, 5, 7, 11, 13
| point | point | abs |
|-------|-------|-----|
|     1 |     2 |   1 |
|     2 |     2 |   0 |
|     4 |     3 |   1 |
|     8 |     7 |   1 |
|    16 |    13 |   3 |

由于
交叉连接
st_distance
中繁重的数学运算,对于庞大的数据集来说,速度可能非常慢

谢谢!我正在使用您的代码,但在
st_distance
之前仍然使用
MIN
,这导致了一个错误。也许你应该明确地提到不要再使用
MIN
。然而,在阅读了解释之后,我明白了
MIN
不是必需的。回答得好!