Postgis - 如何检测较大区域相交的交点
Postgis - How to detect an instersection of the bigger area instersected
我有两张地图加载到数据库中,一张地图有各州的几何图形,另一张有城市地区的几何图形。
我想创建和交集来建立城市地区和州之间的关系,以了解每个州属于哪个城市地区。
问题是一些城市地区占据两个州,城市地区属于在州几何范围内面积更大的州。
我可以使用命令ST_Intersects
,但它会添加城市与各州交叉的两个州。
我必须使用什么 sql 命令?我已经阅读了文档
ST_CoveredBy
和 ST_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
我有两张地图加载到数据库中,一张地图有各州的几何图形,另一张有城市地区的几何图形。 我想创建和交集来建立城市地区和州之间的关系,以了解每个州属于哪个城市地区。
问题是一些城市地区占据两个州,城市地区属于在州几何范围内面积更大的州。
我可以使用命令ST_Intersects
,但它会添加城市与各州交叉的两个州。
我必须使用什么 sql 命令?我已经阅读了文档
ST_CoveredBy
和 ST_Within
但我不确定它们是否适合我需要做的事情。
首先创建state和urban region的intersection对象并计算面积大小,使用
ST_intersect
on theJOIN
会使用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