PostGIS: divide un polígono en una proporción dada


11

¿Hay una manera conveniente de dividir un polígono en npartes, más o menos iguales en tamaño en PostGIS?


¿Igual área o igual tamaño (es decir, ancho y alto similares)?
Anthony -GISCOE-

Área, independientemente de las proporciones.
Adam Matan


Estoy sorprendido de que no haya una solución para esto en R espacial
Brad Nesom

Respuestas:


8

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;

2

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).


¿Puede dar más información sobre los algoritmos?
Majid Hojati
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.