PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 29/06/2011 10:24:16

Routchino
Membre

[Postgis] Construction de requête SQL

Bonjour,

Actuellement en stage au Conseil Régional Aquitaine et plus particulièrement au sein de la cellule THD (Très Haut Débit), je travail sur des données télécom. C’est dans ce cadre que j’essaye de créer une base de données Postgis, en lien avec Qgis, avec pour objectif d’extraire des données directement depuis la base via des requêtes.
Etant néophyte dans ce domaine, je fais appel à vous car j’ai plusieurs problèmes que je n’arrive pas à solutionner malgré mes lectures sur le langage SQL…

J’ai donc créé une base PostGis et y ai ajouté une centaine de tables de formats différents (shp, .txt, .csv).


Mes questions :
-    j’ai dans la plupart de mes tables .txt deux colonnes avec des coordonnées X, Y. Dois-je faire une opération particulière pour ajouter une colonne the_geom comme c’est le cas pour les shapes (cela s’est fait automatiquement pour ces tables) ?

-    Dois-je attribuer la même projection à toutes mes tables ?


L’objectif de cette base est d’extraire des données à une échelle infra-départementale (communauté de commune, communauté d’agglo, ou communauté urbaine), sachant que dans les tables les informations ne sont localisées qu’à l’échelle de la commune (code INSEE). En effet une communauté de commune va faire appel à nous afin que nous leur fournissions les informations à l’échelle de leur territoire.

L’idéal serait donc de réaliser un ensemble de requête basé sur un territoire infra-départementale (communauté de commune…) afin de récupérer des données qui se trouvent à l’échelle de la commune dans la base.

J’ai donc ajouté une table contenant les correspondances entre code INSEE et communauté de commune d’appartenance.
Je pensais donc fonctionner de deux manières :
-    pour les tables qui ne contiennent pas de coordonnées X,Y il faut donc que je fasse une requête attributaire, je voulais donc rechercher les différents codes INSEE qui m’intéresse au sein de toute la base pour rapatrié toutes les infos
Ex :
SELECT *
FROM wifi_dep_24, wifi_dep_33……………
WHERE code_insee = '24001'

Problème, la requête ne peut pas se faire car le champ code_insee apparait dans plusieurs tables. Comment puis-je donc réaliser cette requête ?
Serait-il possible de réaliser la requête dans l’autre sens, à savoir rechercher une communauté de commune dans la table de correspondance INSEE-communauté de commune, trouver les code INSEE associé et ensuite réaliser la requête de ces codes INSEE sur toute la table.

-    pour les table ayant une colonne the_geom, pensez-vous qu’il est possible de faire une requête spatiale ou géométrique, toujours par rapport à la table de correspondance code INSEE-communauté de commune ? Si oui je n’ai aucune idée sur la façon de procéder donc je suis preneur de quelques pistes.


Merci d’avance pour votre aide qui me sera précieuse.

Hors ligne

#2 29/06/2011 15:27:09

vincentp
Membre

Re : [Postgis] Construction de requête SQL

Salut,
Quelques réponses ci-dessous.

Routchino a écrit :

Bonjour,
Mes questions :
-    j’ai dans la plupart de mes tables .txt deux colonnes avec des coordonnées X, Y. Dois-je faire une opération particulière pour ajouter une colonne the_geom comme c’est le cas pour les shapes (cela s’est fait automatiquement pour ces tables) ?

Oui il faut effectivement ajouter une colonne de géométrie. Il faut la créer avec la fonction "addgeometrycolumn", puis faire un update pour la remplir avec les x, y avec la fonction "st_makepoint". Cette dernière prend des float en argument, il faudra peut etre faire une conversion si les x,y sont sous forme de chaine de caractère. Dans ce cas un "st_makepoint(x::double precision, y::double precision)". Mettre le tout dans un "st_setsrid" pour spécifier le système de projection.

Routchino a écrit :

-    Dois-je attribuer la même projection à toutes mes tables ?

Dans l'absolu non.

Dans la pratique la réponse est plutôt oui. La plupart des fonctions PostGIS ne peuvent travaillent sur des géométries que si elles sont dans le même système de projection. Reprojeter coute assez cher, donc il vaut mieux le faire une fois pour toute. On peut aussi avoir deux colonnes dans une table avec la meme geometrie dans deux systèmes différents.
Voir : st_transform, addgeometrycolumn

Routchino a écrit :

Ex :
SELECT *
FROM wifi_dep_24, wifi_dep_33……………
WHERE code_insee = '24001'

Problème, la requête ne peut pas se faire car le champ code_insee apparait dans plusieurs tables. Comment puis-je donc réaliser cette requête ?

Là il faut lire la doc SQL.

select t1.*, t2.code_insee as code_insee_co2 from  wifi_dep_24 as t1, wifi_dep_33 as t2 ... WHERE code_insee = '24001'

Mais il faut revoir les jointures aussi, je doute que le cross join soit la vraie requete.

Routchino a écrit :

Serait-il possible de réaliser la requête dans l’autre sens, à savoir rechercher une communauté de commune dans la table de correspondance INSEE-communauté de commune, trouver les code INSEE associé et ensuite réaliser la requête de ces codes INSEE sur toute la table.

Oui c'est possible... Faut faire du SQL, peut etre une requete imbriquée, mais probablement que ce ne serait pas la peine.

Routchino a écrit :

-    pour les table ayant une colonne the_geom, pensez-vous qu’il est possible de faire une requête spatiale ou géométrique, toujours par rapport à la table de correspondance code INSEE-communauté de commune ? Si oui je n’ai aucune idée sur la façon de procéder donc je suis preneur de quelques pistes.

C'est possible, mais pour de la sélection de zones, mieux vaut se baser sur les données attributaires, ça règle un paquet de soucis.
Pour le géométrique il faut faire une jointure spatiale : faire des join on mafonctionspatiale(geom1, geom2)

Sinon voir : st_intersects, st_contains, st_dwithin …

Bon courage,
Vincent

Dernière modification par vincentp (29/06/2011 18:21:19)

Hors ligne

#3 12/07/2011 13:28:59

Routchino
Membre

Re : [Postgis] Construction de requête SQL

Désolé pour cette réponse tardive mais j'étais occupé sur une autre mission et celle-ci  été mise en suspend.

J'ai donc ajouté une colonne the_geom à toute mes tables et je les ai update avec cette formule :

UPDATE ma_table set the_geom = ST_GeomFromText('POINT('||_long||' '|| _lat||')',4326);


Cela a fonctionné pour la majorité des tables mais j'ai deux types d'erreur pour d'autres :


Soit :

- ERREUR:  parse error - invalid geometry

HINT:  "POINT(" <-- parse error at position 6 within geometry

********** Erreur **********

ERREUR: parse error - invalid geometry

État SQL :XX000


Soit :

- ERREUR:  Invalid OGC WKT (too short)

********** Erreur **********

ERREUR: Invalid OGC WKT (too short)

État SQL :XX000


Je ne comprend pas à quoi sont dues ces erreurs car les tables .txt sont au même format et de structures similaires.


Sinon concernant la requête elle-même je suis parvenu à la réaliser via une jointure entre ma table insee_commune et les autres tables avec ce code :


SELECT* FROM aquit_communes_2011

INNER JOIN optique_pro_dep24 ON(optique_pro_dep24.insee=aquit_communes_2011.num_com)

WHERE aquit_communes_2011.pays_nom='Le Périgord Vert';


Etant donné que j'ai a chaque fois 5 tables de structures identiques (une par département de la région aquitaine), comment pourrais-je faire pour fusionner ces 5 tables et ainsi réaliser une seule requête sur cette "super table" plutôt que 5 requêtes sur 5 tables comme je le fait actuellement ? quelle fonction dois-je utiliser.


Merci

Hors ligne

#4 18/08/2011 15:40:59

Routchino
Membre

Re : [Postgis] Construction de requête SQL

Je fais de nouveau appel à vous

Voila la fonction que je cherche à effectuer :

   

CREATE FUNCTION "extractionsss" (varchar) RETURNS varchar AS
'
    DECLARE
        cc varchar;
    tmp varchar;


      BEGIN
cc := $1;
tmp := ''aquitaine_liens_nra_'' || cc;

CREATE TABLE tmp AS
SELECT * FROM aquit_communes_2011
INNER JOIN aquitaine_liens_nra ON (aquitaine_liens_nra.insee_nra_a=aquit_communes_2011.num_com)
WHERE aquit_communes_2011.ca_cu_nom=cc;


return tmp ;

      END;
    '
LANGUAGE 'plpgsql';
SELECT extractionsss('CA Le Marsan');


Le problème c'est que la nouvelle table créée porte le nom "tmp" et non ce qu'il y a à l'intérieur de cette variable à savoir


aquitaine_liens_nra_'' || cc

Hors ligne

#5 18/08/2011 16:42:06

gleu
Administrateur

Re : [Postgis] Construction de requête SQL

Merci de créer un nouveau thread pour une nouvelle question.

On ne peut pas utiliser des variables pour les noms d'objets (comme les tables dans votre cas mais aussi les colonnes. Vous devez utiliser une requête dynamique. Tout est expliqué ici : http://docs.postgresql.fr/9.0/plpgsql-s … cuting-dyn


Guillaume.

Hors ligne

Pied de page des forums