#!/usr/bin/env python
# coding: utf-8
# # Clip Vector Data with GeoPandas
#
#
# Learn how to clip geometries to the boundary of a polygon geometry
# using GeoPandas.
# The example below shows you how to clip a set of vector geometries
# to the spatial extent / shape of another vector object. Both sets of geometries
# must be opened with GeoPandas as GeoDataFrames and be in the same Coordinate
# Reference System (CRS) for the `clip` function in GeoPandas to work.
#
# This example uses example data from ``geodatasets`` ``'geoda.chicago-health'`` and
# ``'geoda.groceries'``, alongside a custom rectangle geometry made with
# shapely and then turned into a GeoDataFrame.
#
#
#
# Note
#
# The object to be clipped will be clipped to the full extent of the clip
# object. If there are multiple polygons in clip object, the input data will
# be clipped to the total boundary of all polygons in clip object.
#
#
#
# Import Packages
# ---------------
#
# To begin, import the needed packages.
#
#
# In[ ]:
import matplotlib.pyplot as plt
import geopandas
from shapely.geometry import box
import geodatasets
# Get or Create Example Data
# --------------------------
#
# Below, the example GeoPandas data is imported and opened as a GeoDataFrame.
# Additionally, a polygon is created with shapely and then converted into a
# GeoDataFrame with the same CRS as the GeoPandas chicago dataset.
#
#
# In[ ]:
chicago = geopandas.read_file(geodatasets.get_path("geoda.chicago_commpop"))
groceries = geopandas.read_file(geodatasets.get_path("geoda.groceries")).to_crs(chicago.crs)
# Create a subset of the chicago data that is just the South American continent
near_west_side = chicago[chicago["community"] == "NEAR WEST SIDE"]
# Create a custom polygon
polygon = box(-87.8, 41.90, -87.5, 42)
poly_gdf = geopandas.GeoDataFrame([1], geometry=[polygon], crs=chicago.crs)
# Plot the Unclipped Data
# -----------------------
#
#
# In[ ]:
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))
chicago.plot(ax=ax1)
poly_gdf.boundary.plot(ax=ax1, color="red")
near_west_side.boundary.plot(ax=ax2, color="green")
groceries.plot(ax=ax2, color="purple")
ax1.set_title("All Unclipped Chicago Communities", fontsize=20)
ax2.set_title("All Unclipped Groceries", fontsize=20)
ax1.set_axis_off()
ax2.set_axis_off()
plt.show()
# Clip the Data
# --------------
#
# The object on which you call `clip` is the object that will
# be clipped. The object you pass is the clip extent. The returned output
# will be a new clipped GeoDataframe. All of the attributes for each returned
# geometry will be retained when you clip.
#
#
#
# Note
#
# Recall that the data must be in the same CRS in order to use the
# `clip` method. If the data are not in the same CRS, be sure to use
# the GeoPandas `GeoDataFrame.to_crs` method to ensure both datasets
# are in the same CRS.
#
#
#
# Clip the chicago Data
# --------------------
#
#
# In[ ]:
chicago_clipped = chicago.clip(polygon)
# Plot the clipped data
# The plot below shows the results of the clip function applied to the chicago
# sphinx_gallery_thumbnail_number = 2
fig, ax = plt.subplots(figsize=(12, 8))
chicago_clipped.plot(ax=ax, color="purple")
chicago.boundary.plot(ax=ax)
poly_gdf.boundary.plot(ax=ax, color="red")
ax.set_title("Chicago Clipped", fontsize=20)
ax.set_axis_off()
plt.show()
#
#
# Note
#
# For historical reasons, the clip method is also available as a top-level function `geopandas.clip`.
# It is recommended to use the method as the function may be deprecated in the future.
#
#
# Clip the groceries Data
# ----------------------
#
#
# In[ ]:
groceries_clipped = groceries.clip(near_west_side)
# Plot the clipped data
# The plot below shows the results of the clip function applied to the capital cities
fig, ax = plt.subplots(figsize=(12, 8))
groceries_clipped.plot(ax=ax, color="purple")
near_west_side.boundary.plot(ax=ax, color="green")
ax.set_title("Groceries Clipped", fontsize=20)
ax.set_axis_off()
plt.show()