Esiste un modo conveniente per dividere un poligono in n
parti, più o meno uguali in PostGIS?
Esiste un modo conveniente per dividere un poligono in n
parti, più o meno uguali in PostGIS?
Risposte:
Questo è un vecchio problema senza una soluzione semplice. L'unico approccio che mi sono imbattuto è quello di creare una funzione che dia un'intestazione e il numero di parti e il computer eseguono prove fino a quando non si ottengono aree uguali. Esiste una funzione LISP con quella in AutoCAD. In PostGis funziona allo stesso modo, ecco un estratto di PostGIS in Action from Manning, questo codice divide un poligono in due parti uguali:
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 approccio potrebbe essere quello di dividere completamente il poligono in triangoli, ognuno con una determinata area. Quindi si tratterebbe di provare a raggruppare quei triangoli (adiacenti) in poligoni di dimensioni (più o meno) di area / n. Questa sarebbe una specie di versione personalizzata del problema "somma di sottoinsieme" o "zaino" (e non saprei come iniziare con PostGIS).