Approximation d'une enveloppe concave par coordonnées
Une enveloppe convexe est pratique, mais elle entoure souvent un nuage de points de façon trop lâche.
Lancer gratuitement
Cette approximation d'enveloppe concave part de ce contour extérieur fiable, puis affine les longues arêtes à l'aide de points intérieurs inutilisés jusqu'au seuil demandé ou jusqu'à ce qu'aucune insertion valide ne subsiste. Le résultat déterministe fournit le contour ordonné, les longueurs d'arête, le périmètre, l'aire et le nombre d'arêtes impossibles à raccourcir. Vous pouvez ainsi contrôler l'approximation au lieu de la prendre pour une solution géométrique exacte.
Choisissez des coordonnées et un seuil pertinents
Fournissez au moins trois points plans sous forme de coordonnées numériques x et y, ainsi qu'un seuil de longueur d'arête strictement positif. Les coordonnées peuvent représenter des positions cartographiques projetées, des unités de dessin, des mesures ou tout autre repère cartésien bidimensionnel. Elles doivent partager la même échelle : ne mélangez pas des degrés de longitude et des distances en mètres si vous souhaitez que le seuil conserve un sens physique. Un seuil plus faible demande à l'algorithme de suivre plus fidèlement les points disponibles, tandis qu'un seuil plus élevé préserve davantage le contour convexe. Ce seuil est un objectif et non une garantie, car un jeu clairsemé peut ne contenir aucun point intérieur sûr capable de fractionner une arête donnée. Les coordonnées en double sont ignorées. Il doit rester au moins trois points uniques non colinéaires, puisqu'une droite ne forme pas un polygone. Pour des données de latitude et de longitude, projetez correctement les coordonnées avant d'employer un seuil exprimé comme une distance. L'outil effectue une géométrie plane et n'applique aucun modèle terrestre sphérique ou ellipsoïdal. Commencez par un seuil proche de l'espacement que vous jugez significatif, puis comparez le contour obtenu aux points d'origine.
Comprenez le mécanisme d'affinage du contour
L'algorithme calcule d'abord une enveloppe convexe déterministe avec la méthode de la chaîne monotone. Il examine ensuite les arêtes du contour qui dépassent le seuil indiqué, en commençant par la plus longue. Pour chacune, il recherche des points inutilisés situés à l'intérieur du polygone courant et capables de remplacer l'arête par deux segments plus courts sans croiser une autre partie du contour. Le candidat qui minimise le plus long segment de remplacement est retenu; les égalités sont départagées de manière stable selon la longueur totale puis l'ordre d'entrée initial. Après chaque insertion, la sélection recommence puisque le polygone a changé. L'affinage s'arrête lorsque toutes les arêtes respectent l'objectif ou lorsqu'aucun point restant ne peut améliorer sans risque une longue arête. Cette construction privilégie un résultat prévisible et explicable sans prétendre résoudre les différentes définitions d'une enveloppe concave exacte. Elle n'invente jamais de sommet, ne déplace aucune coordonnée, n'utilise aucun échantillonnage aléatoire et ne contacte aucun service distant. L'enveloppe renvoyée est une liste ouverte de sommets ordonnés, dont le dernier se raccorde au premier. Les longueurs suivent le même ordre cyclique.
Examinez les limites avant d'exploiter le polygone
Consultez unresolved_long_edges chaque fois que le seuil revêt une importance opérationnelle. Une valeur nulle signifie que toutes les arêtes renvoyées satisfont l'objectif; une valeur positive indique que la géométrie disponible ne permettait pas de l'atteindre sans croisement, déplacement vers l'extérieur ou remplacement incapable de raccourcir l'arête. Il s'agit d'une information utile, et non d'un échec dissimulé. L'approximation peut également différer des formes alpha, des enveloppes par plus proches voisins, des filtres de triangulation ou des méthodes propres au tracé des côtes. Comparez plusieurs méthodes lorsque la topologie entraîne des conséquences juridiques, scientifiques ou de sécurité. L'aire et le périmètre décrivent le polygone plan renvoyé dans le système de coordonnées fourni; ce ne sont pas des mesures géodésiques. Superposez le contour ordonné aux points sources afin de vérifier que le seuil restitue les groupes et les rentrants souhaités. Si le contour demeure trop large, ajoutez des points représentatifs ou réduisez le seuil; s'il devient trop détaillé, augmentez-le. La capacité accepte au maximum 500 éléments afin de borner les contrôles répétés d'intersection et de rester adaptée au navigateur comme à l'automatisation déterministe par API.
Cas d’usage
Délimiter un site échantillonné
Créez un contour contrôlable autour de relevés ou de capteurs projetés tout en conservant les rentrants visibles.
Préparer un aperçu cartographique
Transformez un ensemble modéré de points en polygone ordonné avant un traitement GIS spécialisé.
Comparer la sensibilité du contour
Testez plusieurs seuils et comparez aire, périmètre, sommets insérés et arêtes non résolues pour choisir une approximation utile.
Questions fréquentes
S'agit-il d'une enveloppe concave exacte ?
Non. Il existe plusieurs définitions; cette méthode affine de façon déterministe les longues arêtes convexes avec des points intérieurs sûrs.
Quel est le tarif ?
Chaque requête API coûte $0.002. Le même calcul déterministe peut aussi être exécuté dans le navigateur.
Toutes les arêtes passent-elles sous le seuil ?
Pas nécessairement. Le champ unresolved_long_edges signale celles que les points disponibles n'ont pas permis de raccourcir sans risque.
Puis-je utiliser directement latitude et longitude ?
Le calcul fonctionnera, mais les distances et aires resteront des valeurs angulaires planes. Projetez les données si les unités physiques comptent.
Le premier sommet est-il répété à la fin ?
Non. L'enveloppe est une liste ouverte et ordonnée; son dernier point est implicitement raccordé au premier.
Comment traitez-vous les doublons et points colinéaires ?
Les coordonnées strictement identiques sont ignorées. Un ensemble unique entièrement colinéaire est refusé, car il ne définit aucun polygone.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/geo/concave-hull-approx \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"points":[{"x":0,"y":0},{"x":4,"y":0},{"x":4,"y":4},{"x":2,"y":1},{"x":0,"y":4}],"threshold":3}'const res = await fetch("https://api.kit.forhosting.com/geo/concave-hull-approx", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"points": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 4
},
{
"x": 2,
"y": 1
},
{
"x": 0,
"y": 4
}
],
"threshold": 3
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/concave-hull-approx",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"points": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 4
},
{
"x": 2,
"y": 1
},
{
"x": 0,
"y": 4
}
],
"threshold": 3
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/concave-hull-approx", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"points":[{"x":0,"y":0},{"x":4,"y":0},{"x":4,"y":4},{"x":2,"y":1},{"x":0,"y":4}],"threshold":3}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"points":[{"x":0,"y":0},{"x":4,"y":0},{"x":4,"y":4},{"x":2,"y":1},{"x":0,"y":4}],"threshold":3}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/concave-hull-approx", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"points": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 4
},
{
"x": 2,
"y": 1
},
{
"x": 0,
"y": 4
}
],
"threshold": 3
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.concave_hull_approx",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_items | 500 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |