PostGIS: dividere un poligono in un dato rapporto


11

Esiste un modo conveniente per dividere un poligono in nparti, più o meno uguali in PostGIS?


Area uguale o dimensioni uguali (cioè larghezza e altezza simili)?
Anthony -GISCOE-

Area, indipendentemente dalle proporzioni.
Adam Matan,


Sono sorpreso che non ci sia una soluzione per questo in R spaziale
Brad Nesom il

Risposte:


8

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;

2

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


Potete per favore fornire maggiori informazioni sugli algoritmi?
Majid Hojati,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.