Aproximação de casco côncavo por coordenadas
Um casco convexo é útil, mas muitas vezes envolve um conjunto de pontos com folga excessiva.
Executar grátis
Esta aproximação de casco côncavo parte desse limite externo confiável e refina arestas longas com pontos internos ainda não usados até alcançar o limiar solicitado ou não haver outra inserção válida. O resultado determinístico inclui o contorno ordenado, os comprimentos das arestas, o perímetro, a área e a quantidade de arestas que não puderam ser encurtadas, permitindo que você examine a aproximação em vez de recebê-la como uma resposta geométrica exata.
Escolha coordenadas e um limiar relevante
Forneça pelo menos três pontos planos como coordenadas numéricas x e y, além de um limiar positivo para o comprimento das arestas. As coordenadas podem representar posições cartográficas projetadas, unidades de desenho, medições ou qualquer outro sistema cartesiano bidimensional. Todas devem usar a mesma escala: não misture graus de longitude com distâncias em metros esperando que o limiar preserve um significado físico. Um limiar menor solicita que o algoritmo acompanhe os pontos disponíveis mais de perto, enquanto um valor maior mantém uma parcela maior do contorno convexo. O limiar é uma meta, não uma garantia, pois um conjunto esparso pode não conter um ponto interno seguro capaz de dividir determinada aresta. Coordenadas duplicadas são ignoradas. Devem restar pelo menos três pontos únicos e não colineares, já que uma linha não forma um polígono. Para dados de latitude e longitude, projete as coordenadas adequadamente antes de usar um limiar expresso como distância. A ferramenta realiza geometria plana e não adota um modelo esférico ou elipsoidal da Terra. Comece com um limiar próximo do espaçamento que você considera uma lacuna significativa e compare o contorno retornado com os pontos originais antes de utilizá-lo em outra etapa.
Entenda como o contorno é refinado
Primeiro, o algoritmo calcula um casco convexo determinístico pelo método da cadeia monotônica. Em seguida, examina as arestas do contorno maiores que o limiar informado, começando pela mais longa. Para cada uma, procura pontos não utilizados que estejam dentro do polígono atual e possam substituir a aresta por dois segmentos menores sem cruzar outro trecho do limite. É escolhido o candidato que minimiza o maior segmento substituto, com desempate estável pela extensão total e pela ordem original de entrada. Depois de uma inserção, a seleção recomeça porque o polígono mudou. O refinamento termina quando todas as arestas atendem à meta ou nenhum ponto restante consegue melhorar com segurança uma aresta longa. Essa construção privilegia um resultado previsível e explicável, sem alegar que resolve as diversas definições concorrentes de casco côncavo exato. Ela nunca inventa vértices, desloca coordenadas, usa amostragem aleatória ou consulta um serviço remoto. O casco retornado é uma lista aberta e ordenada de vértices, na qual o último se conecta novamente ao primeiro. Os comprimentos das arestas seguem a mesma ordem cíclica. Pontos externos colineares podem ser omitidos, salvo se depois forem úteis ao refinamento.
Confira as limitações antes de usar o polígono
Verifique unresolved_long_edges sempre que o limiar tiver importância operacional. O valor zero indica que todas as arestas retornadas atendem à meta; um valor positivo mostra que a geometria dos pontos não permitiu cumpri-la sem cruzamento, movimento para fora ou uma substituição incapaz de encurtar a aresta. Isso é uma informação útil, não uma falha escondida. A aproximação também pode produzir um limite diferente dos resultados de formas alfa, cascos por vizinhos mais próximos, filtros de triangulação ou métodos especializados para linhas costeiras. Compare técnicas quando a topologia tiver consequências jurídicas, científicas ou de segurança. A área e o perímetro informados pertencem ao polígono plano retornado e usam o sistema de coordenadas fornecido por você; não são medições geodésicas. Sobreponha o casco ordenado aos pontos de origem para avaliar se o limiar representa os agrupamentos e reentrâncias pretendidos. Se o contorno continuar amplo demais, acrescente pontos representativos ou reduza o limiar; se ficar detalhado em excesso, aumente-o. A capacidade aceita no máximo 500 itens para manter limitadas as verificações repetidas de interseção e permitir execução interativa no navegador e automação determinística pela API.
Casos de uso
Delimitar uma área amostrada
Crie um limite verificável ao redor de pontos projetados de sensores ou levantamentos, preservando reentrâncias visíveis.
Preparar uma visualização cartográfica
Transforme uma coleção moderada de pontos em um polígono ordenado antes de aplicar um fluxo GIS especializado.
Comparar a sensibilidade do limite
Teste vários limiares e compare área, perímetro, vértices inseridos e arestas pendentes para escolher uma aproximação adequada.
Perguntas frequentes
Este é um casco côncavo exato?
Não. Há várias definições; este método refina deterministicamente arestas longas do casco convexo com pontos internos seguros.
Quanto custa?
Cada solicitação à API custa US$ 0,002. O mesmo cálculo determinístico também pode ser executado no navegador.
Todas as arestas ficam abaixo do limiar?
Não necessariamente. O campo unresolved_long_edges informa quais arestas não puderam ser encurtadas com segurança usando os pontos disponíveis.
Posso usar latitude e longitude diretamente?
O cálculo será executado, mas distâncias e áreas continuarão sendo valores angulares planos. Projete os dados antes quando unidades físicas forem importantes.
O primeiro ponto do casco se repete no final?
Não. O casco é uma lista aberta e ordenada; considere que o último ponto se conecta novamente ao primeiro.
Como pontos duplicados ou colineares são tratados?
Coordenadas exatamente duplicadas são ignoradas. Um conjunto único totalmente colinear é rejeitado porque não pode definir um polígono.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
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)Exemplo de requisição
{
"points": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 4
},
{
"x": 2,
"y": 1
},
{
"x": 0,
"y": 4
}
],
"threshold": 3
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.concave_hull_approx",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_items | 500 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |