.agents/skills/geospatial-dev/SKILL.md
MapLibre GL JS + PostGIS integration patterns for real estate data visualization. Use when working on map layers, spatial queries, GeoJSON data pipelines, or 3D extrusion effects.
npx skillsauth add sdn0303/terrasight geospatial-devInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
MapLibre GL JS + PostGIS patterns for real estate investment data visualization.
| Layer | Type | Data | Purpose |
|-------|------|------|---------|
| Transaction Heatmap | heatmap | Point | Price density visualization |
| Transaction Circles | circle | Point | Individual transactions with price coloring |
| Zoning Polygons | fill | Polygon | Land use zone overlay |
| Disaster Risk | fill-extrusion | Polygon | 3D risk level visualization |
| Facility Markers | symbol | Point | Schools, hospitals, stations |
| Transit Lines | line | LineString | Railway/subway routes |
import Map, { Source, Layer, type MapLayerMouseEvent } from 'react-map-gl/maplibre';
function PropertyMap() {
const handleClick = (e: MapLayerMouseEvent) => {
const feature = e.features?.[0];
if (feature) {
selectProperty(feature.properties as Property);
}
};
return (
<Map
mapStyle="https://basemaps.cartocdn.com/gl/dark-matter-gl-style/style.json"
interactiveLayerIds={['transaction-circles']}
onClick={handleClick}
>
<Source id="transactions" type="geojson" data={transactionGeoJSON}>
<Layer
id="transaction-circles"
type="circle"
paint={{
'circle-radius': ['interpolate', ['linear'], ['zoom'], 10, 3, 15, 8],
'circle-color': [
'interpolate', ['linear'], ['get', 'pricePerSqm'],
100000, '#2196F3',
500000, '#FF9800',
1000000, '#F44336',
],
'circle-opacity': 0.8,
}}
/>
</Source>
</Map>
);
}
<Layer
id="disaster-risk-3d"
type="fill-extrusion"
paint={{
'fill-extrusion-color': [
'interpolate', ['linear'], ['get', 'riskScore'],
0, '#4CAF50',
50, '#FF9800',
100, '#F44336',
],
'fill-extrusion-height': ['*', ['get', 'riskScore'], 100],
'fill-extrusion-opacity': 0.7,
}}
/>
SELECT ST_AsGeoJSON(location)::jsonb AS geometry, price_per_sqm, area_sqm
FROM transactions
WHERE ST_Within(location, ST_MakeEnvelope($1, $2, $3, $4, 4326))
LIMIT 1000;
SELECT *, ST_Distance(
location::geography,
ST_SetSRID(ST_MakePoint($1, $2), 4326)::geography
) AS distance_m
FROM facilities
WHERE ST_DWithin(
location::geography,
ST_SetSRID(ST_MakePoint($1, $2), 4326)::geography,
$3 -- radius in meters
)
ORDER BY distance_m;
SELECT jsonb_build_object(
'type', 'FeatureCollection',
'features', COALESCE(jsonb_agg(
jsonb_build_object(
'type', 'Feature',
'geometry', ST_AsGeoJSON(location)::jsonb,
'properties', jsonb_build_object(
'id', id,
'pricePerSqm', price_per_sqm,
'areaType', area_type
)
)
), '[]'::jsonb)
) AS geojson;
geometry(Point, 4326) for WGS84 coordinate systemproperties must be a JSON object (not null for MapLibre)cluster: true on GeoJSON source)fill-extrusion sparingly — high GPU costdevelopment
Rust coding rules for Axum/Tokio/SQLx backends in services/backend. 179 rules split into 14 category files covering ownership, error handling, async, API design, and more. Use when writing, reviewing, or refactoring Rust code, designing error types, async flows, or public APIs.
content-media
PostgreSQL and PostGIS patterns for schema design, spatial queries, query optimization, indexing, and zero-downtime migrations. Use when writing SQL, creating tables, optimizing queries, or writing migration files.
development
Mapbox GL JS v3 development patterns for real estate data visualization. Use when working with Mapbox maps, Standard Style configuration, layer slots, 3D lighting, expressions, react-map-gl/mapbox integration, or migrating from MapLibre GL JS.
development
MapLibre GL JS + PostGIS integration patterns for real estate data visualization. Use when working on map layers, spatial queries, GeoJSON data pipelines, or 3D extrusion effects.