Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make a union of polygons in GeoPandas, or Shapely (into a single geometry)

I am trying to find the union of two polygons in GeoPandas and output a single geometry that encompasses points from both polygons as its vertices. The geopandas.overlay function gives me polygons for each individual union but I would like a single polygon.

For context, I'm using this to combine two administrative areas together into a single area (i.e. include a town district within a country).

The following example is from the geopandas website and illustrates what I'd like:

from matplotlib import pyplot as plt import geopandas as gpd from shapely.geometry import Polygon  polys1 = gpd.GeoSeries([Polygon([(0,0), (2,0), (2,2), (0,2)]),                          Polygon([(2,2), (4,2), (4,4), (2,4)])])  polys2 = gpd.GeoSeries([Polygon([(1,1), (3,1), (3,3), (1,3)]),                          Polygon([(3,3), (5,3), (5,5), (3,5)])])  df1 = gpd.GeoDataFrame({'geometry': polys1, 'df1':[1,2]}) df2 = gpd.GeoDataFrame({'geometry': polys2, 'df2':[1,2]})  res_union = gpd.overlay(df1, df2, how='union') res_union.plot() 

res_union.png

None of the output geometries are what I was expected, which is the following:

poly_union = gpd.GeoSeries([Polygon([(0,0), (0,2), (1,2), (1,3), \     (2,3), (2,4), (3, 4), (3, 5), (5, 5), (5, 3), (4, 3), (4, 2), \     (3,2), (3,1), (2, 1), (2, 0), (0, 0)])])  poly_union.plot(color = 'red') plt.show() 

union.png

Firstly, how do I output the above polygon (poly_union) from the input polygons (df1, df2) using GeoPandas or shapely?

Secondly, what is the correct nomenclature associated with the geometry (poly_union) that I'm trying to find? I would call it a 'union' but every example I find that refers to 'unions' does not output this geometry.

Note: This example does not seem to output a single polygon either:

poly1 = df1['geometry']; poly2 = df2['geometry'] mergedpoly = poly1.union(poly2) mergedpoly.plot() 

merged_poly.png

like image 625
p-robot Avatar asked Nov 02 '16 17:11

p-robot


People also ask

How do you change the geometry on Geopandas?

To change which column is the active geometry column, use the GeoDataFrame. set_geometry() method. Note 2: Somewhat confusingly, by default when you use the read_file() command, the column containing spatial objects from the file is named “geometry” by default, and will be set as the active geometry column.

How do I merge Geopandas?

There are two ways to combine datasets in geopandas – attribute joins and spatial joins. In an attribute join, a GeoSeries or GeoDataFrame is combined with a regular pandas Series or DataFrame based on a common variable. This is analogous to normal merging or joining in pandas.

What is a GeoDataFrame?

A GeoDataFrame object is a pandas. DataFrame that has a column with geometry.

What is Multipolygon?

A MULTIPOLYGON is a collection of Polygons. MultiPolygons are useful for gathering a group of Polygons into one geometry. For example, you may want to gather the Polygons denoting a group of properties in a particular municipality.


2 Answers

From the question/answer here, it seems this is called a cascaded_union within shapely:

from shapely.ops import cascaded_union polygons = [poly1[0], poly1[1], poly2[0], poly2[1]] boundary = gpd.GeoSeries(cascaded_union(polygons)) boundary.plot(color = 'red') plt.show() 

Note: cascaded_union is superceded by unary_union if GEOS 3.2+ is used - this allows unions on different geometry types, not only polygons. To check your version,

>>> shapely.geos.geos_version (3, 5, 1) 

union

like image 139
p-robot Avatar answered Sep 27 '22 23:09

p-robot


If you prefer Geopandas over Shapely you might consider dissolve and use a column with a constant value for all entries: http://geopandas.org/aggregation_with_dissolve.html

like image 44
Rutger Hofste Avatar answered Sep 27 '22 23:09

Rutger Hofste