detect-objects
Run pre-trained AI models on geospatial imagery. Detect buildings, cars, ships, solar panels, agriculture fields, or use…
Process raster data: clip by bounding box, stack multiple bands, mosaic GeoTIFFs, or convert between raster and vector formats.
Claude Code
$ npx -y skills add opengeos/geoai-skills --skill process-raster --agent claude-code
Codex
$ npx skills add opengeos/geoai-skills --skill process-raster -a codex -y
Cursor
$ npx skills add opengeos/geoai-skills --skill process-raster -a cursor -y
Gemini CLI
$ npx skills add opengeos/geoai-skills --skill process-raster -a gemini-cli -y
GitHub Copilot
$ npx skills add opengeos/geoai-skills --skill process-raster -a github-copilot -y
OpenCode
$ npx skills add opengeos/geoai-skills --skill process-raster -a opencode -y
Windsurf
$ npx skills add opengeos/geoai-skills --skill process-raster -a windsurf -y
name: process-raster description: > Process raster data: clip by bounding box, stack multiple bands, mosaic GeoTIFFs, or convert between raster and vector formats. argument-hint: <operation> <input> [options] allowed-tools: Bash
You are helping the user process geospatial raster data using geoai.
Input: `$@`
Follow these steps in order.
Parse `$@` to identify the requested operation:
| Operation | Triggers | Required inputs | |---|---|---| | `clip` | "clip", "crop", "subset", `--bbox` present | input raster + bbox | | `stack` | "stack", "combine bands" | list of input rasters | | `mosaic` | "mosaic", "merge" | input directory or list of rasters | | `raster-to-vector` | "to vector", "vectorize", "polygonize" | input raster | | `vector-to-raster` | "to raster", "rasterize", "burn" | input vector + pixel size |
If the operation is unclear from the input, ask the user to specify.
For single-file operations (`clip`, `raster-to-vector`, `vector-to-raster`):
find "$PWD" -name "INPUT_FILENAME" -not -path '*/.git/*' 2>/dev/null
For multi-file operations (`stack`, `mosaic`), if a directory is given:
find "INPUT_DIR" -name "*.tif" -o -name "*.tiff" 2>/dev/null | sort
If the user recently inspected or downloaded a file and did not specify an input, check the state file for context:
STATE_DIR="" test -f .geoai-skills/state.json && STATE_DIR=".geoai-skills" PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || echo "$PWD")" PROJECT_ID="$(echo "$PROJECT_ROOT" | tr '/' '-')" test -f "$HOME/.geoai-skills/$PROJECT_ID/state.json" && STATE_DIR="$HOME/.geoai-skills/$PROJECT_ID"
If state exists, read the last inspected or downloaded file:
python3 -c "
import json
with open('STATE_DIR/state.json') as f:
state = json.load(f)
if 'last_inspected' in state:
print(f'Last inspected: {state[\"last_inspected\"][\"path\"]}')
if 'downloaded_files' in state:
for f in state['downloaded_files']:
print(f'Downloaded: {f}')
"python3 -c "
import geoai
result = geoai.clip_raster_by_bbox(
input_raster='INPUT_PATH',
output_raster='OUTPUT_PATH',
bbox=[MINX, MINY, MAXX, MAXY],
)
print(f'Clipped raster saved to: {result}')
info = geoai.get_raster_info(result)
for k, v in info.items():
print(f'{k}: {v}')
"Default output: `./clipped_<original_name>.tif`
python3 -c "
import geoai
result = geoai.stack_bands(
input_files=['FILE1', 'FILE2', 'FILE3'],
output_file='OUTPUT_PATH',
)
print(f'Stacked raster saved to: {result}')
info = geoai.get_raster_info(result)
for k, v in info.items():
print(f'{k}: {v}')
"python3 -c "
import geoai
result = geoai.mosaic_geotiffs(
input_dir='INPUT_DIR',
output_file='OUTPUT_PATH',
)
print(f'Mosaic saved to: {result}')
info = geoai.get_raster_info(result)
for k, v in info.items():
print(f'{k}: {v}')
"python3 -c "
import geoai
gdf = geoai.raster_to_vector(
raster_path='INPUT_PATH',
output_path='OUTPUT_PATH',
)
print(f'Vectorized: {len(gdf)} features')
print(f'Saved to: OUTPUT_PATH')
print(f'Columns: {list(gdf.columns)}')
"Default output: `./<original_name>.gpkg`
python3 -c "
import geoai
result = geoai.vector_to_raster(
vector_path='INPUT_PATH',
output_path='OUTPUT_PATH',
pixel_size=PIXEL_SIZE,
)
print(f'Rasterized: {result}')
info = geoai.get_raster_info(result)
for k, v in info.items():
print(f'{k}: {v}')
"Default pixel size: 1.0 (or infer from context). Default output: `./<original_name>.tif`
Replace all placeholder values with actual paths and parameters before running.
If a state directory exists, update it with the output file path using the same state resolution pattern as Step 2.
Report:
Then suggest: *"Use `/geoai-skills:inspect-geo` to examine the result in detail."*
A Claude Code plugin that adds GeoAI-powered skills for geospatial data exploration, satellite imagery download, AI-based object detection, and session memory. Built on the GeoAI Python library.
Run pre-trained AI models on geospatial imagery. Detect buildings, cars, ships, solar panels, agriculture fields, or use…
Download NAIP aerial imagery for a bounding box. Specify coordinates as minx,miny,maxx,maxy in WGS84 and optionally a year.
Inspect any raster or vector geospatial file. Returns CRS, bounds, bands, resolution, dtype, attribute summaries, and band…
Verify that the geoai Python package is installed and functional. If not, provide installation instructions. Optionally check…
Download Overture Maps data (buildings, places, roads, land use, water, etc.) for a bounding box. Returns a GeoDataFrame saved as…
Search past Claude Code session logs to recover context from previous conversations. Finds past decisions, data paths, CRS info,…
Use this skill to extract structured Markdown/JSON from PDFs and document images—tables with cell-level precision, formulas as…
Estimates intracellular metabolic fluxes from steady-state carbon-13 isotope-tracing measurements using validated atom maps,…