Existe-t-il un moyen pratique de diviser un polygone en n
parties, de taille plus ou moins égale dans PostGIS?
Existe-t-il un moyen pratique de diviser un polygone en n
parties, de taille plus ou moins égale dans PostGIS?
Réponses:
Il s'agit d'un ancien problème sans solution simple. La seule approche que j'ai rencontrée est de faire une fonction que vous donnez un titre et le nombre de pièces et l'ordinateur fasse des essais jusqu'à ce qu'il obtienne des surfaces égales. Il existe une fonction LISP avec celle d'AutoCAD. Dans postgis, cela fonctionne de la même manière, voici un extrait de PostGIS en action de Manning, ce code divise un polygone en deux parties égales:
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;
Une approche pourrait être de diviser complètement le polygone en triangles, chacun avec une zone donnée. Il s'agirait alors d'essayer de regrouper ces triangles (adjacents) en polygones de taille (plus ou moins) de surface / n. Ce serait une sorte de version personnalisée du problème de "somme de sous-ensemble" ou de "sac à dos" (et je ne saurais pas comment commencer avec PostGIS).