Skip to content

Capabilities disponibles

Les capabilities sont les opérations unitaires que GISPulse peut appliquer sur des datasets spatiaux. Elles s'utilisent dans les règles JSON via le champ capability.

bash
# Lister toutes les capabilities
gispulse capabilities

Chaque règle appelle une capability et lui passe un bloc config. Les paramètres ci-dessous correspondent aux clés de ce bloc.

json
{
  "capability": "<name>",
  "ref_layer": "<optionnel>",
  "config": { "...": "..." }
}

Catalogue vivant

Le code fait foi. Pour le schéma exact d'une capability (paramètres, types, valeurs par défaut) :

python
from capabilities.registry import REGISTRY
REGISTRY.get("buffer")().get_schema()

Nombre total de capabilities enregistrées : 117 — réparties en 18 catégories.


Vecteur — sélection & jointure (Community)

Disponibles dans tous les tiers. Les caps marquées DuckDB / PostGIS bénéficient du pattern Strategy multi-backend (dispatch automatique selon la taille).

buffer

Buffer métrique autour des géométries. Reprojette automatiquement dans un CRS métrique si nécessaire.

Moteurs : Python (GeoPandas), DuckDB (ST_Buffer, > 50 000 features), PostGIS (server-side).

json
{
  "capability": "buffer",
  "config": { "distance": 100, "crs_meters": "EPSG:3857" }
}
ParamètreTypeDéfautDescription
distancefloat0.0Distance en mètres
crs_metersstringEPSG:3857CRS de projection métrique intermédiaire
cap_stylestringroundround, flat, square
join_stylestringroundround, mitre, bevel

filter

Filtre les features selon une expression attributaire et/ou un prédicat spatial. Supporte les références cross-layer.

Moteurs : Python (gdf.query + Shapely), DuckDB (SQL), PostGIS.

json
{
  "capability": "filter",
  "config": {
    "expression": "surface > 500 and usage == 'résidentiel'",
    "spatial_predicate": "intersects",
    "ref_layer": "zones_inondables",
    "buffer_distance": 50
  }
}
ParamètreTypeDescription
expressionstringExpression Python évaluée sur les colonnes
spatial_predicatestringintersects, within, contains, crosses, overlaps, touches, dwithin
ref_layerstringLayer de référence pour le prédicat spatial
ref_wkt / ref_geojsonstring / objectGéométrie WKT ou GeoJSON explicite
buffer_distancefloatBuffer en mètres appliqué à la géométrie de référence

intersects

Garde les features qui intersectent une géométrie ou layer de référence (raccourci de filter spatial).

json
{ "capability": "intersects", "config": { "ref_layer": "zones_inondables" } }

clip

Découpe les features selon l'emprise d'une layer de référence.

json
{ "capability": "clip", "config": { "ref_layer": "zone_etude" } }

spatial_join

Jointure spatiale entre la layer traitée et une layer de référence. Ajoute les attributs de la layer de référence sur les features correspondantes.

json
{
  "capability": "spatial_join",
  "config": { "ref_layer": "communes", "how": "left", "op": "intersects" }
}
ParamètreTypeDéfautDescription
ref_layerstringrequisLayer de référence
howstringleftleft, inner, right
opstringintersectsintersects, contains, within

nearest_neighbor

Joint les attributs des k features les plus proches d'une layer de référence, avec filtre optionnel max_distance.

json
{
  "capability": "nearest_neighbor",
  "config": { "ref_layer": "ecoles", "k": 1, "max_distance": 2000, "distance_col": "dist_ecole_m" }
}
ParamètreTypeDéfautDescription
ref_layerstringrequisLayer de référence
kint1Nombre de voisins
max_distancefloataucunDistance maximale en mètres
distance_colstringdistanceNom de la colonne de distance ajoutée

spatial_aggregate

Agrège des valeurs d'une layer de référence par prédicat spatial (count, sum, mean, min, max par feature).

json
{
  "capability": "spatial_aggregate",
  "config": {
    "ref_layer": "habitations",
    "aggregations": { "population": "sum" },
    "predicate": "contains"
  }
}

reproject

Reprojection vers un CRS cible.

json
{ "capability": "reproject", "config": { "target_crs": "EPSG:2154" } }

Vecteur — overlay & combinaison (Community)

Combine plusieurs layers en une, soit géométriquement (overlay façon FME / QGIS) soit par concaténation.

CapabilityDescriptionParamètres clés
overlay_intersectionIntersection géométrique de deux layers — attributs hérités des deux côtés.ref_layer, keep_geom_type, suffix_left, suffix_right
overlay_unionUnion géométrique — garde les parts A-only, B-only, A∩B.ref_layer, keep_geom_type, suffix_left, suffix_right
eraseDifférence géométrique — supprime de A ce qui est couvert par B (attributs A préservés).ref_layer, keep_geom_type
merge_layersConcatène la layer primaire avec une liste de ref_layers.ref_layers (array)
classify_by_ringClasse chaque feature par le plus petit anneau qui la contient (isochrones, buffers concentriques) — ajoute value / class / color.ref_layers, ring_field, outside_value, palette
json
{
  "capability": "overlay_intersection",
  "config": { "ref_layer": "zonage_plu", "suffix_right": "_plu" }
}
json
{
  "capability": "classify_by_ring",
  "config": {
    "ref_layers": ["iso_500", "iso_1000", "iso_1500"],
    "ring_field": "cost_budget",
    "palette": "YlGnBu"
  }
}

Vecteur — géométrie dérivée (Community)

CapabilityDescriptionParamètres clés
centroidRemplace chaque géométrie par son centroïde.
envelopeBounding box axis-aligned.
oriented_bboxRectangle minimum orienté (bâtiments, parcelles).
min_bounding_circlePlus petit cercle englobant (Shapely ≥ 2.1).
convex_hullEnveloppe convexe. Supporte by_group / dissolve.by_group, dissolve
concave_hullEnveloppe concave k-nearest.k, ratio
alpha_shapeAlpha-shape (concave hull généralisé).alpha
delaunay_triangulationTriangulation de Delaunay des vertex.
voronoi_polygonsDiagramme de Voronoï des points.bounds
polygonizeConstruit des polygones depuis un réseau de lignes noded.snap_tolerance
json
{ "capability": "convex_hull", "config": { "by_group": "commune" } }

Vecteur — édition & métrologie (Community)

CapabilityDescriptionParamètres clés
area_lengthAjoute des colonnes area_m2 / length_m.area_column, length_column
calculateÉvalue une expression pour créer une nouvelle colonne (sum, avg, min, max, median, std, etc.).expression, output_field
dissolveDissout les features par attribut (GROUP BY + ST_Union).by
unionFusionne toutes les features en une seule géométrie.
symmetric_differenceXOR entre chaque feature et l'union d'une layer de référence.ref_layer
vector_diffCompare deux layers par id et étiquette added / removed / modified / unchanged.ref_layer, id_col, geometry_tolerance
make_validRépare les géométries invalides (auto-intersections, anneaux dupliqués).
simplifySimplification (Douglas-Peucker, Visvalingam-Whyatt, topology-preserving).tolerance, algorithm
chaikin_smoothLissage par coin-cutting itératif.iterations
densify_verticesInsère des vertex à intervalle régulier.max_distance, n_segments
snap_to_gridAligne les coordonnées sur une grille.grid_size
offset_curveLigne parallèle à distance signée.distance
line_mergeFusionne les segments adjacents.
line_substringSous-section d'une ligne entre deux mesures.start_measure, end_measure
line_locate_pointProjette des points sur la ligne la plus proche et calcule la mesure.ref_layer
extract_verticesExtrait un Point par vertex avec index.
extract_segmentsDécoupe chaque ligne/bord en segments 2 points.
json
{ "capability": "simplify", "config": { "tolerance": 5.0, "algorithm": "vw" } }
json
{
  "capability": "calculate",
  "config": { "output_field": "prix_m2", "expression": "prix / surface_m2" }
}

Vecteur — manipulation d'attributs (Community)

Opérations non spatiales sur le schéma d'attributs : ajout, suppression, renommage, jointure, table de lookup, fallback null.

CapabilityDescriptionParamètres clés
add_fieldAjoute une ou plusieurs colonnes avec valeur par défaut.fields, overwrite
drop_fieldSupprime des colonnes (la géométrie est protégée).fields, ignore_missing
select_columnsConserve uniquement la liste de colonnes (géométrie toujours conservée).fields
rename_fieldRenomme via mapping {old: new}.mapping, ignore_missing
cast_fieldCast de colonnes vers un dtype cible.casts, errors
attribute_joinJointure non-spatiale sur clé (left / right / inner / outer).ref_layer, left_on, right_on, how, columns, prefix, suffix
lookup_tableMappe une colonne via dict avec valeur par défaut.source_col, target_col, mapping, default
coalesce_fieldsPremière valeur non-null parmi une liste de colonnes.sources, target_col
case_whenCalcul conditionnel SQL CASE WHEN.target_col, cases, else_
describeRapport d'introspection (dtype, nulls, unique, geom_type, bounds) — stocké dans gdf.attrs["__schema_describe__"], layer renvoyé inchangé.sample_size, include_geometry
json
{
  "capability": "case_when",
  "config": {
    "target_col": "tier",
    "cases": [
      { "when": "population > 100000", "value": "A" },
      { "when": "population > 10000", "value": "B" }
    ],
    "else_": "C"
  }
}
json
{
  "capability": "attribute_join",
  "config": { "ref_layer": "communes_insee", "left_on": "code_insee", "how": "left" }
}

Vecteur — pivot / unpivot (Community)

Reshape long ↔ wide façon pandas, géométrie préservée.

CapabilityDescriptionParamètres clés
pivotLong → wide : columns éclate en colonnes, values peuple les cellules.index, columns, values, aggfunc, fill_value, geom_strategy
unpivotWide → long : produit (variable, value) à partir de value_vars.id_vars, value_vars, var_name, value_name
json
{
  "capability": "pivot",
  "config": {
    "index": "commune_id",
    "columns": "annee",
    "values": "population",
    "aggfunc": "sum",
    "geom_strategy": "first"
  }
}

geom_strategy (first, union, centroid) résout le conflit quand plusieurs lignes du même groupe ont des géométries différentes.


Vecteur — sélection ordonnée & échantillonnage (Community)

Tri, dédup, échantillon aléatoire, top-N — opérations purement attributaires.

CapabilityDescriptionParamètres clés
sortTrie par une ou plusieurs colonnes.by, ascending, na_position
deduplicateSupprime les doublons sur clé(s) attributaires (différent de duplicate_geometry qui dédup sur géométrie).keys, keep, order_by, ascending
random_sampleÉchantillon aléatoire (n ou fraction, seed reproductible).n, fraction, seed, replace
top_nConserve les N premières features ordonnées par une colonne.n, by, ascending
json
{ "capability": "top_n", "config": { "n": 100, "by": "rdm_m2", "ascending": false } }

Vecteur — multipart & dimensions Z/M (Community)

Conversion multipart ↔ singlepart et gestion des dimensions Z (élévation) / M (mesure).

CapabilityDescriptionParamètres clés
multipart_to_singlepartsÉclate les Multi* — une ligne par part, attributs dupliqués.reset_index, drop_empty
singleparts_to_multipartRegroupe en Multi*, optionnellement par attribut.by, agg
add_zAjoute Z (constante ou colonne from_column).z, from_column
drop_zStrip de la dimension Z → 2D.
add_mAjoute M (constante ou colonne).m, from_column
drop_mStrip de la dimension M.
json
{ "capability": "add_z", "config": { "from_column": "altitude_minimale_sol" } }

Vecteur — transformations géométriques (Community)

Transformations affines, inversion d'axes, reverse de lignes — opérations rapides ne touchant pas le CRS.

CapabilityDescriptionParamètres clés
affine_transformTranslate / rotate / scale / skew (ordre déclaré, origine paramétrable).translate, rotate, scale, skew, origin
swap_xyInverse X et Y de chaque vertex (utile pour fichiers lat/lon mal exportés).
reverse_linesInverse l'ordre des vertex pour LineString / MultiLineString.ignore_non_lines
json
{
  "capability": "affine_transform",
  "config": { "rotate": 30, "origin": "centroid" }
}

Vecteur — frontière & projection (Community)

Extraction de frontière, gestion de trous, coercition de type, déclaration de CRS sans transformation.

CapabilityDescriptionParamètres clés
boundaryFrontière topologique de chaque géométrie.drop_empty
extract_holesExtrait les anneaux intérieurs (trous) comme polygones.parent_id_col, hole_index_col
force_geometry_typeCoerce vers un type cible (Multi → single via explode, etc.).target, on_multi, on_invalid
assign_projectionDéfinit le CRS de la layer sans reprojection (utiliser reproject pour transformer).crs, allow_override
json
{ "capability": "force_geometry_type", "config": { "target": "Polygon", "on_multi": "explode" } }

assign_projectionreproject

assign_projection change l'étiquette CRS sans toucher aux coordonnées. À utiliser uniquement pour réparer une layer dont le CRS est faux ou absent.


Temporel (Community)

Filtres et jointures sur colonnes datetime.

CapabilityDescriptionParamètres clés
temporal_filterFiltre par fenêtre [start, end] sur colonne datetime. Inversion possible.time_col, start, end, include_start, include_end, invert
temporal_joinJointure exacte ou as-of (backward / forward / nearest) avec tolérance.ref_layer, left_on, right_on, strategy, by, tolerance, columns
json
{
  "capability": "temporal_join",
  "config": {
    "ref_layer": "meteo_horaire",
    "left_on": "ts_observation",
    "strategy": "nearest",
    "tolerance": "30min",
    "by": "station_id"
  }
}

Validation (Community)

Contrôle qualité des données spatiales. Les caps de validation retournent une layer de violations (une ligne par problème détecté).

CapabilityDescription
topology_checkGéométries invalides, auto-intersections, polygones qui se chevauchent.
duplicate_geometryGéométries dupliquées exactes ou à tolérance.
attribute_validationTypes, nullabilité, plages, regex, unicité.
completeness_checkRatio de valeurs nulles par colonne, couverture spatiale relative.
json
{
  "capability": "topology_check",
  "config": { "check_overlaps": true, "check_self_intersections": true }
}
json
{
  "capability": "attribute_validation",
  "config": {
    "schema": [
      { "field": "population", "type": "integer", "min": 0 },
      { "field": "code_insee", "unique": true, "pattern": "^[0-9]{5}$" }
    ]
  }
}

Classification & styling (Community)

Prépare les données pour la cartographie thématique : bucketing, rampe de couleurs, styles.

CapabilityDescriptionParamètres clés
classifyBucket numérique en N classes (quantile / equal_interval / manual / jenks / pretty / std_dev).column, method, k, palette
classify_categoricalClassification par valeurs uniques, avec bucket other optionnel.column, palette, other_threshold
head_tail_breaksClassification Head/Tail (Jiang 2013) — nb de classes auto.column
normalizeNormalisation (minmax / zscore / log / log1p / rank / percent).column, method, denom
continuous_rampRampe de couleur continue sans classification.column, palette
graduated_sizeTaille de symbole proportionnelle à une colonne numérique.column, min_size, max_size
choroplethClassification + LayerStyleDef + légende (export QML/SLD).column, method, k, palette
bivariate_choroplethChoroplèthe bivariée (deux colonnes × grille de palette).column_x, column_y, n, palette
json
{
  "capability": "choropleth",
  "config": {
    "column": "densite_pop",
    "method": "jenks",
    "k": 5,
    "palette": "YlOrRd"
  }
}

Statistiques spatiales (Community)

Détection de clusters, d'autocorrélation et de points chauds / froids.

CapabilityDescriptionParamètres clés
spatial_weightsCalcule les poids spatiaux (queen / rook / k-NN / distance band) et ajoute n_neighbours.method, k, threshold
morans_iMoran's I global avec p-value par permutations. Retourne une ligne résumé.column, weights, n_permutations
getis_ord_gGetis-Ord Gi* z-score par feature (hot / cold spots).column, weights
json
{
  "capability": "morans_i",
  "config": { "column": "rdm_m2", "weights": { "method": "queen" }, "n_permutations": 999 }
}

Densité & tessellation (Community)

Construction de grilles et estimation de densité.

CapabilityDescriptionParamètres clés
grid_createGrille régulière carrée sur un ref_layer ou bounds.cell_size, bounds, ref_layer
hexgrid_createGrille hexagonale flat-top.cell_size, bounds, ref_layer
kde_heatmapKDE sur grille régulière → points avec density.bandwidth, cell_size, bounds
json
{
  "capability": "hexgrid_create",
  "config": { "cell_size": 500, "ref_layer": "zone_etude" }
}

Clustering (Community — scikit-learn optionnel)

Installable via pip install "gispulse[cluster]". Chaque cap ajoute une colonne cluster (-1 = noise pour DBSCAN / HDBSCAN).

CapabilityDescriptionParamètres clés
cluster_kmeansK-Means sur les centroïdes.k, random_state
cluster_dbscanDBSCAN density-based.eps, min_samples
cluster_hdbscanHDBSCAN hiérarchique, densités variables.min_cluster_size, min_samples
json
{ "capability": "cluster_dbscan", "config": { "eps": 200, "min_samples": 5 } }

Topologie — lignes (Community)

Nettoie un réseau linéaire avant analyse réseau.

CapabilityDescriptionParamètres clés
network_snap_endpointsSnap des endpoints proches.tolerance
network_extend_danglesÉtend les endpoints dangling jusqu'à la ligne la plus proche.tolerance
network_node_linesSplit de chaque ligne à chaque intersection → graphe planaire.
network_remove_duplicatesSupprime les doublons géométriques (direction ignorée).tolerance
network_remove_pseudo_nodesFusionne les segments aux nœuds de degré 2.
json
{ "capability": "network_snap_endpoints", "config": { "tolerance": 0.5 } }

Topologie — polygones (Community)

Répare une couverture polygonale (gaps, overlaps, slivers).

CapabilityDescriptionParamètres clés
polygon_fix_gapsDétecte les trous sous max_area et les rattache au voisin partageant la plus grande frontière.max_area
polygon_fix_overlapsSupprime les chevauchements selon une règle (smallest, largest, first).rule
polygon_remove_sliversSupprime les polygones longs/fins (min_area ou max_shape_index).min_area, max_shape_index
polygon_snap_bordersSnap des vertex sur grille → frontières adjacentes alignées.grid_size
json
{ "capability": "polygon_fix_gaps", "config": { "max_area": 10.0 } }

3D Pointcloud (Community — pip install "gispulse[pointcloud]")

Chargement et exploitation de nuages de points LAS / LAZ (ASPRS). Nécessite laspy (et lazrs pour LAZ).

CapabilityDescriptionParamètres clés
pointcloud_load_lasCharge un fichier .las / .laz en GeoDataFrame de Point Z.path, crs, max_points, classifications
pointcloud_filter_classificationFiltre par codes de classification ASPRS (keep / drop).keep, drop, col
pointcloud_zonal_heightStatistiques Z par polygone (hauteur de bâti, canopée).ref_layer, stats, prefix, ground_col
pointcloud_grid_summaryBin Z dans une grille régulière → polygones avec stats par cellule.cell_size, stats, drop_empty
json
{
  "capability": "pointcloud_load_las",
  "config": {
    "path": "data/lidar/dalle_1234.laz",
    "crs": "EPSG:2154",
    "classifications": [2, 6]
  }
}
json
{
  "capability": "pointcloud_zonal_height",
  "config": {
    "ref_layer": "lidar_points",
    "stats": ["max", "mean", "p95"],
    "ground_col": "altitude_minimale_sol",
    "prefix": "h_"
  }
}

Codes ASPRS courants

2 = sol nu, 5 = haute végétation, 6 = bâtiment, 9 = eau. Voir la spec LAS 1.4.


Raster (Pro — pip install "gispulse[raster]")

Nécessite rasterio + rasterstats et une licence Pro (GISPULSE_TIER=pro).

Disponible en Pro

Les capabilities raster appellent check_tier("pro") à l'exécution.

CapabilityDescriptionParamètres clés
zonal_statsStatistiques raster (min/max/mean/std/sum/count) par polygone.raster_path, stats
raster_clipDécoupe un raster par l'emprise d'un vecteur.raster_path, output_path
ndviNDVI = (NIR − RED) / (NIR + RED) depuis un raster multi-bandes.raster_path, nir_band, red_band
raster_reprojectReprojection raster.raster_path, target_crs, output_path
raster_mergeFusionne plusieurs rasters.raster_paths, output_path
change_detectionDétecte les zones changées entre deux rasters → polygones.raster_before, raster_after, threshold
json
{
  "capability": "zonal_stats",
  "config": {
    "raster_path": "data/ndvi.tif",
    "stats": ["min", "max", "mean", "std", "sum", "count"]
  }
}

Réseau — analyse (Pro — pip install "gispulse[network]")

Nécessite networkx et une licence Pro.

CapabilityDescriptionParamètres clés
shortest_pathPlus court chemin (Dijkstra) entre deux points.origin, destination, weight_col
isochroneZone atteignable dans un budget (distance / temps).origin, max_distance, weight_col
od_matrixMatrice origines × destinations en format long.origins_layer, destinations_layer, weight_col
mstArbre couvrant minimum d'un réseau linéaire.weight_col
network_allocationAlloue points de demande ↔ offre les plus proches sur le réseau.supply_layer, weight_col, max_cost
connectivity_checkVérifie que le réseau forme un graphe connecté et retourne les composantes.
json
{
  "capability": "isochrone",
  "config": { "origin": [2.3522, 48.8566], "max_distance": 1000, "weight_col": "length_m" }
}

PostGIS SQL (Pro)

postgis_sql

Exécute une requête SQL paramétrée directement sur PostGIS pour les opérations avancées non disponibles ailleurs.

json
{
  "capability": "postgis_sql",
  "config": {
    "sql": "SELECT *, ST_Area(geom::geography) AS area_geo FROM {input_table} WHERE ST_IsValid(geom)",
    "geom_col": "geom",
    "params": {}
  }
}
ParamètreTypeDescription
sqlstringRequête avec {input_table} comme placeholder
paramsobjectParamètres nommés ($name) pour la requête
geom_colstringColonne géométrie (défaut : geom)
input_tablestringTable d'entrée (auto-créée si absente)

Sécurité

Le DSN n'est jamais lu depuis config — il est résolu depuis GISPULSE_POSTGIS_DSN. Les identifiants SQL sont validés (operation_executor.py). N'exposez pas cette capability à des utilisateurs non authentifiés.


Résumé par tier

CatégorieCapsTierDépendance optionnelle
Vecteur — sélection & jointure8Community
Vecteur — overlay & combinaison5Community
Vecteur — géométrie dérivée10Community
Vecteur — édition & métrologie17Community
Vecteur — manipulation d'attributs9Community
Vecteur — pivot / unpivot2Community
Vecteur — sélection ordonnée & échantillonnage4Community
Vecteur — multipart & dimensions Z/M6Community
Vecteur — transformations géométriques3Community
Vecteur — frontière & projection4Community
Temporel2Community
Validation4Community
Classification & styling8Communitymapclassify (pour jenks)
Statistiques spatiales3Community
Densité & tessellation3Community
Clustering3Communitygispulse[cluster] (scikit-learn, hdbscan)
Topologie — lignes5Community
Topologie — polygones4Community
3D Pointcloud4Communitygispulse[pointcloud] (laspy, lazrs)
Raster6Progispulse[raster] (rasterio, rasterstats)
Réseau — analyse6Progispulse[network] (networkx)
PostGIS SQL1Progispulse[postgis] + DSN
Total117

Créer une capability personnalisée

Voir Développer un plugin pour la publication via entry-points.

python
from capabilities.base import Capability
from capabilities.registry import register

@register
class MaCapabilite(Capability):
    name = "ma_cap"
    description = "Description courte de ma capability."

    def execute(self, gdf, mon_parametre=1.0, **_):
        # logique métier ici
        return gdf

    def get_schema(self):
        return {
            "type": "object",
            "properties": {
                "mon_parametre": {"type": "number", "default": 1.0}
            },
            "required": ["mon_parametre"],
        }

Une capability distribuée en package peut s'auto-enregistrer via le groupe d'entry-points gispulse.capabilities (voir pyproject.toml dans sdk/).

Published under AGPL-3.0 license.