计算postgres / postgis中两个不相关表之间的重叠

时间:2013-12-12 01:59:15

标签: mysql sql postgresql postgis psql

这既是一个基本的SQL问题,也是一个postgres / postgis问题。

我有两个表集,在同一个数据库中,但来自不同的来源,提供类似但不同的地理数据。

例如,第一组查询

select ST_Area(g.geog), g.geog area1 
from 
(--complicated joins on set1 tables---)
order by area1;

给出(仅显示第一列):

1449088812.57385
2209542976.77606
2419594400.94064
2680798195.72685
2921972342.3048
2936036972.01677
3420807650.41126
3426766723.91276
4098062224.01722
5082190891.49144
5137325111.41293
5726948701.13547

关于第二集的查询:

select ST_Area(r.geog), r.geog area2 
from 
(--some other compilcated joins on set2 tables----) 
order by area2;

给出(仅显示第一列):

1449087081.39959
2209560820.96132
2419587161.04685
2680790097.03592
2922282361.4318
2936033639.82268
3420802892.77572
3427452706.69087
4098057825.46861
5082187140.27675
5137291729.45781
5726925279.07641

它们都是12行。我想相应地将它们并排比较。具体来说,我想在两个查询结果中使用'geog'列计算重叠几何,可能使用ST_Intersection()或其他postgis方法。 (这里的区域仅用于演示目的。)

我该怎么做?我试过了: ROW_NUMBER() 与... ... ... 创建TEMP表... INTO #temp ...

请指出正确的方向!

2 个答案:

答案 0 :(得分:1)

我没有您的完整查询,但根据您提供的结果,您可以执行以下操作:

WITH CTE1 AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY col1) AS ROWNUM, col1 FROM tab1
),
CTE2 AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY col1) AS ROWNUM, col1 FROM tab2
)
SELECT CTE1.col1 AS RES_T1, CTE2.col1 AS RES_T2
FROM CTE1 FULL JOIN CTE2 ON CTE1.ROWNUM = CTE2.ROWNUM

sqlfiddle demo

希望您可以根据您的查询进行调整。

答案 1 :(得分:0)

您可以使用以下内容:

SELECT DISTINCT ON (a.id)
  a.id as a_id,
  b.id as b_id,
  ST_Area(ST_Intersection(a.geom, b.geom)) as intersect_area
FROM a, b
ORDER BY a.id, ST_Area(ST_Intersection(a.geom, b.geom)) DESC

它会为ST_Area(ST_Intersection(a.geom, b.geom))中的每一行找到最佳a