¿Hay una manera conveniente de dividir un polígono en n
partes, más o menos iguales en tamaño en PostGIS?
¿Hay una manera conveniente de dividir un polígono en n
partes, más o menos iguales en tamaño en PostGIS?
Respuestas:
Este es un viejo problema sin una solución simple. El único enfoque que encontré es hacer una función que le dé un encabezado y el número de partes y la computadora realice pruebas hasta que obtenga áreas iguales. Hay una función LISP con eso en AutoCAD. En postgis funciona igual, aquí hay un extracto de PostGIS en acción de Manning, este código divide un polígono en dos partes iguales:
WITH RECURSIVE
ref(the_geom, env) AS (
SELECT the_geom,
ST_Envelope(the_geom) As env,
ST_Area(The_geom)/2 As targ_area,
1000 As nit
FROM us.states
WHERE state = 'Idaho'
),
T(n,overlap) AS (
VALUES (CAST(0 As Float),CAST(0 As Float))
UNION ALL
SELECT n + nit, ST_Area(ST_Intersection(the_geom, ST_Translate(env, n+nit, 0)))
FROM T CROSS JOIN ref
WHERE ST_Area(ST_Intersection(the_geom, ST_Translate(env, n+nit, 0)))> ref.targ_area
) ,
bi(n) AS
(SELECT n
FROM T
ORDER BY n DESC LIMIT 1)
SELECT bi.n,
ST_Difference(the_geom, ST_Translate(ref.env, n,0)) As geom_part1,
ST_Intersection(the_geom, ST_Translate(ref.env, n,0)) As geom_part2
FROM bi CROSS JOIN ref;
Un enfoque podría ser dividir el polígono completamente en triángulos, cada uno con un área determinada. Entonces se trataría de agrupar esos triángulos (adyacentes) de nuevo en polígonos de área de tamaño (más o menos) / n. Esta sería una especie de versión personalizada del problema de "suma de subconjuntos" o "mochila" (y no sabría cómo comenzar con eso con PostGIS).