Pages: 1
- Sujet précédent - [POSTGIS] requête sql en dehors de l'intervalle [-180,180] - Sujet suivant
#1 Thu 06 February 2014 18:03
- Jean-Marie64
- Participant actif
- Lieu: Pau
- Date d'inscription: 6 Nov 2007
- Messages: 131
[POSTGIS] requête sql en dehors de l'intervalle [-180,180]
Bonjour
nous sommes amenés à faire des requête autour de la limite 180 degrés, comme par exemple dans l'intervalle en longitude [160,200] ;
voici un exemple de requête comptant le nombre de points dans l'intervalle (160 -80,200 80) :
Code:
select count(*) from table where date between '2014-02-06 14:48:41' and '2014-02-06 16:21:11' and coord && st_setsrid('BOX(160 -80,200 80)'::box2d,4326);
le résultat obtenu n'est pas celui attendu ; il est le même que sur l'intervalle [160,180] soit (111 points) , comme si la limite en longitude ne pouvait dépasser 180 degrés
en effet je souhaite que le résultat soit égal au nombre de points comptés sur l'intervalle [160,180] (111) + le nb de points comptés sur l'intervalle [-180,-160] (441) soit au total 552
y-a-t'il moyen d'éviter de faire 2 requêtes de comptage ?
merci d'avance
Jean-Marie
Hors ligne
#2 Fri 07 February 2014 11:23
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [POSTGIS] requête sql en dehors de l'intervalle [-180,180]
Bonjour,
Quel est le type de la geometrie de la table ?
Postgis propose le type GEOGRAPHY, equivalent de GEOMETRY pour les données en coordonnées sphériques.
C'est ce type qu'il faut utiliser pour les requetes que vous voulez faire.
Nicolas
Hors ligne
#3 Mon 10 February 2014 11:36
- Jean-Marie64
- Participant actif
- Lieu: Pau
- Date d'inscription: 6 Nov 2007
- Messages: 131
Re: [POSTGIS] requête sql en dehors de l'intervalle [-180,180]
Bonjour
merci pour votre information
nos coordonnées sont effectivement de type GEOMETRY
sans changer le type de ces coordonnées, est-il possible de faire un cast dans le type GEOGRAPHY
et comment dans l'exemple de ma requête
merci bien
Jean-Marie
Hors ligne
#4 Mon 10 February 2014 12:06
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [POSTGIS] requête sql en dehors de l'intervalle [-180,180]
Bonjour,
Oui, c'est possible en castant la géométrie en géographie dans la requete.
Attention cependant, les index spatiaux, s'ils sont définis sur la géometrie, seront peut etre mal utilisés.
Vous pouvez aussi ajouter une deuxieme colonne a la table, contenant la version GEOGRAPHY de vos objets.
Code:
select count(*) from table where date between '2014-02-06 14:48:41' and '2014-02-06 16:21:11' and coord[b]::geography[/b] && st_setsrid('BOX(160 -80,200 80)'::box2d,4326);
(l'opérateur de cast est "::", ou encore la forme SQL: cast(coord as geography))
Nicolas
Hors ligne
#5 Mon 10 February 2014 14:15
- Jean-Marie64
- Participant actif
- Lieu: Pau
- Date d'inscription: 6 Nov 2007
- Messages: 131
Re: [POSTGIS] requête sql en dehors de l'intervalle [-180,180]
même après avoir apporté la modification que vous suggérez à savoir :
Code:
select count(*) from table where date between '2014-02-06 14:48:41' and '2014-02-06 16:21:11' and coord::geography && st_setsrid('BOX(160 -80,200 80)'::box2d,4326);
j'ai toujours la même erreur :
ERREUR: Coordinate values are out of range [-180 -90, 180 90] for GEOGRAPHY type
ne faut-il pas aussi caster la BOX en geography ?
merci d'avance
Jean-Marie
Hors ligne
#6 Mon 10 February 2014 14:43
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [POSTGIS] requête sql en dehors de l'intervalle [-180,180]
Hmm pardon, j'avais lu un peu vite votre requete:
Les coordonnées géocentriques s'expriment entre -180 et + 180, pas 0 - 360.
Nicolas
Hors ligne
#7 Mon 10 February 2014 16:42
- Jean-Marie64
- Participant actif
- Lieu: Pau
- Date d'inscription: 6 Nov 2007
- Messages: 131
Re: [POSTGIS] requête sql en dehors de l'intervalle [-180,180]
ok, j'ai corrigé l'intervalle mais je constate le même comptage de points que je fasse ma requête sur [160,-160] ou sur [-160,160]
ainsi :
Code:
select count(*) from table where date between '2014-02-08 14:48:41' and '2014-02-08 16:21:11' and coord::geography && st_setsrid('BOX(160 -80,-160 80)::geography'::box2d,4326);
soit 2495 points
donne le même résultat que :
Code:
select count(*) from table where date between '2014-02-08 14:48:41' and '2014-02-08 16:21:11' and coord::geography && st_setsrid('BOX(-160 -80,160 80)::geography'::box2d,4326);
soit 2495 points
or, pour moi, l'intervalle [-160,160] étant plus grand, puisqu'il est la concaténation de [-160,0] et de [0,160], je m'attends à avoir plus de points
ce qui est effectivement le cas dans la base ; je peux le vérifier avec le type geometry (174835 points) :
Code:
select count(*) from ldbgld.localization where date between '2014-02-08 14:48:41' and '2014-02-08 16:21:11' and coord::geometry && st_setsrid('BOX(-160 -80,160 80)::geometry'::box2d,4326);
le problème vient-il de la manière d'utiliser BOX ?
Jean-Marie
Hors ligne
#8 Tue 11 February 2014 13:06
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [POSTGIS] requête sql en dehors de l'intervalle [-180,180]
Bonjour,
En fait, les deux extents sont les memes, du point de vue de postgis:
Ces 2 coordonnées (-160, -80) et (160, 80) peuvent etre jointes de deux manières différentes sur le globe:
par un petit "rectangle" (en fait, la projection d'un rectangle sur le globe, dont les cotés ne sont pas des lignes droites) et un grand "rectangle".
Par convention, Postgis prend le plus petit rectangle pour joindre ces points.
Les points retournés sont donc tjs ceux contenus dans le petit rectangle.
Pour avoir les autres, une methode utilise l'opérateur EXISTS:
Code:
select count(*) from table t1 where NOT EXISTS ( select null from table t2 where t1.id = t2.id and date between '2014-02-08 14:48:41' and '2014-02-08 16:21:11' and coord::geography && st_setsrid('BOX(-160 -80,160 80)::geography'::box2d,4326) );
Nicolas
Hors ligne
#9 Wed 12 February 2014 09:54
- Jean-Marie64
- Participant actif
- Lieu: Pau
- Date d'inscription: 6 Nov 2007
- Messages: 131
Re: [POSTGIS] requête sql en dehors de l'intervalle [-180,180]
Bonjour
merci pour toutes vos explications
après réflexion, on ne devrait pas se trouver dans une configuration où les limites en longitude posent une ambiguïté
car soit on est dans l’intervalle [-180,180] soit on est dans un intervalle dont "l'écart" en longitude est toujours inférieur à 180°
ce qui correspond donc au plus petit intervalle comme le fait postgis en utilisant le type geography
il est prévu que l'on passe le type des coordonnées de geometry à geography
Jean-Marie
Hors ligne
Pages: 1
- Sujet précédent - [POSTGIS] requête sql en dehors de l'intervalle [-180,180] - Sujet suivant