Aproximación de envolvente cóncava con coordenadas
Una envolvente convexa resulta útil, pero suele rodear un conjunto de puntos con demasiada holgura.
Ejecutar — gratis
Esta aproximación de envolvente cóncava parte de ese contorno exterior fiable y refina sus aristas largas con puntos interiores sin usar hasta alcanzar el umbral solicitado o hasta que no sea posible insertar otro punto válido. El resultado determinista incluye el contorno ordenado, las longitudes de las aristas, el perímetro, el área y el número de aristas que no pudieron acortarse, para que usted pueda evaluar la aproximación en vez de recibirla como una solución geométrica exacta.
Elija coordenadas y un umbral significativo
Proporcione al menos tres puntos planos mediante coordenadas numéricas x e y, junto con un umbral positivo para la longitud de las aristas. Las coordenadas pueden representar posiciones cartográficas proyectadas, unidades de dibujo, mediciones o cualquier otro sistema cartesiano bidimensional. Todas deben compartir la misma escala: no mezcle grados de longitud con distancias en metros si espera que el umbral conserve un significado físico. Un umbral menor pide al algoritmo que siga con más detalle los puntos disponibles, mientras que uno mayor mantiene una parte más amplia del contorno convexo. El umbral es un objetivo, no una garantía, porque en un conjunto disperso quizá no exista un punto interior seguro que permita dividir una arista concreta. Las coordenadas duplicadas se ignoran. Deben quedar al menos tres puntos únicos no colineales, pues una línea no puede formar un polígono. Si trabaja con latitud y longitud, proyecte antes las coordenadas cuando el umbral esté expresado como distancia. La herramienta utiliza geometría plana y no aplica un modelo terrestre esférico ni elipsoidal. Comience con un umbral próximo al espacio que usted considere un hueco relevante y compare después el contorno obtenido con los puntos originales.
Comprenda cómo se refina el contorno
El algoritmo calcula primero una envolvente convexa determinista mediante el método de cadena monótona. A continuación examina, de mayor a menor, las aristas del contorno que superan el umbral indicado. Para cada una busca puntos sin usar que estén dentro del polígono actual y puedan sustituir la arista por dos segmentos más cortos sin cruzar ningún otro tramo del contorno. Se elige el candidato que minimiza el segmento de sustitución más largo; si hay empate, se aplican criterios estables basados en la longitud total y el orden original de entrada. Tras cada inserción se reinicia la selección, ya que el polígono ha cambiado. El refinamiento termina cuando todas las aristas cumplen el objetivo o cuando ningún punto restante puede mejorar una arista larga con seguridad. Este procedimiento favorece una salida predecible y explicable, sin fingir que resuelve todas las definiciones posibles de una envolvente cóncava exacta. Nunca inventa vértices, desplaza coordenadas, toma muestras aleatorias ni consulta servicios externos. El contorno devuelto es una lista abierta y ordenada de vértices: el último se conecta con el primero. Las longitudes siguen ese mismo orden cíclico.
Revise las limitaciones antes de usar el polígono
Consulte siempre unresolved_long_edges cuando el umbral tenga importancia operativa. Un valor de cero indica que todas las aristas devueltas cumplen el objetivo; un valor positivo significa que la geometría disponible no permitió satisfacerlo sin provocar un cruce, un desplazamiento hacia fuera o una sustitución que no acortara la arista. Es una advertencia útil, no un fallo oculto. La aproximación también puede diferir de los resultados obtenidos con formas alfa, envolventes por vecinos más próximos, filtros de triangulación o métodos especializados para costas. Compare métodos cuando la topología tenga consecuencias jurídicas, científicas o de seguridad. El área y el perímetro corresponden al polígono plano devuelto y emplean el sistema de coordenadas que usted suministre; no son medidas geodésicas. Dibuje el contorno ordenado sobre los puntos de origen para comprobar si el umbral representa los grupos y entrantes deseados. Si el límite sigue siendo demasiado amplio, añada puntos representativos o reduzca el umbral; si resulta excesivamente detallado, auméntelo. La capacidad admite hasta 500 elementos para mantener acotadas las comprobaciones reiteradas de intersección tanto en el navegador como en la automatización mediante API.
Qué puede hacer con ella
Delimitar un lugar muestreado
Cree un contorno verificable alrededor de puntos proyectados de sensores o levantamientos, conservando entrantes visibles.
Preparar una vista cartográfica
Convierta una colección moderada de puntos en un polígono ordenado antes de aplicar un flujo GIS especializado.
Comparar la sensibilidad del contorno
Pruebe varios umbrales y compare área, perímetro, vértices insertados y aristas pendientes para elegir una aproximación útil.
Preguntas frecuentes
¿Es una envolvente cóncava exacta?
No. Existen varias definiciones; este método refina de forma determinista las aristas largas de una envolvente convexa mediante puntos interiores seguros.
¿Cuánto cuesta?
Cada solicitud de API cuesta $0.002. El mismo cálculo determinista puede ejecutarse en el navegador.
¿Todas las aristas quedan por debajo del umbral?
No necesariamente. El campo unresolved_long_edges indica las aristas que no pudieron acortarse con seguridad usando los puntos disponibles.
¿Puedo usar directamente latitud y longitud?
El cálculo funcionará, pero las distancias y áreas serán valores angulares planos. Proyecte los datos antes cuando necesite unidades físicas.
¿Se repite el primer punto al final?
No. El contorno es una lista abierta y ordenada; considere que el último punto se conecta con el primero.
¿Cómo se tratan los puntos duplicados o colineales?
Las coordenadas exactamente duplicadas se ignoran. Un conjunto único totalmente colineal se rechaza porque no puede definir un polígono.
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/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)Ejemplo de solicitud
{
"points": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 4
},
{
"x": 2,
"y": 1
},
{
"x": 0,
"y": 4
}
],
"threshold": 3
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.concave_hull_approx",
"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_items | 500 |
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. |