Postgis - 如何检测较大区域相交的交点

Postgis - How to detect an instersection of the bigger area instersected

我有两张地图加载到数据库中,一张地图有各州的几何图形,另一张有城市地区的几何图形。 我想创建和交集来建立城市地区和州之间的关系,以了解每个州属于哪个城市地区。

问题是一些城市地区占据两个州,城市地区属于在州几何范围内面积更大的州。

我可以使用命令ST_Intersects,但它会添加城市与各州交叉的两个州。

我必须使用什么 sql 命令?我已经阅读了文档 ST_CoveredByST_Within 但我不确定它们是否适合我需要做的事情。

  • 首先创建state和urban region的intersection对象并计算面积大小,使用ST_intersect on the JOIN会使用index来避免开销。

  • 然后按面积给每个urban_id订单分配一个row_number

  • rn = 1仅表示return每个urban_id的最大面积。

.

WITH cte as (
    SELECT S.state_id, 
           U.urban_id, 
           ST_Area(ST_Intersection( S.geom, U.geom )) a_geom 
                 -- This create the intersect geom and calculate area
    FROM states S
    JOIN urban U
      ON ST_Intersects( S.geom, U.geom ) -- This is a boolean function
),
area as (
    SELECT state_id, 
           urban_id,                
           row_number() over (partition by urban_id order by a_geom desc) as rn
    FROM  cte
)
SELECT state_id,
       urban_id
FROM area
WHERE rn = 1

您可以在 ST_Intersection 上使用 ST_Area 进行排序和 LATERAL JOIN

WITH states(id, geom) AS(
    VALUES  (1, ST_MakePolygon(ST_GeomFromText('LINESTRING(0 0, 1 0, 1 1, 0 1, 0 0)')))
        ,(2, ST_MakePolygon(ST_GeomFromText('LINESTRING(1 0, 2 0, 2 1, 1 1, 1 0)')))
),cities(id, geom) AS(
    VALUES  (1,ST_Buffer(ST_GeomFromText('POINT(0.5 0.5)'), 0.3))
        ,(2,ST_Buffer(ST_GeomFromText('POINT(1.5 0.5)'), 0.3))
        ,(3,ST_Buffer(ST_GeomFromText('POINT(1.1 0.5)'), 0.3))
)
SELECT c.id AS city, s.id AS state
FROM cities AS c
    CROSS JOIN LATERAL  (SELECT s.id, s.geom
                 FROM states AS s
                 WHERE ST_Intersects(s.geom, c.geom)
                 ORDER BY ST_AREA(ST_Intersection(s.geom,c.geom)) DESC
                 LIMIT 1) AS s