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?


Surface ou taille égale (c.-à-d. Largeur et hauteur similaires)?
Anthony -GISCOE-

Zone, quelles que soient les proportions.
Adam Matan


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;

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


Pouvez-vous donner plus d'informations sur les algorithmes?
Majid Hojati
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.