Densificar linha geodésica com vértices equidistantes
Densifique uma linha geográfica inserindo vértices intermediários de latitude e longitude em cada segmento.
Executar grátis
Informe uma linha ordenada e um espaçamento máximo em metros; o resultado seguirá o arco de círculo máximo mais curto e garantirá que nenhuma lacuna gerada ultrapasse esse valor. Os vértices originais permanecerão na ordem, enquanto contagens e resumos de distância facilitarão a conferência, a exibição no mapa ou o uso em outro fluxo espacial sem depender de um programa SIG para computador.
Escolha um espaçamento adequado à próxima etapa
A densificação de linhas é útil quando uma operação precisa de amostras mais frequentes do que a geometria original oferece. Comece com uma lista ordenada de registros contendo lat e lon e defina spacing_m como a maior lacuna aceitável em metros. A calculadora avalia cada segmento original separadamente. Quando um segmento já é menor que o espaçamento solicitado, ele permanece como uma única lacuna, sem pontos desnecessários. Quando é maior, o trecho é dividido no menor número inteiro de partes geodésicas iguais capaz de respeitar o máximo. Portanto, o espaçamento é um teto, não uma exigência de que todas as lacunas tenham exatamente o valor informado. Como cada segmento é dividido à parte, seu ponto final é preservado e o seguinte começa exatamente no vértice original. Use valores maiores em mapas de visão geral e menores quando as amostras alimentarem consultas de terreno, cobertura, animações ou cálculos que pressupõem arestas curtas. Um espaçamento muito pequeno pode produzir uma resposta extensa; por isso, a capacidade rejeita resultados acima do limite documentado em vez de cortar a linha sem aviso.
Entenda o cálculo geodésico esférico
Cada par de coordenadas consecutivas define um segmento sobre uma esfera. O algoritmo transforma os dois pontos em vetores unitários tridimensionais, mede o ângulo central e interpola pelo arco de círculo máximo mais curto. A distância corresponde a esse ângulo multiplicado por earth_radius_m, cujo padrão é o raio médio convencional da Terra. O método funciona corretamente ao atravessar o antimeridiano: uma linha de 179 graus leste a 179 graus oeste segue o caminho curto junto à linha internacional de data. Ele também evita tratar latitude e longitude como coordenadas cartesianas planas, aproximação que se torna enganosa em grandes distâncias ou perto dos polos. As coordenadas originais e inseridas são determinísticas e recebem arredondamento estável para comparações confiáveis em JSON. Pontos consecutivos coincidentes são mantidos, pois podem ter significado estrutural, embora a lacuna seja zero. Pontos exatamente antípodas são recusados porque infinitos círculos máximos ligam pontos opostos e não há um caminho curto único. Em trabalhos de levantamento que exijam elipsoide, considere que esta capacidade usa uma esfera configurável, e não o elipsoide WGS-84 completo.
Leia e valide o resultado
O resultado principal é vertices, uma lista ordenada pronta para ser serializada como coordenadas ou convertida ao formato geométrico do seu aplicativo. A primeira e a última coordenada são os extremos de origem, e cada vértice interno original aparece na divisa entre segmentos. A resposta também informa input_vertices, output_vertices e inserted_vertices, tornando a expansão visível e ajudando a controlar limites de armazenamento ou renderização. total_distance_m soma os comprimentos geodésicos originais. max_segment_distance_m mostra a maior lacuna real depois da subdivisão; ela deve ser menor ou igual ao espaçamento solicitado, exceto por arredondamento numérico irrelevante. Confira esse campo quando a densificação proteger um requisito posterior de amostragem. Preserve a ordem das coordenadas ao converter para GeoJSON, no qual os pares normalmente trazem longitude antes de latitude, embora esta API use propriedades nomeadas lat e lon. O cálculo é puro, não acessa a rede e não guarda a linha enviada. Você pode fazer verificações interativas no navegador e automatizar pela API por US$ 0,002 por solicitação, recebendo a mesma estrutura determinística.
Casos de uso
Preparar uma rota para amostragem regular
Inclua vértices suficientes antes de consultar elevação, clima, cobertura de sinal ou outro valor variável ao longo da rota.
Melhorar o desenho de arestas longas
Represente arestas geográficas extensas com pontos intermediários de círculo máximo para que trajetos projetados ou animados sigam a rota pretendida.
Normalizar linhas com resoluções variadas
Aplique uma única regra de lacuna máxima a linhas cujos vértices originais foram capturados em intervalos inconsistentes.
Perguntas frequentes
spacing_m define uma distância exata entre todos os pontos?
Não. Ele define a maior lacuna permitida. Cada segmento original é repartido em trechos geodésicos iguais que não ultrapassam esse valor.
Os vértices originais são preservados?
Sim. Todos permanecem na mesma ordem, e os novos vértices são inseridos entre originais consecutivos.
Funciona ao atravessar o antimeridiano?
Sim. A interpolação segue o arco de círculo máximo mais curto, inclusive na passagem breve entre longitudes próximas de 180 graus.
Por que pontos antípodas são recusados?
Pontos opostos não determinam um único círculo máximo. A recusa evita a escolha de uma rota arbitrária.
O cálculo se baseia no elipsoide WGS-84?
Não. Ele usa geometria esférica de círculo máximo com raio configurável, cujo padrão é o raio médio da Terra.
Quanto custa uma solicitação de API?
Cada solicitação custa US$ 0,002. O cálculo determinístico não chama serviços de terceiros.
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/densify-line \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"line":[{"lat":37.7749,"lon":-122.4194},{"lat":37.8044,"lon":-122.2711},{"lat":37.6879,"lon":-122.4702}],"spacing_m":5000}'const res = await fetch("https://api.kit.forhosting.com/geo/densify-line", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"line": [
{
"lat": 37.7749,
"lon": -122.4194
},
{
"lat": 37.8044,
"lon": -122.2711
},
{
"lat": 37.6879,
"lon": -122.4702
}
],
"spacing_m": 5000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/densify-line",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"line": [
{
"lat": 37.7749,
"lon": -122.4194
},
{
"lat": 37.8044,
"lon": -122.2711
},
{
"lat": 37.6879,
"lon": -122.4702
}
],
"spacing_m": 5000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/densify-line", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"line":[{"lat":37.7749,"lon":-122.4194},{"lat":37.8044,"lon":-122.2711},{"lat":37.6879,"lon":-122.4702}],"spacing_m":5000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"line":[{"lat":37.7749,"lon":-122.4194},{"lat":37.8044,"lon":-122.2711},{"lat":37.6879,"lon":-122.4702}],"spacing_m":5000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/densify-line", 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
{
"line": [
{
"lat": 37.7749,
"lon": -122.4194
},
{
"lat": 37.8044,
"lon": -122.2711
},
{
"lat": 37.6879,
"lon": -122.4702
}
],
"spacing_m": 5000
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.densify_line",
"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 | 10000 |
max_output_vertices | 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. |