Skip to content
Back to skills

Spatial Join Sanity

ASecurity

Use when performing a spatial join or location-based filter between two layers — joining attributes by location, or selecting features that intersect, contain, or fall within another layer. Makes the agent pick the correct spatial predicate, confirm CRS and geometry preconditions, and handle one-to-many matches deliberately instead of silently inflating or dropping records.

  • 2 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 7, 2026
ai-agentsgo

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned September 7, 2026

npx -y skills add buildmoonshot/skillpacks --skill spatial-join-sanity --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Spatial Join Sanity?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Spatial Join Sanity
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/buildmoonshot-spatial-join-sanity/badge)](https://www.skillsdirectory.com/skills/buildmoonshot-spatial-join-sanity)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: spatial-join-sanity
description: Use when performing a spatial join or location-based filter between two layers — joining attributes by location, or selecting features that intersect, contain, or fall within another layer. Makes the agent pick the correct spatial predicate, confirm CRS and geometry preconditions, and handle one-to-many matches deliberately instead of silently inflating or dropping records.
---

# Spatial Join Sanity

A spatial join is where CRS bugs, geometry bugs, and cardinality bugs all converge. Do it deliberately.

## Before the join

1. **Confirm both layers share a CRS** (see `crs-discipline`) and have **valid geometry** (see `validate-geometry`). A spatial join across mismatched CRSs returns wrong matches with no error.

2. **Pick the predicate that matches the question.** Don't default to "intersects" for everything:
   - points-in-polygons → `within` / `contains`
   - any overlap → `intersects`
   - shared boundary / adjacency → `touches`
   - "near, within N meters" → a distance predicate (`ST_DWithin`, `near`) — **not** intersects, and not a post-hoc distance filter.

## Handle cardinality on purpose

A spatial join is **one-to-many.** A point on a shared border matches *both* polygons; overlapping polygons multiply rows. Decide explicitly:
- keep all matches, or
- keep the largest-overlap / nearest / first match.

Don't let the join silently change your record count.

## Sanity-check the result

Compare input vs output row counts and state it. If a 10,000-point layer becomes 14,000 rows after a join to polygons, that's a boundary/overlap multiplication that needs an explanation — not something to hand over unnoticed. A point count that *drops* means unmatched features fell out of an inner join; decide whether that's intended.

## Why this matters

Spatial joins produce a table that looks normal whether or not it's correct. The errors — wrong predicate, CRS mismatch, silent row multiplication — don't surface as crashes; they surface as a deliverable with the wrong counts. A predicate chosen on purpose and a row-count check catch them before they ship.

Files in this skill

  • README.md1.4 KB
  • SKILL.md2.1 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…