detect-objects
Run pre-trained AI models on geospatial imagery. Detect buildings, cars, ships, solar panels, agriculture fields, or use text-prompted segmentation with…
Process raster data: clip by bounding box, stack multiple bands, mosaic GeoTIFFs, or convert between raster and vector formats.
$ npx -y skills add opengeos/geoai-skills --skill process-raster --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/process-rasterContext preview
The summary Claude sees to decide when to auto-load this skill.
Process raster data: clip by bounding box, stack multiple bands, mosaic GeoTIFFs, or convert between raster and vector formats.
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 text-prompted segmentation with…
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 statistics. Supports GeoTIFF,…
Verify that the geoai Python package is installed and functional. If not, provide installation instructions. Optionally check extra dependencies for deep…
Download Overture Maps data (buildings, places, roads, land use, water, etc.) for a bounding box. Returns a GeoDataFrame saved as GeoJSON or GeoPackage.
Search past Claude Code session logs to recover context from previous conversations. Finds past decisions, data paths, CRS info, model configurations, and…