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.
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.
Respostas:
O GeoDataFrame
import geopandas as gpd
g1 = gpd.GeoDataFrame.from_file("poly_intersect.shp")
g1.shape
(4, 3)
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")
União
union_iter = intersection_iter.unary_union
b) Se você deseja mesclar os polígonos cruzados, altere intersection
por union
(todos os polígonos se sobrepõem no meu exemplo)
2) Você pode usar o GeoPandas Overlay
a)
auto_inter = gpd.overlay(g1, g1, how='intersection')
auto_inter.shape
(7,4)
O GeoDataframe resultante
Os GeoPandas adicionam as geometrias de interseção às geometrias existentes, portanto,
intersection = auto_inter[4:7]
intersection.to_file("intersection.shp")
União
union = intersection.unary_union
b) usar gpd.overlay(g1, g1, how='union')
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)