One polygon overlapping another polygon#

import geopandas
import numpy
import matplotlib.pyplot as plt
import geoplanar
from shapely.geometry import box, Polygon
p1 = box(0,0,10,10)
p2 = box(8,4, 12,6)

gdf = geopandas.GeoDataFrame(geometry=[p1,p2])
gdf.plot(edgecolor='k')
<Axes: >
_images/4fe90b7284d009d30e8c88c778bd218151895b55d2c7f544cdb6c3d800b8bff9.png
geoplanar.is_overlapping(gdf)
True
gdf.geometry[0]
_images/287ed719312ac9291e158b277bc0acdcd9743febcd046cad9959602b0eb338d5.svg
gdf.geometry[1]
_images/b38c3ad7d98facc957c39fd756d9fa9061b3cbb7b8514b7db18f5f38e0ceb5dc.svg
gdf = geoplanar.trim_overlaps(gdf)
geoplanar.is_overlapping(gdf)
largest
largest
False
gdf.geometry[0]
_images/287ed719312ac9291e158b277bc0acdcd9743febcd046cad9959602b0eb338d5.svg
gdf.geometry[1]
_images/ca46a22999bb6e1726af448305d83b0c5ba6e18b5af6ce49617b077f11fff7fd.svg
gdf.area
0    100.0
1      4.0
dtype: float64

Default trims the largest of the two overlapping polygons#

To have the correction apply the trim to the smaller of the two polygons, set strategy="largest":

p1 = box(0,0,10,10)
p2 = box(8,4, 12,6)

gdf = geopandas.GeoDataFrame(geometry=[p1,p2])
gdf.plot(edgecolor='k')
<Axes: >
_images/4fe90b7284d009d30e8c88c778bd218151895b55d2c7f544cdb6c3d800b8bff9.png
gdf_l = geoplanar.trim_overlaps(gdf)
gdf_l.plot(edgecolor='k')
largest
largest
<Axes: >
_images/8b90e5931a7e171413eada4ed5d654b643248d6568300e015ec31daeebdc4339.png
gdf_s = geoplanar.trim_overlaps(gdf, strategy='smallest')
gdf_s.plot(edgecolor='k')
<Axes: >
_images/ea7145ce8fdaa93ce42fd155afbccd398dd6d7ffdfeb3747b555d898f639fb5e.png
gdf_c = geoplanar.trim_overlaps(gdf, strategy='compact')
gdf_c.plot(edgecolor='k')
<Axes: >
_images/9e37fe2daa8fb1397d20fc49af06a810a5d4d00684a1c1e2c8ac3c20a919becc.png
geoplanar.trim_overlaps(gdf, strategy=None).plot(edgecolor='k')
<Axes: >
_images/9e37fe2daa8fb1397d20fc49af06a810a5d4d00684a1c1e2c8ac3c20a919becc.png
gdf.geometry[0]
_images/287ed719312ac9291e158b277bc0acdcd9743febcd046cad9959602b0eb338d5.svg
gdf.geometry[1]
_images/ca46a22999bb6e1726af448305d83b0c5ba6e18b5af6ce49617b077f11fff7fd.svg
gdf.area
0    100.0
1      4.0
dtype: float64

Merge polygons#

p1 = box(0,0,10,10)
p2 = box(8,4, 12,6)

gdf = geopandas.GeoDataFrame(geometry=[p1,p2])
gdf.plot(edgecolor='k')
<Axes: >
_images/e1e4f42cc89a3b76c59f8cde40b90481c5f7b56aa37243c1359dc459849bf233.png
# merge features that overlap by at least 10% (and any features with an area less than 1 no matter the overlap %)
gdf = geoplanar.merge_overlaps(gdf, merge_limit = 1, overlap_limit = 0.1)
geoplanar.is_overlapping(gdf)
False
gdf.plot(edgecolor='k')
<Axes: >
_images/ab5b2512ba753b61fdbc50964095bd25af4b377608a4e13d79e26f5aaed73d63.png
gdf.area
0    104.0
dtype: float64

If polygons are larger than the merge limit and the area of overlapping polygons is smaller than the overlap limit, the polygons are not merged.

gdf = geoplanar.merge_overlaps(gdf, merge_limit = 1, overlap_limit = 1)
geoplanar.is_overlapping(gdf)
True

Planar Enforcement Violation: One polygon overlapping two#

As always, care must be taken when carrying out a planar correction, as the result may not be what is desired:

p1 = box(0,0,10,10)
p2 = box(10,0, 20,10)
p3 = box(8,4, 12,6)

gdf = geopandas.GeoDataFrame(geometry=[p1,p2,p3])
gdf.plot(edgecolor='k')
<Axes: >
_images/5a69a5327b74179523219f5ddbd0b9792aa71721fa8cd3e7b16fb09ca7965652.png
gdf1 = geoplanar.trim_overlaps(gdf, largest=False) # trim the smallest feature of an intersecting pair
gdf1.area
0    100.0
1    100.0
2      0.0
dtype: float64
gdf1.plot(edgecolor='k')
<AxesSubplot:>
_images/3bcd7be8d69f775df32c9dd638a28c94a012ebf28de8527e4cae5a3c306c7051.png
p1 = box(0,0,10,10)
p2 = box(10,0, 20,10)
p3 = box(8,4, 12,6)

gdf = geopandas.GeoDataFrame(geometry=[p1,p2,p3])
gdf2 = geoplanar.trim_overlaps(gdf)
gdf2.geometry
0    POLYGON ((0.00000 0.00000, 0.00000 10.00000, 1...
1    POLYGON ((10.00000 4.00000, 12.00000 4.00000, ...
2    POLYGON ((12.00000 4.00000, 12.00000 6.00000, ...
Name: geometry, dtype: geometry
gdf2.area
0    96.0
1    96.0
2     8.0
dtype: float64
gdf2.plot(edgecolor='k')
<AxesSubplot:>
_images/db5d757112e6dfb8140f9ff023aa1689e973a8396296c2a428388f2e7ce92988.png
gdf2 = geoplanar.merge_overlaps(gdf, merge_limit=1, overlap_limit=0.1) # merge features that overlap by at least 10%
gdf2.area
0    200.0
dtype: float64
gdf2.plot(edgecolor='k') #all polygons are merged into a single polygon
<Axes: >
_images/94a92c17264b3e0583b60b9fae91f47a40459e757017e3786695569b12e703f2.png