PostGIS: diviser un polygone dans un rapport donné

11

Existe-t-il un moyen pratique de diviser un polygone en nparties, de taille plus ou moins égale dans PostGIS?

Adam Matan
la source
Surface ou taille égale (c.-à-d. Largeur et hauteur similaires)?
Anthony -GISCOE-
Zone, quelles que soient les proportions.
Adam Matan
1
article connexe gis.stackexchange.com/questions/5300/…
Kirk Kuykendall
Je suis surpris qu'il n'y ait pas de solution pour cela dans R spatial
Brad Nesom

Réponses:

8

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;
Pablo
la source
2

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

Anthony -GISCOE-
la source
Pouvez-vous donner plus d'informations sur les algorithmes?
Majid Hojati