Pontos k vizinhos mais próximos por distância geodésica
Encontre os pontos geográficos mais próximos de uma coordenada de consulta sem configurar um banco de dados espacial.
Executar grátis
Informe latitude e longitude, uma lista de coordenadas candidatas e a quantidade de resultados desejada. A capacidade calcula a distância de grande círculo até cada candidato, classifica do mais próximo ao mais distante e retorna os primeiros k com índices de origem e rótulos opcionais. A ordenação determinística é apropriada para busca de locais, preparação de rotas, verificações de proximidade e pipelines de dados reproduzíveis.
Prepare a consulta e a lista de candidatos
Comece com uma coordenada de consulta em graus decimais e uma lista de um a dez mil pontos candidatos. A latitude deve ficar entre -90 e 90, e a longitude entre -180 e 180. Cada candidato segue as mesmas regras e pode ter um rótulo, como nome de loja, código de depósito, identificador de sensor ou cidade. O rótulo é copiado para o resultado, mas nunca altera a classificação. Escolha k como inteiro positivo que não ultrapasse a quantidade de candidatos. Esse contrato explícito evita buscas parciais ambíguas e faz registros inválidos falharem cedo com uma mensagem útil. Use coordenadas no padrão de graus decimais comum em mapas web e exportações GPS. Caso a origem use graus, minutos e segundos ou uma projeção cartográfica, converta-a antes da chamada. Se duas distâncias forem iguais, a ordem original da lista será mantida, garantindo uma saída repetível em diferentes execuções.
Entenda o ranking por grande círculo
O cálculo representa a Terra como uma esfera com raio médio de 6,371.0088 quilômetros. Para cada candidato, aplica a relação de haversine e um cálculo de ângulo central com atan2, estável tanto para trajetos muito curtos quanto para pontos quase opostos. O valor distance_km é arredondado para seis casas decimais e os candidatos são ordenados de forma crescente. Essa é a distância pela superfície do globo, e não uma linha reta através da Terra, uma rota rodoviária ou uma medida em projeção local. O método trata naturalmente a mudança de longitude perto da linha internacional de data e funciona nos polos. O modelo esférico atende bem a consultas globais, descoberta, despacho aproximado e formação de listas curtas. Para topografia, distância elipsoidal, estradas, altitude, fronteiras ou obstáculos, use o resultado como pré-seleção e aplique depois um cálculo especializado. O índice permite relacionar cada vizinho ao registro original mesmo sem rótulo exclusivo.
Use a lista ordenada em um fluxo maior
Um resultado de vizinhos próximos normalmente inicia uma decisão. Um localizador pode solicitar as cinco filiais mais próximas e depois filtrar por horário ou estoque. Um serviço logístico pode selecionar depósitos próximos antes de enviar poucos candidatos a um mecanismo de rotas. Um painel ambiental pode associar uma observação aos sensores mais próximos e preservar as distâncias para controle de qualidade. Como a função não usa rede, aleatoriedade, estado armazenado nem horário atual, entradas idênticas produzem saídas idênticas. Isso facilita cache, testes com exemplos fixos e reprodução de um ranking em auditorias. O limite declarado mantém o processamento previsível: cada candidato é medido uma vez e o conjunto limitado é ordenado. Para coleções muito grandes ou alteradas com frequência, um índice espacial ou banco de dados é mais eficiente. Para listas compactas enviadas por solicitação, esta capacidade dispensa configuração de índice e retorna uma estrutura JSON transparente, pronta para outra tarefa.
Casos de uso
Monte uma lista de filiais
Retorne lojas ou centros de atendimento próximos antes de filtrar por estoque, horário ou disponibilidade.
Associe leituras a sensores
Encontre estações de monitoramento próximas e preserve distâncias e índices para validação posterior.
Prepare candidatos de rota
Reduza uma lista de depósitos ou pontos aos mais próximos antes de solicitar rotas rodoviárias mais caras.
Perguntas frequentes
Quanto custa uma solicitação?
Cada solicitação de API custa US$ 0,002. O mesmo cálculo determinístico também pode ser executado no navegador.
Qual fórmula de distância é usada?
É usado um cálculo de grande círculo baseado em haversine, com raio médio da Terra de 6,371.0088 quilômetros.
Como distâncias iguais são ordenadas?
Empates preservam a ordem original dos candidatos por meio dos índices de origem iniciados em zero.
k pode superar a lista de candidatos?
Não. k deve ser um inteiro positivo e não pode ser maior que a quantidade de pontos informados.
A ferramenta calcula distância rodoviária?
Não. Ela calcula distância esférica e não considera estradas, tempo de viagem, altitude, fronteiras ou obstáculos.
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/k-nearest-neighbors \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"lat":40.4168,"lon":-3.7038,"points":[{"label":"Toledo","lat":39.8628,"lon":-4.0273},{"label":"Segovia","lat":40.9429,"lon":-4.1088},{"label":"Guadalajara","lat":40.6337,"lon":-3.1674}],"k":2}'const res = await fetch("https://api.kit.forhosting.com/geo/k-nearest-neighbors", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"lat": 40.4168,
"lon": -3.7038,
"points": [
{
"label": "Toledo",
"lat": 39.8628,
"lon": -4.0273
},
{
"label": "Segovia",
"lat": 40.9429,
"lon": -4.1088
},
{
"label": "Guadalajara",
"lat": 40.6337,
"lon": -3.1674
}
],
"k": 2
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/k-nearest-neighbors",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"lat": 40.4168,
"lon": -3.7038,
"points": [
{
"label": "Toledo",
"lat": 39.8628,
"lon": -4.0273
},
{
"label": "Segovia",
"lat": 40.9429,
"lon": -4.1088
},
{
"label": "Guadalajara",
"lat": 40.6337,
"lon": -3.1674
}
],
"k": 2
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/k-nearest-neighbors", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"lat":40.4168,"lon":-3.7038,"points":[{"label":"Toledo","lat":39.8628,"lon":-4.0273},{"label":"Segovia","lat":40.9429,"lon":-4.1088},{"label":"Guadalajara","lat":40.6337,"lon":-3.1674}],"k":2}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"lat":40.4168,"lon":-3.7038,"points":[{"label":"Toledo","lat":39.8628,"lon":-4.0273},{"label":"Segovia","lat":40.9429,"lon":-4.1088},{"label":"Guadalajara","lat":40.6337,"lon":-3.1674}],"k":2}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/k-nearest-neighbors", 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
{
"lat": 40.4168,
"lon": -3.7038,
"points": [
{
"label": "Toledo",
"lat": 39.8628,
"lon": -4.0273
},
{
"label": "Segovia",
"lat": 40.9429,
"lon": -4.1088
},
{
"label": "Guadalajara",
"lat": 40.6337,
"lon": -3.1674
}
],
"k": 2
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.k_nearest_neighbors",
"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 | 10000 |
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. |