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 Tue 03 November 2009 13:30

nawak
Participant assidu
Date d'inscription: 11 Sep 2007
Messages: 216

Postgres/postgis requête sql

salut,

Petite question sur une requête sql sous postgres/postgis :

j'ai une entrée dans une table qui possède la géométrie de la france et de la corse : je souhaite n'avoir plus que la france je dessine donc un polygone contourant la france et je fais :

Code:

CREATE TABLE AS
      SELECT intersection(b.the_geom,a.the_geom) as the_geom 
      FROMfrance a,limite b 
      WHERE a.the_geom && b.the_geom;

mais comment puis-je inverser cette selection et n'avoir que les coordonnées de la Corse sans bien sur recréer un polygone contourant la corse...

Merci

Hors ligne

 

#2 Tue 03 November 2009 14:37

Lionel B
Participant actif
Lieu: Macon
Date d'inscription: 5 Sep 2005
Messages: 83

Re: Postgres/postgis requête sql

where not (a.the_geom && b.the_geom)

cordialement

Hors ligne

 

#3 Tue 03 November 2009 14:39

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

Re: Postgres/postgis requête sql

Bonjour,

Quelque chose comme cela :

Code:

CREATE TABLE AS 
    SELECT GeomUnion(a.the_geom) AS the_geom
    FROM france a,limite b
    WHERE !ST_Contains(b.the_geom,a.the_geom);

Par contre je ne sais plus si le symbole "!" fonctionne pour les fonctions SQL-MM dans postgis. Il faudra peut être mettre

Code:

ST_Contains(b.the_geom,a.the_geom)=false

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#4 Tue 03 November 2009 14:42

Lionel B
Participant actif
Lieu: Macon
Date d'inscription: 5 Sep 2005
Messages: 83

Re: Postgres/postgis requête sql

oups, erreur d'interprétaton de ma part.

tu peux faire une différence entre ton premier résultat et les données de départ.

Code:

CREATE TABLE AS
      SELECT difference(c.the_geom,d.the_geom) as the_geom 
      FROM france c,  (SELECT intersection(b.the_geom,a.the_geom) as the_geom 
      FROM france a,limite b WHERE a.the_geom && b.the_geom) as d

Dernière modification par Lionel B (Tue 03 November 2009 14:45)

Hors ligne

 

#5 Tue 03 November 2009 15:26

nawak
Participant assidu
Date d'inscription: 11 Sep 2007
Messages: 216

Re: Postgres/postgis requête sql

yes merci Lionel ta soluce marche..pour yves merci aussi mais ça ne fonctionne pas

Hors ligne

 

#6 Tue 03 November 2009 15:45

Thomas KOCHERT
Participant occasionnel
Lieu: Nancy
Date d'inscription: 7 Nov 2005
Messages: 11
Site web

Re: Postgres/postgis requête sql

Bonjour, pour aller au plus simple, j'aurais fait

SELECT * FROM france INNER JOIN limite ON _st_contains(limite.the_geom,france.the_geom)

et ... ON NOT _st_contains....

pour avoir respectivement la France ou la Corse.

Attention à bien mettre le _ devant l'opérateur st_contains sinon l'analyse se fait sur les rectangles englobants et non sur les géométries.


Thomas Kochert
Responsable SIG DT Lorraine - Office National des Forêts
Une petite carte vaut mieux qu'un long discours... alors... au travail !

Hors ligne

 

#7 Tue 03 November 2009 17:10

vincentp
Participant actif
Lieu: Drôme
Date d'inscription: 18 Jul 2006
Messages: 128
Site web

Re: Postgres/postgis requête sql

Bonjour,
Si tu n'as que la france et la corse dans ton multipolygone, tu peux simplement utiliser

Code:

st_geometryn(the_geom, 2)

pour récupérer la corse si tant est qu'elle est en deuxième.

Si tu as d'autres iles ou polygones dans ton multipoly, je tenterais plutot qu'une intersection ou une différence complexe de faire un dump du multipolygone et de faire le contains des polygones récupérés avec ton rectangle :

Code:

select * from (
  select
    st_dump(the_geom) as the_geom2
  from 
    france
) as t1
, limite as t2
where 
  not st_contains(t2.the_geom, t1.the_geom2)

@thomas : st_contains fait bien le test sur les géométries, mais dans un deuxième temps. Dans un premier temps il utilise les BBox (et leurs indexes), et pour les positifs une vérification est faite sur les géométries.

Hors ligne

 

#8 Fri 06 November 2009 14:38

Christophe Brun
Juste Inscrit !
Lieu: Bois-Colombes
Date d'inscription: 19 Apr 2006
Messages: 6

Re: Postgres/postgis requête sql

Bonjour,

Juste une petite précision à propos de  :

Thomas KOCHERT a écrit:

Bonjour, pour aller au plus simple, j'aurais fait
Attention à bien mettre le _ devant l'opérateur st_contains sinon l'analyse se fait sur les rectangles englobants et non sur les géométries.


Dans les 2 cas l'analyse se fait bien sur les géométries et non sur les bbox comme le fait l'opérateur &&. La subtilité est que avec ST_Contains l'index spatial est utilisé, donc les bbox sont utilisées pour la recherche; avec _St_Contains, l'analyse se passe de l'index.

Bon week-end,

Christophe


PS: oups j'avais pas vu la fin du message de vincentp ! Désolé pour la redite.

Dernière modification par Christophe Brun (Fri 06 November 2009 14:41)

Hors ligne

 

#9 Fri 06 November 2009 16:23

Thomas KOCHERT
Participant occasionnel
Lieu: Nancy
Date d'inscription: 7 Nov 2005
Messages: 11
Site web

Re: Postgres/postgis requête sql

Merci pour cette précision !


Thomas Kochert
Responsable SIG DT Lorraine - Office National des Forêts
Une petite carte vaut mieux qu'un long discours... alors... au travail !

Hors ligne

 

Pied de page des forums

Powered by FluxBB