#1 Sun 17 February 2013 09:57
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
POSTGIS 2.0 Tester si une géométrie existe
Bonjour,
Avant d'insérer une géométrie ((prenons un multi polygone par exemple) dans une table existante, je voudrais savoir si cette géométrie existe déjà.
Est ce qu'un simple :
Code:
SELECT the_geom FROM schemaname.mytable WHERE ST_Equals(the_geom, geomtoadd);
Va fonctionner (0 ligne si existe pas) ou existe il un truc plus simple, plus rapide?
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#2 Mon 18 February 2013 10:14
- guil31
- Participant actif
- Date d'inscription: 22 Jan 2013
- Messages: 79
Re: POSTGIS 2.0 Tester si une géométrie existe
Ou tout simplement:
Code:
SELECT the_geom FROM schemaname.mytable WHERE the_geom IS NULL
Hors ligne
#3 Mon 18 February 2013 10:31
- damika
- Participant occasionnel
- Lieu: Bidart
- Date d'inscription: 3 Aug 2010
- Messages: 33
Re: POSTGIS 2.0 Tester si une géométrie existe
Bonjour,
Si le but est d'insérer une géométrie différente si elle existe déjà, on peut passer par un CASE:
Code:
SELECT CASE WHEN ST_Equals(geomtoadd, all_geom.the_geom)=FALSE THEN geomtoadd ELSE autre_geometrie END FROM (SELECT the_geom FROM schemaname.mytable ) AS all_geom
Sinon je ne vois pas plus simple
Hors ligne
#4 Mon 18 February 2013 10:32
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: POSTGIS 2.0 Tester si une géométrie existe
Bonjour,
Guil31, il ne s'agit pas de savoir si la géométrie n'existe pas au sens où elle est nulle mais de savoir si la table contient déjà une géométrie équivalente.
Une sorte de INSERT INTO IF NOT EXISTS
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#5 Mon 18 February 2013 10:49
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: POSTGIS 2.0 Tester si une géométrie existe
Bonjour,
Merci Damika c'est sympa, mais comme je gère la chose depuis le code le CASE ne m'est pas utile.
Je tente un double post sur la liste US.
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#6 Mon 18 February 2013 11:00
Re: POSTGIS 2.0 Tester si une géométrie existe
Il s'agit d'un cas ressemblant très fort à un UPSERT (update si existe, insert sinon). La meilleure manière de faire cela dans les postgresql récents est celle ci :
http://stackoverflow.com/questions/1109 … 91#8702291
Par contre un petit warning : suivant votre besoin fonctionnel, il faut bien faire attention à ce qu'on appelle deux géométries égales. L'égalité est une chose un peu subjective dès qu'on sort des points.
Ce qu'il ne faut pas faire, c'est comparer des géométries avec l'opérateur = car il compare les bounding boxes et pas les géométries.
Ensuite la fonction st_equals compare les géométries elles même et est souvent la solution recherchée.
Mais elle n'est en aucun cas une comparaison stricte, et ignore le sens des vertex par exemple. Pour cela il y a une fonction st_orderingequals. On peut aussi comparer le retour de st_asbinary pour une égalité binaire parfaite.
Ça ne suffit pas toujours car définir l'égalité sur des polygones peut etre complexe, et dépendre de plusieurs critères, par exemple :
* la tolérance sur les coordonnées
* la gestion du sens de définition des enveloppes
* la présence de points additionnels dans la définition de la géométrie mais qui ne changent pas la forme
On est alors dans la recherche de similarité plutôt que d'égalité. La fonction de calcul de distance st_hausdorffdistance peut être utile à cet effet. Parfois il faut faire ses propres définitions d'égalité.
Et dans de telles requêtes, ne pas oublier d'ajouter un «AND geom1 && geom 2» à la comparaison, pour activer l'utilisation de l'index.
Dernière modification par vincentp (Mon 18 February 2013 11:01)
Hors ligne
#7 Mon 18 February 2013 11:22
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: POSTGIS 2.0 Tester si une géométrie existe
Bonjour,
Merci Vincentp pour cette réponse précise qui anticipe qui plus est ma seconde question qui aurait portée non plus sur une géométrie de type polygone, mais sur une couche topologique.
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne