Agrupamento de pontos por grade
O agrupamento de pontos por grade transforma uma lista extensa de coordenadas em um resumo compacto de densidade sem executar um modelo iterativo.
Executar grátis
Escolha o tamanho da célula quadrada em graus decimais, envie registros de latitude e longitude e receba cada célula ocupada com limites geográficos, contagem e índices originais. A grade possui âncora global; portanto, chamadas com o mesmo tamanho podem ser comparadas ou combinadas. O processamento é determinístico, local e rápido: nenhum provedor de mapas, consulta de rede, semente aleatória ou conjunto armazenado altera a resposta.
Escolha um tamanho de grade adequado à sua pergunta
Um grupo de grade é uma divisão espacial, não uma afirmação de que todos os membros formam uma comunidade natural. O valor cell_size define altura e largura em graus decimais. Um valor maior gera menos células e uma visão ampla; um valor menor preserva mais variação local e costuma criar mais células ocupadas. Como os graus de longitude cobrem menor distância física perto dos polos, as células são quadrados angulares, e não áreas terrestres iguais. Essa escolha mantém a operação transparente e econômica, mas deve ser considerada ao comparar densidades em latitudes distantes. Para dados urbanos, comece com uma fração moderada de grau e ajuste enquanto verifica os limites retornados. Se áreas físicas iguais forem indispensáveis em escala mundial, projete as coordenadas em um sistema adequado antes de usar outro fluxo. Esta capacidade aceita somente latitude e longitude geográficas comuns. A âncora global é fixa em latitude -90 e longitude -180, de modo que o mesmo tamanho sempre produz as mesmas bordas e permite relatórios, testes e partições repetíveis entre processos independentes.
Leia contagens, limites e associação
Cada célula contém linha e coluna numeradas a partir de zero, limites sul, oeste, norte e leste, uma contagem e member_indices. Esses índices apontam para posições no array points enviado, começando em zero, para que você recupere os registros de origem sem copiar rótulos para a saída. As células são ordenadas primeiro do sul para o norte e depois do oeste para o leste. Os membros mantêm a ordem original. Uma coordenada em uma borda interna entra na célula imediatamente ao norte ou a leste; latitude 90 e longitude 180 são limitadas à última linha ou coluna válida. point_count confirma o total processado, enquanto occupied_cell_count mostra o número compacto de células não vazias. Células vazias são omitidas para evitar materializar uma grade mundial enorme. Nas extremidades norte e leste, uma célula pode ser menor quando o tamanho não divide 180 ou 360 exatamente. Ao desenhar retângulos ou criar relatórios, use os limites retornados em vez de refazê-los com aritmética de ponto flutuante não verificada.
Monte fluxos reproduzíveis de densidade e partição
A agregação por grade é uma primeira etapa prática para mapas, sensores, entregas, observações de campo e verificações de qualidade. A atribuição tem custo linear e depois somente as células ocupadas são ordenadas, sendo apropriada quando uma tabela rápida importa mais do que descobrir formatos irregulares. Um painel pode colorir cada retângulo pela contagem; um pipeline pode encaminhar registros usando linha e coluna; testes podem comparar células entre versões; e analistas podem escolher áreas densas antes de executar métodos mais caros. O algoritmo não calcula centroides, distâncias, vizinhança ou limiares, nem une células adjacentes. Também não geocodifica nomes, corrige coordenadas invertidas, normaliza longitudes ou decide se duplicatas são erros. Valores inválidos ou não finitos são rejeitados. Para combinar lotes, use o mesmo cell_size, some contagens com linha e coluna iguais e remapeie índices fora do serviço. O uso interativo no navegador é gratuito; uma solicitação correta pela API usa o preço-base publicado de US$ 0,002. Entradas JSON iguais sempre geram respostas iguais, pois não há rede, aleatoriedade, relógio ou estado compartilhado mutável.
Casos de uso
Crie uma camada de densidade no mapa
Converta coordenadas de eventos em retângulos ocupados e pinte cada célula conforme a contagem retornada.
Particione registros de localização
Use identificadores estáveis de linha e coluna para encaminhar registros próximos a partições repetíveis.
Examine um conjunto espacial grande
Encontre rapidamente áreas densas e esparsas antes de aplicar análises por distância a subconjuntos selecionados.
Perguntas frequentes
Quanto custa uma solicitação de API?
Uma solicitação bem-sucedida custa US$ 0,002. Você também pode executar gratuitamente o mesmo cálculo no navegador.
O tamanho da célula é medido em quilômetros?
Não. Ele usa graus decimais de latitude e longitude; por isso, a largura física varia conforme a latitude.
Onde a grade fica ancorada?
As linhas começam na latitude -90 e as colunas na longitude -180. A âncora nunca muda entre solicitações.
O que ocorre com um ponto na borda?
Uma borda interna envia o ponto à célula ao norte ou a leste. Latitude 90 e longitude 180 entram na última célula válida.
As células vazias são retornadas?
Não. Somente células ocupadas aparecem, mantendo compactos os resultados de grades finas.
A ferramenta encontra grupos irregulares ou por distância?
Não. Ela conta pontos em células angulares fixas e não une vizinhas nem calcula distâncias entre pontos.
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/point-cluster-grid \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"points":[{"lat":40.7128,"lon":-74.006},{"lat":40.7306,"lon":-73.9352},{"lat":34.0522,"lon":-118.2437}],"cell_size":1}'const res = await fetch("https://api.kit.forhosting.com/geo/point-cluster-grid", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"points": [
{
"lat": 40.7128,
"lon": -74.006
},
{
"lat": 40.7306,
"lon": -73.9352
},
{
"lat": 34.0522,
"lon": -118.2437
}
],
"cell_size": 1
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/point-cluster-grid",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"points": [
{
"lat": 40.7128,
"lon": -74.006
},
{
"lat": 40.7306,
"lon": -73.9352
},
{
"lat": 34.0522,
"lon": -118.2437
}
],
"cell_size": 1
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/point-cluster-grid", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"points":[{"lat":40.7128,"lon":-74.006},{"lat":40.7306,"lon":-73.9352},{"lat":34.0522,"lon":-118.2437}],"cell_size":1}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"points":[{"lat":40.7128,"lon":-74.006},{"lat":40.7306,"lon":-73.9352},{"lat":34.0522,"lon":-118.2437}],"cell_size":1}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/point-cluster-grid", 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": [
{
"lat": 40.7128,
"lon": -74.006
},
{
"lat": 40.7306,
"lon": -73.9352
},
{
"lat": 34.0522,
"lon": -118.2437
}
],
"cell_size": 1
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.point_cluster_grid",
"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_points | 100000 |
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. |