PostGIS: divide um polígono em uma determinada proporção


11

Existe uma maneira conveniente de dividir um polígono em npartes, mais ou menos iguais em tamanho em PostGIS?


Área igual ou tamanho igual (ou seja, largura e altura semelhantes)?
Anthony -GISCOE-

Área, independentemente das proporções.
Adam Matan


Estou surpreso que não há uma solução para isso em R espacial
Brad Nesom

Respostas:


8

Este é um problema antigo, sem solução simples. A única abordagem pela qual me deparei é fazer uma função que você indica e o número de peças e o computador fazem testes até obter áreas iguais. Existe uma função LISP com isso no AutoCAD. No postgis, ele funciona da mesma maneira, aqui está um trecho do PostGIS in Action de Manning, esse código divide um polígono em duas partes iguais:

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

Uma abordagem pode ser dividir o polígono completamente em triângulos, cada um com uma determinada área. Seria uma questão de tentar agrupar esses triângulos (adjacentes) de volta em polígonos de área (mais ou menos) de tamanho / n. Isso seria uma espécie de versão personalizada do problema de "subconjunto de soma" ou "mochila" (e eu não saberia como começar com o PostGIS).


Você pode fornecer mais informações sobre os algoritmos?
Majid Hojati
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.