Schema
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 |
|
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 |