Approssimazione dell'inviluppo concavo da coordinate
Un inviluppo convesso è utile, ma spesso racchiude un insieme di punti in modo troppo ampio.
Esegui gratis nel browser
Questa approssimazione dell'inviluppo concavo parte da quel contorno esterno affidabile e affina i lati lunghi con punti interni non ancora usati, finché raggiunge la soglia richiesta o non rimangono inserimenti validi. Il risultato deterministico comprende il contorno ordinato, le lunghezze dei lati, il perimetro, l'area e il numero di lati che non è stato possibile accorciare. Lei può quindi verificare l'approssimazione senza scambiarla per una soluzione geometrica esatta.
Scelga coordinate e una soglia significative
Fornisca almeno tre punti planari mediante coordinate numeriche x e y, insieme a una soglia positiva per la lunghezza dei lati. Le coordinate possono rappresentare posizioni cartografiche proiettate, unità di disegno, misure o qualsiasi altro sistema cartesiano bidimensionale. Devono condividere la stessa scala: non mescoli gradi di longitudine e distanze in metri aspettandosi che la soglia mantenga un significato fisico. Una soglia inferiore richiede all'algoritmo di seguire più da vicino i punti disponibili, mentre una soglia superiore conserva una parte maggiore del profilo convesso. La soglia è un obiettivo, non una garanzia, perché un insieme sparso potrebbe non contenere alcun punto interno sicuro in grado di dividere un determinato lato. Le coordinate duplicate vengono ignorate. Devono restare almeno tre punti unici e non collineari, poiché una retta non può formare un poligono. Per dati di latitudine e longitudine, proietti opportunamente le coordinate prima di usare una soglia espressa come distanza. Lo strumento esegue geometria planare e non applica modelli terrestri sferici o ellissoidali. Inizi con una soglia vicina alla distanza che Lei considera un vuoto significativo, quindi confronti il contorno restituito con i punti originali prima dell'uso successivo.
Comprenda come viene affinato il contorno
L'algoritmo calcola prima un inviluppo convesso deterministico con il metodo della catena monotona. Esamina quindi i lati del contorno più lunghi della soglia indicata, iniziando dal maggiore. Per ogni lato cerca punti inutilizzati che si trovino dentro il poligono corrente e possano sostituirlo con due segmenti più corti senza intersecare un altro tratto del confine. Viene scelto il candidato che riduce al minimo il segmento sostitutivo più lungo; eventuali parità sono risolte stabilmente in base alla lunghezza totale e all'ordine originale dei dati. Dopo ogni inserimento la selezione ricomincia, perché il poligono è cambiato. L'affinamento termina quando tutti i lati rispettano l'obiettivo oppure nessun punto residuo può migliorare in sicurezza un lato lungo. Questa costruzione privilegia un risultato prevedibile e spiegabile senza pretendere di risolvere le diverse definizioni concorrenti di inviluppo concavo esatto. Non inventa vertici, non sposta coordinate, non usa campionamento casuale e non consulta servizi remoti. L'inviluppo restituito è un elenco aperto e ordinato di vertici, nel quale l'ultimo si collega al primo. Le lunghezze seguono lo stesso ordine ciclico.
Valuti i limiti prima di utilizzare il poligono
Controlli unresolved_long_edges ogni volta che la soglia ha rilevanza operativa. Il valore zero indica che tutti i lati restituiti soddisfano l'obiettivo; un valore positivo segnala che la geometria disponibile non permetteva di raggiungerlo senza un'intersezione, uno spostamento verso l'esterno o una sostituzione che non accorciasse il lato. È un'informazione utile, non un errore nascosto. L'approssimazione può anche differire dai risultati prodotti da forme alfa, inviluppi basati sui vicini più prossimi, filtri di triangolazione o metodi specifici per le coste. Confronti più metodi quando la topologia comporta conseguenze legali, scientifiche o di sicurezza. L'area e il perimetro appartengono al poligono planare restituito e utilizzano il sistema di coordinate fornito da Lei; non sono misure geodetiche. Sovrapponga l'inviluppo ordinato ai punti sorgente per verificare che la soglia rappresenti i gruppi e le rientranze desiderati. Se il confine resta troppo ampio, aggiunga punti rappresentativi o riduca la soglia; se diventa troppo dettagliato, la aumenti. La capacità accetta al massimo 500 elementi, così i controlli ripetuti delle intersezioni restano limitati e adatti sia all'esecuzione interattiva nel browser sia all'automazione deterministica tramite API.
Casi d'uso
Delimitare un sito campionato
Crei un confine verificabile intorno a punti proiettati di rilievi o sensori, mantenendo le rientranze visibili.
Preparare un'anteprima cartografica
Trasformi una raccolta moderata di punti in un poligono ordinato prima di un flusso GIS specialistico.
Confrontare la sensibilità del confine
Provi soglie diverse e confronti area, perimetro, vertici inseriti e lati irrisolti per scegliere un'approssimazione utile.
Domande frequenti
Si tratta di un inviluppo concavo esatto?
No. Esistono varie definizioni; questo metodo affina deterministicamente i lati convessi lunghi mediante punti interni sicuri.
Quanto costa?
Ogni richiesta API costa $0.002. Lo stesso calcolo deterministico può essere eseguito anche nel browser.
Tutti i lati scendono sotto la soglia?
Non necessariamente. Il campo unresolved_long_edges segnala quelli che non potevano essere accorciati in sicurezza con i punti disponibili.
Posso usare direttamente latitudine e longitudine?
Il calcolo verrà eseguito, ma distanze e aree resteranno valori angolari planari. Proietti prima i dati se contano le unità fisiche.
Il primo punto viene ripetuto alla fine?
No. L'inviluppo è un elenco aperto e ordinato; consideri l'ultimo punto collegato nuovamente al primo.
Come vengono gestiti punti duplicati o collineari?
Le coordinate esattamente duplicate vengono ignorate. Un insieme unico interamente collineare viene rifiutato perché non può definire un poligono.
Per sviluppatori — accesso via API
Tutto quello che vedi in questa pagina è disponibile anche via API. Questa sezione è per i team che vogliono integrarlo nei propri sistemi; chi non ne ha bisogno può semplicemente usare lo strumento qui sopra.
Endpoint
Autenticazione con Bearer token: un POST mette in coda l'attività e il risultato arriva via webhook o link firmato.
Chiamala dal tuo 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)Esempio di richiesta
{
"points": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 4
},
{
"x": 2,
"y": 1
},
{
"x": 0,
"y": 4
}
],
"threshold": 3
}Esempio di risposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.concave_hull_approx",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L'API è asincrona: ricevi subito un task_id e puoi fare polling fino a 1 richiesta al secondo.
Prezzi
Prezzo pubblicato, senza token né crediti. Se l'attività fallisce, non paghi.
Limiti
max_items | 500 |
Errori
| HTTP | Codice | Significato |
|---|---|---|
401 | unauthorized | Chiave API mancante o non valida: controlla l'header Authorization. |
402 | insufficient_balance | Credito esaurito: ricarica per continuare a eseguire attività. |
404 | unknown_type | Tipo di attività sconosciuto: controlla il campo type della richiesta. |
429 | rate_limited | Troppe richieste in poco tempo: rallenta e riprova tra qualche secondo. |