Contando recursos em interseções de polígonos bem torneados

13

Eu tenho geopandas GeoDataFrame contendo centenas de formas Polygone MultiPolygonformas geométricas. Os polígonos se sobrepõem em muitos lugares. Gostaria de fazer uma nova geometria que contenha quantas delas se sobrepõem. Algo assim:

Contando sobreposições

Alguém tem alguma idéia de como abordar isso? Eu nem consigo ver uma entrada.

Eventualmente, eu gostaria especialmente de poder ponderar os polígonos, para que alguns polígonos valessem 2 por conta própria. Fazer isso com shapelyo campo Z pode ser bom.

Além disso: não estou particularmente ligado a nenhuma dessas bibliotecas, é exatamente onde acabei. As coordenadas nessas geometrias são na verdade coordenadas de pixel - estou tentando fazer uma varredura sobreposta em outra imagem. Eu preferiria manter minha área ocupada o menor possível, pois gostaria de poder implantar essas coisas em servidores em nuvem, etc., onde talvez não seja possível instalar coisas aleatórias.

kwinkunks
fonte
Tente este exemplo . Você pode dividir os polígonos para cada interseção 1 a 1 e contar cada instância, fazer uma lista em python para preencher com o número da contagem e, em seguida, a tabela de atributos.
blu_sr
Embora não haja código incluído, mas esta resposta no SO descreve um algoritmo para verificar se um polígono está totalmente dentro de outro. Presumo que, se você verificou pelo menos uma interseção de linha entre segmentos de linha, isso indicaria polígonos sobrepostos.
SteveJ
Também parece haver uma função de geopandas GeoSeries.intersects ; Gostaria de saber se funciona em polígonos.
Stevej
você tem a capacidade de rasterizá-los? se você rasterizar todos eles para ter um nos polígonos, poderá usar numpy para adicioná-los e cada número no resultado indicará quantos polígonos se sobrepõem nesse pixel.
user1269942

Respostas:

2

Pode estar fora de tópico, porque é uma solução postgresql / postgis:

No postgres / postgis, é uma simples consulta O (N ^ 2) que pode / pode ser adotada no 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))'));

e define 5 retângulos:

insira a descrição da imagem aqui

A solicitação de interseção com a própria tabela:

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; 

mostra quais áreas se cruzam:

 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

Usando essa base, você pode agregar as contagens para cada objeto de ID por meio do grupo, 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;

O resultado mostra o padrão desejado.

 id | count 
----+-------
  1 |     2
  2 |     3
  3 |     3
  4 |     2
  5 |     4
huckfinn
fonte