将特征计数为形状多边形的交点


13

我有一个包含数百个形状和几何形状的大熊猫 。多边形在很多地方重叠。我想制作一个新几何,其中包含其中有多少重叠的计数。像这样:GeoDataFramePolygonMultiPolygon

计算重叠

有人对如何解决这个问题有任何想法吗?我什至看不到办法。

最终,我特别希望能够对多边形进行加权,以使某些多边形自己值2。使用shapely的Z字段执行此操作可能很好。

除了:我与这些库都不特别相关,这就是我最终的去向。这些几何形状中的坐标实际上是像素坐标-我正努力制作栅格以使其覆盖在另一幅图像上。我希望将占用空间保持尽可能小,因为我希望能够将这些资源部署到可能无法安装随机资源的云服务器等中。


试试这个例子。您可以为每个1对1的交集分割多边形,并对每个实例进行计数,在python中创建一个列表以填充计数数字,然后填充属性表。
blu_sr 2015年

尽管不包含任何代码,但是SO上的答案描述了一种算法,用于检查一个多边形是否完全在另一个多边形内。我假设如果您检查线段之间至少有一条线相交,那么那将表示重叠的多边形。
Stevej

也似乎有一个geopandas函数GeoSeries.intersects ; 我想知道它是否对多边形有效。
stevej

您有能力将它们栅格化吗?如果将它们全部栅格化以在多边形中具有一个,则可以使用numpy将它们加在一起,结果中的每个数字将指示在该像素处有多少个多边形重叠。
user1269942

Answers:


2

可能不在主题范围内,因为它是一种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

在此基础上,您可以通过group by子句1 汇总每个ID对象的计数:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.