Mesclando recursos sobrepostos usando Geopandas?

8

Eu tenho um Shapefile com recursos sobrepostos. Existe uma maneira fácil de mesclá-los com geopandas?

Eu encontrei uma maneira com formas, mas gostaria de fazê-lo diretamente com as geopandas.

Mehdi.Sqalli
fonte

Respostas:

10

O GeoDataFrame

import geopandas as gpd
g1 = gpd.GeoDataFrame.from_file("poly_intersect.shp")
g1.shape
(4, 3)

insira a descrição da imagem aqui

insira a descrição da imagem aqui

1) Você pode usar o módulo itertools

a) Se você deseja mesclar as interseções dos polígonos sobrepostos

import itertools
geoms = g1['geometry'].tolist()
intersection_iter = gpd.GeoDataFrame(gpd.GeoSeries([poly[0].intersection(poly[1]) for poly in  itertools.combinations(geoms, 2) if poly[0].intersects(poly[1])]), columns=['geometry'])
intersection_iter.to_file("intersection_iter.shp") 

insira a descrição da imagem aqui

insira a descrição da imagem aqui

União

union_iter = intersection_iter.unary_union

b) Se você deseja mesclar os polígonos cruzados, altere intersectionpor union(todos os polígonos se sobrepõem no meu exemplo)

insira a descrição da imagem aqui

2) Você pode usar o GeoPandas Overlay

a)

auto_inter = gpd.overlay(g1, g1, how='intersection')
auto_inter.shape
(7,4)

O GeoDataframe resultante

insira a descrição da imagem aqui

Os GeoPandas adicionam as geometrias de interseção às geometrias existentes, portanto,

intersection = auto_inter[4:7]
intersection.to_file("intersection.shp") 

insira a descrição da imagem aqui

União

union = intersection.unary_union

b) usar gpd.overlay(g1, g1, how='union')

gene
fonte
1

Se você deseja gerar uma camada de polígonos sobrepostos mesclados distintos e não apenas um único multi-polígono, depois de usar:

union = intersection.unary_union

você pode converter o multi-poli resultante em um GeoSeries:

shapes_series = gpd.GeoSeries([polygon for polygon in union])

ou para um GeoDataFrame:

shapes_df = gpd.GeoDataFrame([polygon for polygon in union]).set_geometry(0)
Pawel Kranzberg
fonte
Provavelmente, isso deve ser uma edição da primeira resposta e não uma resposta por si só
nmtoken
Obrigado pela dica, mas eu acabaria reformulando a resposta do gene, e não vale a pena o esforço. Não pude adicionar um comentário, já que meu representante está abaixo de 50.
Pawel Kranzberg