mirror of
https://github.com/wassname/geopandas.git
synced 2026-09-18 12:30:35 +08:00
Co-authored-by: Martin Fleischmann <martin@martinfleischmann.net> Co-authored-by: Nathan Korinek <nako1890@colorado.edu> Co-authored-by: Joris Van den Bossche <jorisvandenbossche@gmail.com>
117 lines
4.2 KiB
Python
117 lines
4.2 KiB
Python
"""
|
|
Clip Vector Data with GeoPandas
|
|
==================================================================
|
|
|
|
Learn how to clip geometries to the boundary of a polygon geometry
|
|
using GeoPandas.
|
|
|
|
.. currentmodule:: 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 :func:`clip` function in GeoPandas to work.
|
|
#
|
|
# This example uses GeoPandas example data ``'naturalearth_cities'`` and
|
|
# ``'naturalearth_lowres'``, 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.
|
|
|
|
import matplotlib.pyplot as plt
|
|
import geopandas
|
|
from shapely.geometry import Polygon
|
|
|
|
###############################################################################
|
|
# 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 world dataset.
|
|
|
|
capitals = geopandas.read_file(geopandas.datasets.get_path("naturalearth_cities"))
|
|
world = geopandas.read_file(geopandas.datasets.get_path("naturalearth_lowres"))
|
|
|
|
# Create a subset of the world data that is just the South American continent
|
|
south_america = world[world["continent"] == "South America"]
|
|
|
|
# Create a custom polygon
|
|
polygon = Polygon([(0, 0), (0, 90), (180, 90), (180, 0), (0, 0)])
|
|
poly_gdf = geopandas.GeoDataFrame([1], geometry=[polygon], crs=world.crs)
|
|
|
|
###############################################################################
|
|
# Plot the Unclipped Data
|
|
# -----------------------
|
|
|
|
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))
|
|
world.plot(ax=ax1)
|
|
poly_gdf.boundary.plot(ax=ax1, color="red")
|
|
south_america.boundary.plot(ax=ax2, color="green")
|
|
capitals.plot(ax=ax2, color="purple")
|
|
ax1.set_title("All Unclipped World Data", fontsize=20)
|
|
ax2.set_title("All Unclipped Capital Data", fontsize=20)
|
|
ax1.set_axis_off()
|
|
ax2.set_axis_off()
|
|
plt.show()
|
|
|
|
###############################################################################
|
|
# Clip the Data
|
|
# --------------
|
|
#
|
|
# When you call :func:`clip`, the first object called is the object that will
|
|
# be clipped. The second object called 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
|
|
# :func:`clip` function. If the data are not in the same CRS, be sure to use
|
|
# the GeoPandas :meth:`~GeoDataFrame.to_crs` method to ensure both datasets
|
|
# are in the same CRS.
|
|
|
|
###############################################################################
|
|
# Clip the World Data
|
|
# --------------------
|
|
|
|
world_clipped = geopandas.clip(world, polygon)
|
|
|
|
# Plot the clipped data
|
|
# The plot below shows the results of the clip function applied to the world
|
|
# sphinx_gallery_thumbnail_number = 2
|
|
fig, ax = plt.subplots(figsize=(12, 8))
|
|
world_clipped.plot(ax=ax, color="purple")
|
|
world.boundary.plot(ax=ax)
|
|
poly_gdf.boundary.plot(ax=ax, color="red")
|
|
ax.set_title("World Clipped", fontsize=20)
|
|
ax.set_axis_off()
|
|
plt.show()
|
|
|
|
###############################################################################
|
|
# Clip the Capitals Data
|
|
# ----------------------
|
|
|
|
capitals_clipped = geopandas.clip(capitals, south_america)
|
|
|
|
# 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))
|
|
capitals_clipped.plot(ax=ax, color="purple")
|
|
south_america.boundary.plot(ax=ax, color="green")
|
|
ax.set_title("Capitals Clipped", fontsize=20)
|
|
ax.set_axis_off()
|
|
plt.show()
|