shapely-compute
Scannednpx machina-cli add skill parcadei/Continuous-Claude-v3/shapely-compute --openclawComputational Geometry with Shapely
When to Use
- Creating geometric shapes (points, lines, polygons)
- Boolean operations (intersection, union, difference)
- Spatial predicates (contains, intersects, within)
- Measurements (area, length, distance, centroid)
- Geometry transformations (translate, rotate, scale)
- Validating and fixing invalid geometries
Quick Reference
| I want to... | Command | Example |
|---|---|---|
| Create geometry | create | create polygon --coords "0,0 1,0 1,1 0,1" |
| Intersection | op intersection | op intersection --g1 "POLYGON(...)" --g2 "POLYGON(...)" |
| Check contains | pred contains | pred contains --g1 "POLYGON(...)" --g2 "POINT(0.5 0.5)" |
| Calculate area | measure area | measure area --geom "POLYGON(...)" |
| Distance | distance | distance --g1 "POINT(0 0)" --g2 "POINT(3 4)" |
| Transform | transform translate | transform translate --geom "..." --params "1,2" |
| Validate | validate | validate --geom "POLYGON(...)" |
Commands
create
Create geometric objects from coordinates.
# Point
uv run python scripts/shapely_compute.py create point --coords "1,2"
# Line (2+ points)
uv run python scripts/shapely_compute.py create line --coords "0,0 1,1 2,0"
# Polygon (3+ points, auto-closes)
uv run python scripts/shapely_compute.py create polygon --coords "0,0 1,0 1,1 0,1"
# Polygon with hole
uv run python scripts/shapely_compute.py create polygon --coords "0,0 10,0 10,10 0,10" --holes "2,2 8,2 8,8 2,8"
# MultiPoint
uv run python scripts/shapely_compute.py create multipoint --coords "0,0 1,1 2,2"
# MultiLineString (pipe-separated lines)
uv run python scripts/shapely_compute.py create multilinestring --coords "0,0 1,1|2,2 3,3"
# MultiPolygon (pipe-separated polygons)
uv run python scripts/shapely_compute.py create multipolygon --coords "0,0 1,0 1,1 0,1|2,2 3,2 3,3 2,3"
op (operations)
Boolean geometry operations.
# Intersection of two polygons
uv run python scripts/shapely_compute.py op intersection \
--g1 "POLYGON((0 0,2 0,2 2,0 2,0 0))" \
--g2 "POLYGON((1 1,3 1,3 3,1 3,1 1))"
# Union
uv run python scripts/shapely_compute.py op union --g1 "POLYGON(...)" --g2 "POLYGON(...)"
# Difference (g1 - g2)
uv run python scripts/shapely_compute.py op difference --g1 "POLYGON(...)" --g2 "POLYGON(...)"
# Symmetric difference (XOR)
uv run python scripts/shapely_compute.py op symmetric_difference --g1 "..." --g2 "..."
# Buffer (expand/erode)
uv run python scripts/shapely_compute.py op buffer --g1 "POINT(0 0)" --g2 "1.5"
# Convex hull
uv run python scripts/shapely_compute.py op convex_hull --g1 "MULTIPOINT((0 0),(1 1),(0 2),(2 0))"
# Envelope (bounding box)
uv run python scripts/shapely_compute.py op envelope --g1 "POLYGON(...)"
# Simplify (reduce points)
uv run python scripts/shapely_compute.py op simplify --g1 "LINESTRING(...)" --g2 "0.5"
pred (predicates)
Spatial relationship tests (returns boolean).
# Does polygon contain point?
uv run python scripts/shapely_compute.py pred contains \
--g1 "POLYGON((0 0,2 0,2 2,0 2,0 0))" \
--g2 "POINT(1 1)"
# Do geometries intersect?
uv run python scripts/shapely_compute.py pred intersects --g1 "..." --g2 "..."
# Is g1 within g2?
uv run python scripts/shapely_compute.py pred within --g1 "POINT(1 1)" --g2 "POLYGON(...)"
# Do geometries touch (share boundary)?
uv run python scripts/shapely_compute.py pred touches --g1 "..." --g2 "..."
# Do geometries cross?
uv run python scripts/shapely_compute.py pred crosses --g1 "LINESTRING(...)" --g2 "LINESTRING(...)"
# Are geometries disjoint (no intersection)?
uv run python scripts/shapely_compute.py pred disjoint --g1 "..." --g2 "..."
# Do geometries overlap?
uv run python scripts/shapely_compute.py pred overlaps --g1 "..." --g2 "..."
# Are geometries equal?
uv run python scripts/shapely_compute.py pred equals --g1 "..." --g2 "..."
# Does g1 cover g2?
uv run python scripts/shapely_compute.py pred covers --g1 "..." --g2 "..."
# Is g1 covered by g2?
uv run python scripts/shapely_compute.py pred covered_by --g1 "..." --g2 "..."
measure
Geometric measurements.
# Area (polygons)
uv run python scripts/shapely_compute.py measure area --geom "POLYGON((0 0,1 0,1 1,0 1,0 0))"
# Length (lines, polygon perimeter)
uv run python scripts/shapely_compute.py measure length --geom "LINESTRING(0 0,3 4)"
# Centroid
uv run python scripts/shapely_compute.py measure centroid --geom "POLYGON((0 0,2 0,2 2,0 2,0 0))"
# Bounds (minx, miny, maxx, maxy)
uv run python scripts/shapely_compute.py measure bounds --geom "POLYGON(...)"
# Exterior ring (polygon only)
uv run python scripts/shapely_compute.py measure exterior_ring --geom "POLYGON(...)"
# All measurements at once
uv run python scripts/shapely_compute.py measure all --geom "POLYGON((0 0,2 0,2 2,0 2,0 0))"
distance
Distance between geometries.
uv run python scripts/shapely_compute.py distance --g1 "POINT(0 0)" --g2 "POINT(3 4)"
# Returns: {"distance": 5.0, "g1_type": "Point", "g2_type": "Point"}
transform
Affine transformations.
# Translate (move)
uv run python scripts/shapely_compute.py transform translate \
--geom "POLYGON((0 0,1 0,1 1,0 1,0 0))" --params "5,10"
# params: dx,dy or dx,dy,dz
# Rotate (degrees, around centroid by default)
uv run python scripts/shapely_compute.py transform rotate \
--geom "POLYGON((0 0,1 0,1 1,0 1,0 0))" --params "45"
# params: angle or angle,origin_x,origin_y
# Scale (from centroid by default)
uv run python scripts/shapely_compute.py transform scale \
--geom "POLYGON((0 0,1 0,1 1,0 1,0 0))" --params "2,2"
# params: sx,sy or sx,sy,origin_x,origin_y
# Skew
uv run python scripts/shapely_compute.py transform skew \
--geom "POLYGON(...)" --params "15,0"
# params: xs,ys (degrees)
validate / makevalid
Check and fix geometry validity.
# Check if valid
uv run python scripts/shapely_compute.py validate --geom "POLYGON((0 0,1 0,1 1,0 1,0 0))"
# Returns: {"is_valid": true, "type": "Polygon", ...}
# Fix invalid geometry (self-intersecting, etc.)
uv run python scripts/shapely_compute.py makevalid --geom "POLYGON((0 0,2 2,2 0,0 2,0 0))"
coords
Extract coordinates from geometry.
uv run python scripts/shapely_compute.py coords --geom "POLYGON((0 0,1 0,1 1,0 1,0 0))"
# Returns: {"coords": [[0,0],[1,0],[1,1],[0,1],[0,0]], "type": "Polygon"}
fromwkt
Parse WKT and get geometry information.
uv run python scripts/shapely_compute.py fromwkt "POLYGON((0 0,1 0,1 1,0 1,0 0))"
# Returns: {"type": "Polygon", "bounds": [...], "area": 1.0, ...}
Geometry Types
point- Single coordinate (x, y) or (x, y, z)line/linestring- Sequence of connected pointspolygon- Closed shape with optional holesmultipoint,multilinestring,multipolygon- Collections
Input Formats
- Coordinates string:
"0,0 1,0 1,1 0,1"(space-separated x,y pairs) - WKT:
"POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))"
Output Format
All commands return JSON with:
wkt: WKT representation of result geometrytype: Geometry type (Point, LineString, Polygon, etc.)bounds: (minx, miny, maxx, maxy)is_valid,is_empty: Validity flags- Measurement-specific fields (area, length, distance, etc.)
Common Use Cases
| Use Case | Command |
|---|---|
| Collision detection | pred intersects |
| Point-in-polygon | pred contains |
| Area calculation | measure area |
| Buffer zones | op buffer |
| Shape combination | op union |
| Shape subtraction | op difference |
| Bounding box | op envelope or measure bounds |
| Simplify path | op simplify |
Related Skills
/math-mode- Full math orchestration (SymPy, Z3)/math-plot- Visualization with matplotlib
Source
git clone https://github.com/parcadei/Continuous-Claude-v3/blob/main/.claude/skills/shapely-compute/SKILL.mdView on GitHub Overview
Computational Geometry with Shapely lets you create points, lines, and polygons, perform boolean operations (intersection, union, difference), and evaluate spatial predicates and measurements (area, length, distance, centroid). It also supports geometry transformations and validating/fixing invalid geometries to ensure robust GIS workflows.
How This Skill Works
It wraps Shapely geometry objects and exposes commands like create, op, pred, measure, transform, and validate to manipulate them. Users supply inputs as WKT-like strings, and the toolkit applies standard Shapely methods (e.g., intersection, union, contains, buffer, convex_hull) to produce geometries or numeric results.
When to Use It
- Creating geometric shapes (points, lines, polygons)
- Performing boolean operations (intersection, union, difference)
- Evaluating spatial predicates (contains, intersects, within)
- Computing measurements (area, length, distance, centroid)
- Transforming geometries (translate, rotate, scale) and validating/fixing invalid geometries
Quick Start
- Step 1: Create a polygon with the CLI: uv run python scripts/shapely_compute.py create polygon --coords "0,0 1,0 1,1 0,1"
- Step 2: Compute the intersection of two polygons: uv run python scripts/shapely_compute.py op intersection --g1 "POLYGON((0 0,2 0,2 2,0 2,0 0))" --g2 "POLYGON((1 1,3 1,3 3,1 3,1 1))"
- Step 3: Measure area of the resulting geometry: uv run python scripts/shapely_compute.py measure area --geom "POLYGON((0 0,2 0,2 2,0 2,0 0))"
Best Practices
- Validate input geometries before performing operations to avoid errors
- Use consistent coordinate systems and precision to ensure reliable results
- Test edge cases with holes, multipoints, and multi-geometries
- Store intermediate geometries in variables to reuse in subsequent steps
- Prefer immutable operations and clearly name outputs for traceability
Example Use Cases
- Calculate the overlapping area between two land parcels to assess shared interest
- Buffer a point to create a safety or impact zone around a location
- Compute the convex hull of a set of survey points to bound a study area
- Validate polygons before importing into a GIS to prevent topology errors
- Measure area, length, and centroid for reporting on spatial datasets