Message posté par : Papiroux77
----------------------------------------
Bonjour,
Malheureusement, postgreSQL ne dispose pas d'une fonction intégrée spécifique pour
trouver le carré ou le rectangle inscrit maximal dans un polygone.
Après quelques recherches, vous pouvez quand même y parvenir en bidouillant un peu...
Voici ce que j'ai trouvé et que vous pouvez tester de votre côté, sans garanti que ca
marche de ma part.
Une proposition à tester est donc l'utilisation d'une combinaison de fonctions
existantes et un peu de manipulation de la géométrie.
D'abord, trouver le rectangle minimum tournant qui englobe le polygone. Ce rectangle
représente l'ajustement le plus serré autour du polygone, compte tenu de son
orientation. Vous pouvez utiliser la fonction ST_MinimumBoundingCircle:
SELECT
ST_MinimumBoundingCircle(geom) AS MinimumBoundingCircle
FROM
ateliers.uf_division_parcellaire_residentielles AS t1(geom3);
Cela vous donnera un cercle qui représente le MBR. Vous pouvez extraire le centre et le
rayon du cercle pour définir le MBR.. sauf que ce dernier ne pas être aligné avec les axes
du polygone, ce qui entraîne un carré ou un rectangle non optimal. Pour résoudre ce
problème, vous devez aligner le rectangle avec les axes principaux du polygone. Vous
pouvez utiliser la fonction ST_PrincipalAxis.
SELECT
ST_PrincipalAxis(geom) AS PrincipalAxes
FROM
ateliers.uf_division_parcellaire_residentielles AS t1(geom3);
Cela vous donnera un segment de ligne représentant l'orientation principale du
polygone. Avec le MBR et les axes principaux, vous pouvez calculer le carré ou le
rectangle maximal qui s'inscrit dans le polygone, aligné avec ses axes. Pour cela, il
faut:
a) Trouver la largeur et la hauteur :
- Utilisez la fonction ST_LineLength pour trouver la longueur du segment de ligne
représentant l'axe principal. Ce sera la largeur ou la hauteur maximale du rectangle.
- Divisez le rayon du MBR par la racine carrée de 2 (puisque le MBR est un cercle inscrit
dans un carré). Cela vous donnera la hauteur ou la largeur approximative.
- Prenez le minimum des deux valeurs calculées ci-dessus pour vous assurer que le carré ou
le rectangle s'inscrit entièrement dans le polygone.
b) Créer le carré/rectangle :
- Utilisez le centroïde du polygone (qui peut être extrait du MBR) comme centre du carré
ou du rectangle.
- Utilisez la largeur et la hauteur calculées pour créer un point représentant l'autre
coin du rectangle.
- Construisez le carré ou le rectangle en utilisant les deux points (centre et coin).
Maintenant, vous pouvez combiner ces étapes en une seule requête pour trouver le carré ou
le rectangle inscrit maximal pour chaque polygone et visualiser les résultats:
WITH inscribed_square AS (
SELECT
t1.geom3,
ST_MinimumBoundingCircle(t1.geom3) AS MinimumBoundingCircle,
ST_PrincipalAxis(t1.geom3) AS PrincipalAxes,
CASE
WHEN ST_Length(ST_LineLength(pa.line)) >= 2 * ST_Radius(mbc.circle) THEN
ST_MakePolygon(
ST_MakePoint(mbc.centerx - (ST_Length(pa.line) / SQRT(2)), mbc.centery -
(ST_Length(pa.line) / SQRT(2))),
ST_MakePoint(mbc.centerx + (ST_Length(pa.line) / SQRT(2)), mbc.centery -
(ST_Length(pa.line) / SQRT(2))),
ST_MakePoint(mbc.centerx + (ST_Length(pa.line) / SQRT(2)), mbc.centery +
(ST_Length(pa.line) / SQRT(2))),
ST_MakePoint(mbc.centerx - (ST_Length(pa.line) / SQRT(2)), mbc.centery +
(ST_Length(pa.line) / SQRT(2)))
)
ELSE
ST_MakePolygon(
ST_MakePoint(mbc.centerx - (ST_Radius(mbc.circle) / SQRT(2)), mbc.centery -
(ST_Radius(mbc.circle) / SQRT(2))),
ST_
Bonne chance.
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=367539#p367539
Pour y répondre : geobd(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net