pggeodb.nancy.inra.fr/db_cefs - db_cefs on pggeodb.nancy.inra.fr
Previous topic Chapter index Next topic

Function: ps_statut_non_ferme

 

 

Schema

analyse

 

Owner

albenard

 

Descriptions

Cette fonction prend comme argument un objet géométrique normalement de type ST_LineString. Le cas d'usage le plus courant
est un appel depuis la fonction ps_analyse_geom qui tente de fermer un anneau ouvert et s'appuie sur la présente fonction pour
savoir comment s'est passée la fermeture.
La fonction renvoie :
0 : La géométrie passée en paramètre ne respecte pas le type ST_LineString ou bien n'est pas une géométrie fermée.
1 : La géométrie passée en paramètre ne nécessite pas de correction (anneau simple fermé)
2 : La géométrie passée en paramètre présente une intersection qui se corrige avec un simple ajout de polygone ou trou (3 points supplémentaires)
3 : La géométrie passée en paramètre présente une intersection que Postgis corrige d'une façon appelant des vérifications et certainement une intervention.

 

Options

Option

Value

Returns

integer

Language

plpgsql

Parameters

bad_ring public.geometry

 

Definition

CREATE OR REPLACE FUNCTION "analyse".ps_statut_non_ferme (
 bad_ring public.geometry
)
RETURNS integer AS
$span$
DECLARE

-- Analyse comment un anneau fermé sera traité dans le cas d'une éventuelle correction.
-- Valeur de retour :
-- 0 : La géométrie passée en paramètre ne respecte pas le type ST_LineString ou bien n'est pas une géométrie fermée.
-- 1 : La géométrie passée en paramètre ne nécessite pas de correction (anneau simple fermé)
-- 2 :   La géométrie passée en paramètre présente une intersection qui se corrige avec un simple ajout de polygone ou trou (3 points supplémentaires)
-- 3 : La géométrie passée en paramètre présente une intersection que Postgis corrige d'une façon appelant des vérifications et certainement une intervention.

-- constantes;

 c_intersect VARCHAR; -- Chaine retournée par la fonction st_isvalidreason en cas d'intersection
 c_not_closed varchar; -- Chaine retournée par la fonction st_isvalidreason en cas d'anneau non fermé
 c_valide varchar; -- Chaine retournée par la fonction st_isvalidreason en cas de géométrie valide
 -- variables;

 type_geom VARCHAR; -- Variable permettant le stockage du type de la géométrie passée en paramètre
 statut_valid VARCHAR; -- Variable permettant le stockage du statut de validation de la géométrie passée en paramètre
 poly_bad geometry; -- Polygone qui sera éventuellement construit à partir de la géométrie passée en paramètre
 poly_corrige geometry; -- Polygone qui sera issu d'une éventuelle correction de poly_bad
BEGIN
 -- Initialisation des constantes
 C_intersect = 'Ring Self-intersection' ;
 C_not_closed = 'IllegalArgumentException: Points of LinearRing do not form a closed linestring';
 type_geom = st_geometrytype(bad_ring);

 if type_geom = 'ST_LineString'
     then
         -- Revalide la géométrie : normalement l'anneau a été fermé par l'appelant
         if st_isclosed(bad_ring)
          then -- On teste l'intersection du ST_LineString
            if st_isring(bad_ring) -- Aucune intersection ou tangente : l'anneau est correct
                then
                    return
1; -- l'anneau fermé par l'appelant est désormais valide (pas d'intersection suite à cette fermeture)
                   else
                    poly_bad = st_makepolygon(bad_ring);
                       poly_corrige = st_makevalid(poly_bad);
                       --raise notice 'Avant : % geométries - % anneaux - % points', st_numgeometries(poly_bad), st_nrings(poly_bad), st_npoints(poly_bad);
                       --raise notice 'Après : % geométries - % anneaux - % points', st_numgeometries(poly_corrige), st_nrings(poly_corrige), st_npoints(poly_corrige);

                       
                       if ((st_nrings(poly_corrige) - st_nrings(poly_bad))= 1) and ((st_npoints(poly_corrige) - st_npoints(poly_bad))= 3) -- Il n'y a que 3 point supplémentaires, l'anneau ayant déjà été fermé par ajout d'un point par l'appelant
                        then
                            return
2; -- L'anneau fermé par l'appelant présente une intersection ou tangente qui a été traitée simplement (ajout d'un anneau [trou ou polygone]
                           else
                            return
3; -- L'anneau fermé par l'appelant présente une intersection que Postgis traite de manière douteuse (humble avis de l'auteur).
                       end IF;
               end if;
           
           else -- L'anneau n'est pas fermé ce qui constitue une erreur
            return 0; -- Il s'agit d'une erreur d'appel - l'anneau passé ne doit pas être ouvert
         end if;
     else
         return
0; -- Il s'agit d'une erreur d'appel - l'anneau passé ne doit pas être ouvert et doit être de type ST_LineString.
 end if;
 -- raise notice 'objet type % ', type_geom;

EXCEPTION
WHEN
OTHERS THEN
 raise notice
'objet traité : %', st_asewkt(geom);
 raise notice 'Erreur ps_statut_non_ferme : % %', sqlstate, sqlerrm;
END;
$span$
LANGUAGE
'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST
100;

COMMENT ON FUNCTION "analyse".ps_statut_non_ferme(bad_ring public.geometry)
IS 'Cette fonction prend comme argument un objet géométrique normalement de type ST_LineString. Le cas d''usage le plus courant
est un appel depuis la fonction ps_analyse_geom qui tente de fermer un anneau ouvert et s''appuie sur la présente fonction pour
savoir comment s''est passée la fermeture.
La fonction renvoie :
0 : La géométrie passée en paramètre ne respecte pas le type ST_LineString ou bien n''est pas une géométrie fermée.
1 : La géométrie passée en paramètre ne nécessite pas de correction (anneau simple fermé)
2 :   La géométrie passée en paramètre présente une intersection qui se corrige avec un simple ajout de polygone ou trou (3 points supplémentaires)
3 : La géométrie passée en paramètre présente une intersection que Postgis corrige d''une façon appelant des vérifications et certainement une intervention.
'
;

This file was generated with SQL Manager for PostgreSQL (www.pgsqlmanager.com) at 13/03/2014 13:23
Previous topic Chapter index Next topic