banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Thu 13 February 2014 12:22

Jean-Marie64
Participant actif
Lieu: Pau
Date d'inscription: 6 Nov 2007
Messages: 131

[POSTGIS] type geography : performance et choix de l'intervalle

Bonjour

je me permet de revenir sur le sujet abordé précédemment sur les requêtes avec le type geography

En utilisant le type geography et l'opérateur NOT EXIST je vois 3 problèmes :

1-le temps de traitement de la requête avec l'opérateur NOT EXIST qui est plutôt long

2-le choix automatique de l'intervalle d'analyse qui peut être soit le plus petit soit le plus grand
je présume que je dois pouvoir introduire un test dans la requête sql sur l'écart en longitude pour déterminer le bon intervalle
et dons la bonne requête

3-nous avons besoin de la fonction ST_Transform : peux-t'on l'utiliser avec le type geography ?
si ce n'est pas possible, y-a-t'il une autre solution ?

merci beaucoup

Jean-Marie

Hors ligne

 

#2 Thu 13 February 2014 13:41

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: [POSTGIS] type geography : performance et choix de l'intervalle

Bonjour,

En général, la forme EXIST/NOT EXIST est plutot performante pour inclure/exclure des datasets.
Si les données a filtrer sont peut nombreuses, l'opérateur NOT IN () peut également etre efficace.

Si vous rencontrez des pb de performance, ca peut valoir le coup de regarder le plan de la requete, pour voir si les index sont bien utilisés, si la table est bien analysée et nettoyée, etc.
Quelle est la volumétrie des données et quel temps de requete vous obtenez ?

Concernant l'intervalle, il n'y a pas vraiment de choix: postgis construit toujours le plus petit et le coût de cette construction est négligeable: il n'y a donc pas de choix a faire dans la requete.

Oui, st_transform sait traiter des geometry et des geography. Le type geography est tjs de SRID 4326.
Typiquement, apres une recherche spatiale sur la geography, st_transform peut permettre de projeter cette données dans une projection locale.

Nicolas

En ligne

 

#3 Thu 13 February 2014 15:39

Jean-Marie64
Participant actif
Lieu: Pau
Date d'inscription: 6 Nov 2007
Messages: 131

Re: [POSTGIS] type geography : performance et choix de l'intervalle

bonjour

avant d'aller plus loin je m'aperçois que j'ai un réel souci de compréhension

si je considère les requêtes suivantes :

select x(coord),y(coord) from table where date between '2014-02-08 14:00:00' and '2014-02-08 14:00:01' and coord::geography && st_setsrid('BOX(-90 -90,90 90)::geography'::box2d,4326);

select x(coord),y(coord) from table where date between '2014-02-08 14:00:00' and '2014-02-08 14:00:01' and coord::geography && st_setsrid('BOX(0 -90,0 90)::geography'::box2d,4326);

select x(coord),y(coord) from table where date between '2014-02-08 14:00:00' and '2014-02-08 14:00:01' and coord::geography && st_setsrid('BOX(-90 -90,0 90)::geography'::box2d,4326);

et même en réduisant xmin et xmax à 0
select x(coord),y(coord) from table where date between '2014-02-08 14:00:00' and '2014-02-08 14:00:01' and coord::geography && st_setsrid('BOX(0 -90,0 90)::geography'::box2d,4326);

j'ai toujours le même résultat à savoir 50 lignes avec des valeurs en x  qui ne semblent pas contraintes par les bornes xmin etxmax comme par exemple :
      x      |     y     
-------------+------------
  -49.616782 | -28.158047
...
112.294614 |  -3.002758
   37.745654 |  -14.76219
-128.763314 | -25.480079
   15.080735 |   1.323699
...
  -48.793458 | -30.385019
(50 lignes)

si par contre je touche à la latitude le nombre de valeurs change

est-ce dû au cast des coordonnées (de type geometry) dans le type geography

merci bien

jean-Marie

Hors ligne

 

#4 Fri 21 February 2014 16:42

Jean-Marie64
Participant actif
Lieu: Pau
Date d'inscription: 6 Nov 2007
Messages: 131

Re: [POSTGIS] type geography : performance et choix de l'intervalle

Bonjour

à priori, il y a bien un problème aux limites  -90 et +90 en latitude avec le type geography
mais vu que nous n'avons pas de données en dehors de [85S,85N]  et que des requêtes sur [89S,89N] donnent un résultat juste
ce problème est considéré comme résolu

reste le problème crucial qui est spécifier à postgis le bon intervalle en longitude

pour préciser notre besoin nous avons à considérer 2 cas de figure :

1er cas : je veux faire une requête dans l'intervalle [XW,XE] comme par exemple [-180,180] ou [-160,160] ou encore [-20,20],
en signifiant un intervalle dont les valeurs partent de -X et s'incrémentent jusqu'à X en passant par 0
(bref un intervalle tel qu'il est interprété par le type geometry)

dans ce cas, le type geometry convient davantage car l'utilisation du type geography oblige à trouver un mécanisme
qui détermine l'intervalle adéquat (le plus petit ou le plus grand) afin d'adopter le même comportement que le type geometry

2ème cas : je veux faire une requête à la limite 180E alors je dois forcément me baser sur le type geography
mais comme, dans notre cas, l'intervalle à cette limite est petit (1000kmx1000km), il n'y a pas d'ambiguïté
sur le choix du petit ou du grand intervalle

je pensais au départ faire une seule et même requête avec le type geography mais je n'y parviens pas

si quelqu'un a une suggestion, je suis preneur

merci d'avance

Jean-Marie

Hors ligne

 

#5 Fri 21 February 2014 18:09

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: [POSTGIS] type geography : performance et choix de l'intervalle

Bonjour,

En fait, le problème vient de la bbox permettant de choisir les bons points:
a 90° (ou -90°) de latitude, on est au pole, sur un point ou la notion de longitude n'existe plus.
Les coordonnées (-90 -90) et (90 90) (ou toutes leurs combinaisons ayant 90 et -90 de latitude) ne permettent pas de définir un objet avec 4 sommets (polygone), mais juste le méridien (ligne). Ce n'est pas un objet valide pour l'index spatial de Postgis utilisé avec le type geography.

Concernant le problème de recherche, il se ramène à un cas avec le type geography:
vous voulez trouvez tous les objets situés sur une certaine surface. Pour définir cette surface, la distance entre les points, en longitude, doit etre inférieure à 180°, par convention dans Postgis.
Un extent (-20 20) est valide: les deux points seront joints par le plus petit arc sur le globe.
Un extent (-160 160) sera joint par le plus petit arc (40° de longitude) et non par un arc de 320°.

Du coup, pour chercher sur un grand extent (non representable avec une geography), il faut chercher les objets ne se trouvant pas dans le petit extent complémentaire (je devrais faire un schéma... hmm)

Dans votre cas, il faudrait analyser l'extent de recherche et adapter la requete de recherche en fonction de cet extent.
C'est possible avec un fonction pl/pgsql.

Nicolas

En ligne

 

#6 Thu 27 February 2014 16:26

Jean-Marie64
Participant actif
Lieu: Pau
Date d'inscription: 6 Nov 2007
Messages: 131

Re: [POSTGIS] type geography : performance et choix de l'intervalle

Bonjour

merci pour vos explications
je vous tiens au courant concernant l’orientation que nous allons prendre

Jean-Marie

Hors ligne

 

#7 Mon 03 March 2014 11:57

Fritsch
Participant occasionnel
Lieu: Paris
Date d'inscription: 8 Nov 2006
Messages: 32

Re: [POSTGIS] type geography : performance et choix de l'intervalle

Le plus simple ne serait-il pas de couper l'extent en deux : [-160;0] et [0;160], avec un OR entre les deux conditions ?

Hors ligne

 

#8 Wed 05 March 2014 10:17

Jean-Marie64
Participant actif
Lieu: Pau
Date d'inscription: 6 Nov 2007
Messages: 131

Re: [POSTGIS] type geography : performance et choix de l'intervalle

Bonjour

c'est effectivement ce que nous allons tenter tout en conservant le type geometry

Jean-Marie

Hors ligne

 

#9 Wed 05 March 2014 10:42

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: [POSTGIS] type geography : performance et choix de l'intervalle

Bonjour,

Oui effectivement, c'est le plus simple. smile

Du coup ca doit pouvoir s'écrire en sql directement:
Un case sur l'extent de recherche: si largeur > 180 °: découper en deux extents,
sinon, garder l'extent initial et fabriquer un deuxieme extent "vide"

Dans la sous requete, utiliser tjs la meme condition, sur les deux extents générés plus haut:
geog && extent1 OR geog && extent2

Nico

En ligne

 

Pied de page des forums

Powered by FluxBB