Densificar una línea geodésica con vértices equidistantes
Densifique una línea geográfica insertando vértices intermedios de latitud y longitud en cada segmento.
Ejecutar — gratis
Indique una línea ordenada y una separación máxima en metros; el resultado seguirá el arco de círculo máximo más corto y garantizará que ningún intervalo generado supere esa separación. Los vértices originales conservarán su orden, mientras que los recuentos y resúmenes de distancia facilitarán revisar, representar o reutilizar el resultado en otro flujo geoespacial sin depender de una aplicación SIG de escritorio.
Elija una separación adecuada para el proceso posterior
La densificación resulta útil cuando una operación necesita muestras más frecuentes que las proporcionadas por la geometría de origen. Comience con una matriz ordenada de registros que contengan lat y lon, y defina spacing_m como el intervalo máximo aceptable en metros. La calculadora evalúa cada segmento original por separado. Si uno ya es más corto que la separación solicitada, se conserva como un único tramo y no se añade ningún punto innecesario. Si es más largo, se divide en el menor número entero de tramos geodésicos de igual longitud que cumpla el máximo. La separación funciona como límite superior, no como una exigencia de igualdad exacta. Al dividir cada segmento por separado, se conserva su extremo y el siguiente comienza exactamente en el vértice original. Elija una separación amplia para vistas generales y otra menor cuando las muestras alimenten consultas de terreno, cobertura, animaciones o cálculos que presupongan aristas cortas. Una separación excesivamente pequeña puede generar muchos datos; por eso se rechazan las solicitudes que excedan el límite de salida, sin truncar la línea silenciosamente.
Comprenda el cálculo geodésico esférico
Cada par de coordenadas consecutivas define un segmento sobre una esfera. El algoritmo convierte ambos extremos en vectores unitarios tridimensionales, mide su ángulo central e interpola sobre el arco de círculo máximo más corto. La distancia es ese ángulo multiplicado por earth_radius_m, cuyo valor predeterminado es el radio medio convencional de la Tierra. El método funciona correctamente al cruzar el antimeridiano: una línea desde 179 grados este hasta 179 grados oeste toma el trayecto breve junto a la línea internacional de cambio de fecha. También evita tratar la latitud y la longitud como coordenadas cartesianas planas, una aproximación engañosa en distancias largas o cerca de los polos. Las coordenadas originales y añadidas son deterministas y se redondean con una precisión estable. Los puntos consecutivos coincidentes se conservan porque pueden tener significado estructural, aunque su distancia sea cero. Los extremos exactamente antípodas se rechazan: infinitos círculos máximos unen dos puntos opuestos y no existe una ruta corta única. Para trabajos topográficos elipsoidales, tenga presente que se utiliza una esfera configurable, no el elipsoide WGS-84 completo.
Interprete y valide el resultado
El resultado principal es vertices, una matriz ordenada que puede serializar como coordenadas o transformar al formato geométrico de su aplicación. La primera y la última coordenada son los extremos de origen, y cada vértice interior original aparece en el límite entre segmentos. La respuesta también incluye input_vertices, output_vertices e inserted_vertices, de modo que la expansión sea explícita y pueda controlar los presupuestos de almacenamiento o representación. total_distance_m suma las longitudes geodésicas originales. max_segment_distance_m indica el mayor intervalo real tras la subdivisión y debe ser menor o igual que la separación solicitada, salvo redondeos insignificantes. Compruebe ese campo si la densificación protege un requisito de muestreo posterior. Respete el orden al convertir a GeoJSON: allí los pares suelen colocar la longitud antes que la latitud, aunque esta API usa propiedades con nombre lat y lon. El cálculo es puro, no realiza solicitudes de red ni conserva la línea. Puede probarlo en el navegador y automatizarlo mediante la API por $0.002 por solicitud, con la misma estructura determinista.
Qué puede hacer con ella
Preparar una ruta para muestreo regular
Añada suficientes vértices antes de consultar elevación, meteorología, cobertura de señal u otro valor variable a lo largo de una ruta.
Mejorar el dibujo de aristas largas
Represente aristas geográficas extensas con puntos intermedios de círculo máximo para que rutas proyectadas o animadas sigan el trayecto previsto.
Normalizar líneas de resolución desigual
Aplique un único límite de separación a líneas cuyos vértices de origen se capturaron con intervalos diferentes.
Preguntas frecuentes
¿spacing_m fija una distancia exacta entre todos los puntos?
No. Establece el intervalo máximo permitido. Cada segmento original se divide en tramos geodésicos iguales que no superan ese valor.
¿Se conservan los vértices originales?
Sí. Todos permanecen en su orden y los nuevos vértices se insertan entre originales consecutivos.
¿Funciona al cruzar el antimeridiano?
Sí. La interpolación sigue el arco de círculo máximo más corto, incluido el cruce breve entre longitudes próximas a 180 grados.
¿Por qué se rechazan los extremos antípodas?
Los puntos opuestos no determinan un único círculo máximo. El rechazo evita seleccionar una ruta arbitraria.
¿El cálculo usa el elipsoide WGS-84?
No. Emplea geometría esférica de círculo máximo con un radio configurable cuyo valor inicial es el radio medio terrestre.
¿Cuánto cuesta una solicitud de API?
Cada solicitud cuesta $0.002. El cálculo determinista no llama a servicios externos.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
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)Ejemplo de solicitud
{
"line": [
{
"lat": 37.7749,
"lon": -122.4194
},
{
"lat": 37.8044,
"lon": -122.2711
},
{
"lat": 37.6879,
"lon": -122.4702
}
],
"spacing_m": 5000
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.densify_line",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
max_points | 10000 |
max_output_vertices | 100000 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |