อาจปิดหัวข้อเนื่องจากเป็นโซลูชัน postgresql / postgis:
ใน postgres / postgis มันเป็นแบบสอบถาม O (N ^ 2) แบบง่าย ๆ ที่อาจ / อาจนำมาใช้กับ geopanda
$ psql gis_se;
-- create the postgis extension
create extension postgis;
-- create a polygon table
create table test_overlap(id serial primary key);
-- Add the geometry
select addgeometrycolumn('public','test_overlap','geom',4326,'POLYGON',2);
insert into test_overlap(geom) values
(ST_GeomFromEWKT('SRID=4326;POLYGON((-2 -2, -2 -1,-1 -1,-1 -2, -2 -2))')),
(ST_GeomFromEWKT('SRID=4326;POLYGON((-2 -2, -2 0, 0 0, 0 -2, -2 -2))')),
(ST_GeomFromEWKT('SRID=4326;POLYGON((2 2, 2 0, 0 0, 0 2, 2 2))')),
(ST_GeomFromEWKT('SRID=4326;POLYGON((2 2, 2 1,1 1,1 2, 2 2))')),
(ST_GeomFromEWKT('SRID=4326;POLYGON((-1.5 -1.5, -1.5 1.5,1.5 1.5,1.5 -1.5, -1.5 -1.5))'));
และกำหนด 5 สี่เหลี่ยม:
คำขอแยกกับตารางตัวเอง:
select a.id, b.id, st_intersects(a.geom, b.geom)
from test_overlap as a, test_overlap as b
where a.id<>b.id;
แสดงให้เห็นว่าพื้นที่ใดที่ตัดกันซึ่งกันและกัน:
id | id | st_intersects
----+----+---------------
1 | 2 | t
1 | 3 | f
1 | 4 | f
1 | 5 | t
2 | 1 | t
2 | 3 | t
2 | 4 | f
2 | 5 | t
3 | 1 | f
3 | 2 | t
3 | 4 | t
3 | 5 | t
4 | 1 | f
4 | 2 | f
4 | 3 | t
4 | 5 | t
5 | 1 | t
5 | 2 | t
5 | 3 | t
5 | 4 | t
การใช้พื้นฐานนี้คุณสามารถรวมจำนวนสำหรับแต่ละวัตถุ ID ผ่านกลุ่มโดย clausel:
select id, count(id)
from (select
a.id as id, b.id as bid,
st_intersects(a.geom, b.geom) as intersects
from test_overlap as a, test_overlap as b where a.id<>b.id
) as i
where intersects
group by id
order by id;
ผลลัพธ์แสดงรูปแบบที่ต้องการ
id | count
----+-------
1 | 2
2 | 3
3 | 3
4 | 2
5 | 4