Files
2025-11-30 08:30:10 +08:00

4.1 KiB

Geometric Operations

GeoPandas provides extensive geometric manipulation through Shapely integration.

Constructive Operations

Create new geometries from existing ones:

Buffer

Create geometries representing all points within a distance:

# Buffer by fixed distance
buffered = gdf.geometry.buffer(10)

# Negative buffer (erosion)
eroded = gdf.geometry.buffer(-5)

# Buffer with resolution parameter
smooth_buffer = gdf.geometry.buffer(10, resolution=16)

Boundary

Get lower-dimensional boundary:

# Polygon -> LineString, LineString -> MultiPoint
boundaries = gdf.geometry.boundary

Centroid

Get center point of each geometry:

centroids = gdf.geometry.centroid

Convex Hull

Smallest convex polygon containing all points:

hulls = gdf.geometry.convex_hull

Concave Hull

Smallest concave polygon containing all points:

# ratio parameter controls concavity (0 = convex hull, 1 = most concave)
concave_hulls = gdf.geometry.concave_hull(ratio=0.5)

Envelope

Smallest axis-aligned rectangle:

envelopes = gdf.geometry.envelope

Simplify

Reduce geometric complexity:

# Douglas-Peucker algorithm with tolerance
simplified = gdf.geometry.simplify(tolerance=10)

# Preserve topology (prevents self-intersections)
simplified = gdf.geometry.simplify(tolerance=10, preserve_topology=True)

Segmentize

Add vertices to line segments:

# Add vertices with maximum segment length
segmented = gdf.geometry.segmentize(max_segment_length=5)

Union All

Combine all geometries into single geometry:

# Union all features
unified = gdf.geometry.union_all()

Affine Transformations

Mathematical transformations of coordinates:

Rotate

# Rotate around origin (0, 0) by angle in degrees
rotated = gdf.geometry.rotate(angle=45, origin='center')

# Rotate around custom point
rotated = gdf.geometry.rotate(angle=45, origin=(100, 100))

Scale

# Scale uniformly
scaled = gdf.geometry.scale(xfact=2.0, yfact=2.0)

# Scale with origin
scaled = gdf.geometry.scale(xfact=2.0, yfact=2.0, origin='center')

Translate

# Shift coordinates
translated = gdf.geometry.translate(xoff=100, yoff=50)

Skew

# Shear transformation
skewed = gdf.geometry.skew(xs=15, ys=0, origin='center')

Custom Affine Transform

from shapely import affinity

# Apply 6-parameter affine transformation matrix
# [a, b, d, e, xoff, yoff]
transformed = gdf.geometry.affine_transform([1, 0, 0, 1, 100, 50])

Geometric Properties

Access geometric properties (returns pandas Series):

# Area
areas = gdf.geometry.area

# Length/perimeter
lengths = gdf.geometry.length

# Bounding box coordinates
bounds = gdf.geometry.bounds  # Returns DataFrame with minx, miny, maxx, maxy

# Total bounds for entire GeoSeries
total_bounds = gdf.geometry.total_bounds  # Returns array [minx, miny, maxx, maxy]

# Check geometry types
geom_types = gdf.geometry.geom_type

# Check if valid
is_valid = gdf.geometry.is_valid

# Check if empty
is_empty = gdf.geometry.is_empty

Geometric Relationships

Binary predicates testing relationships:

# Within
gdf1.geometry.within(gdf2.geometry)

# Contains
gdf1.geometry.contains(gdf2.geometry)

# Intersects
gdf1.geometry.intersects(gdf2.geometry)

# Touches
gdf1.geometry.touches(gdf2.geometry)

# Crosses
gdf1.geometry.crosses(gdf2.geometry)

# Overlaps
gdf1.geometry.overlaps(gdf2.geometry)

# Covers
gdf1.geometry.covers(gdf2.geometry)

# Covered by
gdf1.geometry.covered_by(gdf2.geometry)

Point Extraction

Extract specific points from geometries:

# Representative point (guaranteed to be within geometry)
rep_points = gdf.geometry.representative_point()

# Interpolate point along line at distance
points = line_gdf.geometry.interpolate(distance=10)

# Interpolate point at normalized distance (0 to 1)
midpoints = line_gdf.geometry.interpolate(distance=0.5, normalized=True)

Delaunay Triangulation

# Create triangulation
triangles = gdf.geometry.delaunay_triangles()