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()
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()
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()
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.
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.
A GeoDataFrame object is a pandas. DataFrame that has a column with geometry.
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.
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)
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With