Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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

Printemps des cartes 2024

#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: 1536

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: 1536

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: 1536

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: 1536

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

 

Pied de page des forums

Powered by FluxBB