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 !.
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#1 ven. 02 février 2018 18:58

image95
Membre
Date d'inscription: 6 sept. 2014
Messages: 78

Postgis/qgis : creation de couche virtuelle ?

Bonjour,

J'essaye de creer une couche virtuelle depuis l'interface qgis "creer une couche virtuelle". Voici ma requete :

Code:

select make_line(make_point(entrants.x_resi,entrants.y_resi),make_point(entrants.x_tr,entrants.y_tr))as geometry,sum(entrants.ipondi) as sumipondi, entrants.codgeo_res as codgeo_resi, entrants.codgeo_tra as codgeo_tra

from entrants
group by entrants.codgeo_resi,entrants.codgeo_tra

Mais j'ai ce message d'erreur : voir l image en pj




Avez vous une idée? Merci

Dernière modification par image95 (ven. 02 février 2018 18:59)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#2 ven. 02 février 2018 19:47

p.jeremie
Membre
Lieu: Lyon
Date d'inscription: 10 sept. 2017
Messages: 16

Re: Postgis/qgis : creation de couche virtuelle ?

Bonjour,

Une piste avec la même erreur : https://www.sigterritoires.fr/index.php … irtuelles/
Je n'ai pas vérifié dans le détail si le bug indiqué dans le lien correspond à ta requête. A creuser donc.

Dernière modification par p.jeremie (ven. 02 février 2018 19:48)

Hors ligne

 

#3 ven. 02 février 2018 20:28

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 juil. 2010
Messages: 599

Re: Postgis/qgis : creation de couche virtuelle ?

Bonjour,

avez vous vérifier que la requête fonctionne directement avec postgis ?
J'ai peur qu'elle ne fonctionne pas puisque que vous utilisez des colonnes
dans votre clause SELECT qui ne sont pas listées dans votre clause GROUP BY,
ce qui est interdit je crois par le standard SQL mais tolérés sur certains SGBD, comme MySQL,
il me semble, mais pas PostgreSQL.

Dernière modification par tumasgiu (ven. 02 février 2018 20:28)

Hors ligne

 

#4 sam. 03 février 2018 10:45

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 1059

Re: Postgis/qgis : creation de couche virtuelle ?

Bonjour,

Avec postgis, les fonctions make_line, make_point n'existent pas:
st_makePoint, st_makeLine, etc..

Nicolas

Hors ligne

 

#5 sam. 03 février 2018 12:18

image95
Membre
Date d'inscription: 6 sept. 2014
Messages: 78

Re: Postgis/qgis : creation de couche virtuelle ?

Merci bien de vouloir m'aider, je suis vraiment embarassé. Je viens de refaire un test :

Code:

select st_makeline(st_makepoint(entrants_only.x_resi,entrants_only.y_resi),st_makepoint(entrants_only.x_tr,entrants_only.y_tr))as geometry,sum(entrants_only.ipondi) as sumipondi, entrants_only.codgeo_res as codgeo_res, entrants.codgeo_tr as codgeo_tr

from entrants_only
group by entrants_only.codgeo_res,entrants_only.codgeo_tr

Mais j'ai ce message d'erreur (cf piece jointe)

Sinon, j'ai testé celà :

Code:

SELECT

st_union(entrants_only.geom) as geometry,

entrants_only.codgeo_res as codgeo_res,

entrants_only.libgeo_res as libgeo_res,

sum(entrants_only.ipondi) as ipondi

FROM  entrants_only
GROUP BY entrants_only.codgeo_res

Mais j'ai ce message d'erreur :

Code:

query preparation error on PRAGMA table_info(_tview): nno such column entrants_only.geom

tumasgiu, si je comprends bien, vous me conseiller de mettre tous mes champs presents dans le select dans le group by également ?Mais celà signifie qu'il va grouper selon plusieurs champs? Il n'y a pas moyen de faire un group by sur un seul champ?

Dernière modification par image95 (sam. 03 février 2018 12:33)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#6 sam. 03 février 2018 13:08

image95
Membre
Date d'inscription: 6 sept. 2014
Messages: 78

Re: Postgis/qgis : creation de couche virtuelle ?

Il faut peut etre que je précise mon objectif. En fait, il me faut faire une carte des migrations professionnelles (carte de flux). J'ai récupéré une BD insee sur ma zone d'intéret (28 communes).
J'ai importé cette table dans postgres. 1 enregistrement = 1 individu.
Ma table se compose de plusieurs champs :
id unique
codgeo_res: identifiant de la commune de residence
x_resi: longitude de la commune de residence
y_resi : latitude de la commune de residence
codgeo_tr: identifiant de la commune de travail
x_travail: longitude de la commune de travail
y_travail :latitude de la commune de travail
codgeo_tr : identifiant de la commune de travail
ipondi : poids de l'individu (il s'agit d'une valeur ponderation affectée à chaque individu)
geom : geometrie de la commune de residence


L'idée serait donc de pouvoir generer une table pour laquelle 1 enregistrement correspondrait à un flux (commune A vers  commune B).
Il me faut donc generer les geometries utiles (ponctuels + fleches lineaires. Je dois  faire un SUM sur le champ ipondi et faire un group by sur le champ codgeo_residence...

J'espère etre clair. Si vous pensez pouvoir m'aider afin que je puisse traduire cet objectif en language sql fonctionnel...ce serait super...un grand merci .

Dernière modification par image95 (sam. 03 février 2018 13:23)

Hors ligne

 

#7 sam. 03 février 2018 17:35

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 1059

Re: Postgis/qgis : creation de couche virtuelle ?

Bonsoir,

Vous devriez d'abord créer une couche sous postgres et la charger dans QGIS, plutot que de créer une couche virtuelle sur une requete que vous ne maitrisez pas.

Est-ce que la requete marche sous postgis et crée bien une table ?

create testtable as select ...

Vous avez un échantillon des données à partager ?

Nicolas

Hors ligne

 

#8 sam. 03 février 2018 19:08

image95
Membre
Date d'inscription: 6 sept. 2014
Messages: 78

Re: Postgis/qgis : creation de couche virtuelle ?

Merci à tous pour vos messages. Alors, je viens de lancer la requete dans pgadmin, apres avoir fait un cast STRING vers BIGINTnon seulement sur mes XY residence mais egalement pour les XY travail. Pour la premiere fois cette requete fonctionne.
PAr contre, comme le disait tumasgiu, cette requete fonctionne à condition que j'indique dans mon group by tous les champs presents dans mon select...mais le fait de faire celà modifir totalement le resultat en sortie non? Car moi je voulais faire un group by sur le codgeo de la residence, pas sur tous les champs !
Voici en pj, le resultat de ma requete, j'ai chargé la table temporaire créée sous qgis...euh bon, on voit bien qu il a créé la couche LIGNE et ca  semble ok pour les points residence...mais par contre les points travail semble totalement dans les choux...
Oui, bonne idée, je peux vous partager une extraction de mon fichier.

Si vouos pensez pouvoir m'eclairer? on avance quand meme...

Merci beaucoup pour votre aide.

Dernière modification par image95 (sam. 03 février 2018 19:13)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#9 sam. 03 février 2018 19:24

image95
Membre
Date d'inscription: 6 sept. 2014
Messages: 78

Re: Postgis/qgis : creation de couche virtuelle ?

J'ai resolu le probleme de geometrie aberante, mon cast etait pas bon...
JE dépose une capture d'ecran en pj. Mon lineraire est bien créé.
Pour moi, il reste un probleme, celle du group by...le fait que je sois obligé de faire un group by sur toous mes champs ne me permet pas d'avoir le resultat attendu...comment faire pour faire un group by sur un seul champ?

Voici donc ma requete actuelle :

Code:

create table temp as select st_makeline(st_makepoint(entrants_v2.x_resi,entrants_v2.y_resi),st_makepoint(entrants_v2.x_tr,entrants_v2.y_tr))as geometry,sum(entrants_v2.ipondi) as sumipondi, entrants_v2.codgeo_res as codgeo_res, entrants_v2.codgeo_tr as codgeo_tr

from entrants_v2
group by entrants_v2.codgeo_res,entrants_v2.x_resi,entrants_v2.y_resi,entrants_v2.x_tr,entrants_v2.y_tr,entrants_v2.ipondi,entrants_v2.codgeo_tr

Je depose la donnée shapefile.Ainsi qu'une capture d'ecran de qgis montrant la layer postgis. Si une personne pouvait tester? Ce serait tres sympa. Merci

Dernière modification par image95 (sam. 03 février 2018 21:02)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#10 sam. 03 février 2018 21:36

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 1059

Re: Postgis/qgis : creation de couche virtuelle ?

Bonsoir,

Revoyez la doc sur le GROUP BY: vous comprendrez pourquoi vous ne pouvez pas regrouper sur tous les champs:
Les champs qui ne sont pas dans le clause GROUP doivent etre utilisées dans des fonction agrégées, c'est a dire faisant un regroupement pour les valeurs des colonnes.

Si vous voulez garder toutes les valeurs pour une colonne non présente dans un GROUP, vous pouvez utiliser la fonction agrégée array_agg(col), qui produira un tableau contenant les valeurs pour la colonne "col".

Nicolas

Hors ligne

 

#11 sam. 03 février 2018 22:03

image95
Membre
Date d'inscription: 6 sept. 2014
Messages: 78

Re: Postgis/qgis : creation de couche virtuelle ?

J'ai un peu l'impression de m'etre lancé dans qqchose de bien compliqué. Peut etre que des plugins qgis existants proposent de faire la meme chose, tout du moins pour la partie generation du layer lineaire à partir de couples de coordonnées.

Hors ligne

 

#12 sam. 03 février 2018 22:57

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 1059

Re: Postgis/qgis : creation de couche virtuelle ?

Bonsoir,

Si je comprends bien, vous voulez représenter les flux de transports de ville a ville a partir de trajets d'individus.

On peut commencer par créer ces trajets pour chaque individu:

Code:

select e.gid, e.id, codgeo_res, libgeo_res,
  codgeo_tr, libgeo_tr, ipondi,
  st_makeline(st_makepoint(e.x_resi, e.y_resi),
              st_makepoint(e.x_tr, e.y_tr)) AS geom
from entrants e;

Ici, pas besoin de group by, on veut juste une nouvelle geom pour la table, avec les points de départ/arrivée des trajets.

Ensuite, pour "cumuler" ces trajets par ville et avoir une idée du poids, il doit y avoir pleins de méthodes différentes, selon que vous souhaitiez une représentation graphique, ou des stats, ou autre chose.

On peut par exemple "cumuler" les trajets identiques et les compter, pour un couple de villes donné. Ca permet d'avoir un poids plus important si un trajet est fait plus souvent (j'imagine que c'est ce que permet de calculer ipondi).

En faisait l'union des géométries linestring des trajets par couple de villes, on "elimine" les trajets identiques en les fusionnant, tout en gardant le compte du nombre de trajet (et somme ipondi)

On a alors tous les trajets entre villes avec des critères pour représenter différemment les trajets :

Code:

create table entrants_res as
with tmp as (
  select e.gid, e.id, codgeo_res, libgeo_res,
  codgeo_tr, libgeo_tr, ipondi,
  st_setSRID(st_makeline(st_makepoint(e.x_resi, e.y_resi),
              st_makepoint(e.x_tr, e.y_tr)), 2154) AS geom
  from entrants e
) SELECT codgeo_res, libgeo_res, codgeo_tr, libgeo_tr, sum(ipondi) as sumipondi,
  sum(ipondi)/1000 as linewidth,
  count(*) as num_tr, st_union(geom)::geometry(linestring, 2154) as geom
  FROM tmp
group by codgeo_res, libgeo_res, codgeo_tr, libgeo_tr;

Un exemple de représentation dans QGIS en PJ, avec largeur de la ligne issue du champ calculé "linewidth":
plus la ligne est large, plus ce trajet a été parcouru.

Nicolas

Nicolas


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#13 sam. 03 février 2018 22:58

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 1059

Re: Postgis/qgis : creation de couche virtuelle ?

image95 a écrit:

J'ai un peu l'impression de m'etre lancé dans qqchose de bien compliqué. Peut etre que des plugins qgis existants proposent de faire la meme chose, tout du moins pour la partie generation du layer lineaire à partir de couples de coordonnées.


Non, PostGIS est parfait pour ca ! wink

Hors ligne

 

#14 sam. 03 février 2018 23:17

image95
Membre
Date d'inscription: 6 sept. 2014
Messages: 78

Re: Postgis/qgis : creation de couche virtuelle ?

Cher Nicolas, je ne sais pas comment vous remercier. En fait, de mon coté, j'avais également réfléchi au st_union. Voilà ce que j'avais trouvé :

Code:

create table temp3 as select st_union(st_makeline(st_makepoint(entrants_v2.x_resi,entrants_v2.y_resi),st_makepoint(entrants_v2.x_tr,entrants_v2.y_tr))) as geometry,sum(entrants_v2.ipondi) as sumipondi, 
entrants_v2.codgeo_res as codgeo_res, entrants_v2.codgeo_tr as codgeo_tr

from entrants_v2
group by entrants_v2.codgeo_res, entrants_v2.codgeo_tr

voici une petite SS. Notre resultat semble similaire.Votre zone est plus restreinte car je vous avais transmis qu'une petite selection. Vous avez trouvé un bon style, en jouant à la fois sur la taille et la couleur.

Mais là, dans l'etat actuel des choses, la carte permet d'apprehender l'intensité du flux, mais pas le sens. Il y aurait il un moyen d orienter le flux (commune A vers B. Commune P vers F)...

De plus, Il s'agissait des flux entrants uniquement. Maintenant, j'imagine qu'il faut procéder de la meme facon pour les flux sortants? Je possède la table SORTANTS egalement.
Il doit y avoir moyen de faire les traitements entrants/sortants en une seule étape...en tout cas, je trouve cet exercice passionnant.

Dernière modification par image95 (sam. 03 février 2018 23:21)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#15 sam. 03 février 2018 23:32

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 1059

Re: Postgis/qgis : creation de couche virtuelle ?

wink

Avec QGIS et sa représentation avancée, on peut jouer directement sur les trajets et leur nombre:
avec le feature blending mode, la couleur d'une ligne varie en fonction du nombre de lignes et du filtre choisi:

Ici, addition avec du blur sur les lignes. Ca fait un peu "carte de chaleur" des trajets.

(on doit pouvoir faire bcp mieux, mais je ne connais pas bien QGIS)

Nico


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#16 sam. 03 février 2018 23:35

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 1059

Re: Postgis/qgis : creation de couche virtuelle ?

Oui, on peut visualiser le sens: qgis permet de dessiner des fleches.

Un bel exemple de flux avec qgis: https://anitagraser.com/2016/12/18/deta … flow-maps/

Oui, il est possible de faire en une etape. On peut quasiment tout faire en une étape en SQL, mais souvent, découper en étapes logiques c'est pas mal.

Nicolas

Hors ligne

 

#17 sam. 03 février 2018 23:39

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 1059

Re: Postgis/qgis : creation de couche virtuelle ?

(vous pouvez eventuellement poster une suite a votre message sur postgis-users ou mettre un lien vers la discussion georezo)

Hors ligne

 

#18 sam. 03 février 2018 23:48

image95
Membre
Date d'inscription: 6 sept. 2014
Messages: 78

Re: Postgis/qgis : creation de couche virtuelle ?

OK super, merci...oui, je vais donner suite aux différents posts...

Hors ligne

 

#19 dim. 04 février 2018 18:09

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 1059

Re: Postgis/qgis : creation de couche virtuelle ?

Pour essayer de faire comme dans le lien donné précédemment, il y a moyen de fabriquer des courbes a la place des lignes droites des trajets:
ca permet de détacher les trajets les uns des autres.

J'avais jamais joué aves les curve dans PostGIS, mais ca permet de transformer un segment en une courbe plus ou moins prononcée suivant le 3eme point choisi pour construire la courbe.

Par exemple, on peut "courber" tous les trajets allant vers Cannes pour les représenter plus facilement:
Pour chaque segment de trajet, on calcule son milieu qu'on décale de +/- 25% en fonction du trajet, pour courber les trajets dans les deux sens, suivant leur numéro de trajet:

st_curveToLine avec un WKT circularstring renvoie une linestring avec les points de la courbe interpolé, histoire de faire un joli dessin:

Code:

drop table if EXISTS entrants_curved;
CREATE TABLE entrants_curved as
with tmp as (
  select codgeo_res, codgeo_tr, idtraj,geom
  from entrants_line
  where codgeo_tr = '06029'
), tmp1 as (
  select codgeo_res, codgeo_tr, idtraj,
    case when (idtraj % 2) = 0
      then st_lineinterpolatepoint(st_rotate(geom, pi() / 2, st_lineinterpolatepoint(geom, 0.5)), 0.75)
      else st_lineinterpolatepoint(st_rotate(geom, pi() / 2, st_lineinterpolatepoint(geom, 0.5)), 0.25) end as geomctrl,
    geom
  from tmp
), tmp2 as (
    SELECT codgeo_res, codgeo_tr, idtraj,
      st_setSRID(st_curvetoline(format('CIRCULARSTRING(%s %s, %s %s, %s %s)',
                            st_x(st_startpoint(geom)), st_y(st_startpoint(geom)),
                            st_x(geomctrl),
                            st_y(geomctrl),
                            st_x(st_endpoint(geom)), st_y(st_endpoint(geom))) :: GEOMETRY), 2154)::geometry(linestring, 2154) AS geom_curved
    FROM tmp1
) SELECT *
  FROM tmp2;

Il doit y avoir moyen d'éviter au maximum des courbes qui se croisent, en classant les trajets comme il faut.

Ensuite sous QGIS, la représentation avancée permet de faire des cartes où les trajets sont d'autant plus brillants qu'ils sont parcourus, par exemple.

Nicolas


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#20 ven. 09 février 2018 17:41

Theos2000
Membre
Date d'inscription: 15 juin 2015
Messages: 104

Re: Postgis/qgis : creation de couche virtuelle ?

Bonjour,

Un travail similaire a faire...donc un très grand merci aux protagonistes de ces échanges pour leur réflexion et informations...j'y vois plus clair !

Si par contre il vous serez possible d'apporter une précision sur un point.

Dans cette requête on créer des points et des lignes, d’où cette expression

"....st_union(geom)::geometry(linestring, 2154)..."

Lorsque je l'inscrit dans ma requête il me sort une erreur a cause des points creer, existe il une alternative au st_union pour isoler et ne prendre que les lignes ??? 

Ma langue de Shakespeare  étant un peu rouillé, vous connaissez des liens en français permettant de travailler la lisibilité de ces flux une fois réalisé sous Qgis.

Encore merci

Hors ligne

 

#21 lun. 12 février 2018 11:39

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 juil. 2010
Messages: 599

Re: Postgis/qgis : creation de couche virtuelle ?

Bonjour,

vous pouvez filtrer les résultats de la requête et ne conserver
que les lignes avec la fonction st_geometrytype(geometry)
qui renvoie une chaine décrivant le type de géométrie.

Hors ligne

 

#22 lun. 12 février 2018 19:34

Theos2000
Membre
Date d'inscription: 15 juin 2015
Messages: 104

Re: Postgis/qgis : creation de couche virtuelle ?

Merci tumasgiu, effectivement, je suis passé par un st_collectionextract, afin de ne récupérer que les lignes ce qui est la memee chose .

j'essaye de continuer le proccess de Nicolas, mais j'ai un peu de mal :

-  A quoi correspond  la fonction idtrajet%2
- La fonction st_curvetoline(format('CIRCULARSTRING(%s %s, %s %s, %s %s)',

qu'est ce que le 'CIRCULARSTRING(%s %s, %s %s, %s %s)' ???

Lorsque j'effectue cette requête le résultat renvoi parse error at position 18 within geometry

Si vous aviez la possibilité de détailler un peu plus cette requête ça serait sympa.

Bonne soirée

Dernière modification par Theos2000 (lun. 12 février 2018 19:51)

Hors ligne

 

#23 mar. 13 février 2018 12:51

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 1059

Re: Postgis/qgis : creation de couche virtuelle ?

Theos2000 a écrit:

Merci tumasgiu, effectivement, je suis passé par un st_collectionextract, afin de ne récupérer que les lignes ce qui est la memee chose .

j'essaye de continuer le proccess de Nicolas, mais j'ai un peu de mal :

-  A quoi correspond  la fonction idtrajet%2


C'est juste pour courber les trajets dans un sens ou dans l'autre, suivant que l'id trajet est pair ou impair. Sinon, tous les trajets sont courbés dans le meme sens et c'est moins joli. Il doit y avoir pleins de méthodes plus subtiles pour les courbes de telle sorte que les trajets ne se chevauchent pas trop

- La fonction st_curvetoline(format('CIRCULARSTRING(%s %s, %s %s, %s %s)',

qu'est ce que le 'CIRCULARSTRING(%s %s, %s %s, %s %s)' ???


C'est la méthode que j'ai utilisé pour construire une courbe (http://postgis.net/docs/using_postgis_d … L_MM_Part3) à partir de sa représentation WKT. format(string, pattern) est une fonction SQL pour construire des strings.

Lorsque j'effectue cette requête le résultat renvoi parse error at position 18 within geometry

Si vous aviez la possibilité de détailler un peu plus cette requête ça serait sympa.

Bonne soirée


Le WKT représentant la courbe est mal construit: vérifiez ce que donne juste la partie format('CIRCULAR...')

Nicolas

Hors ligne

 

#24 mer. 14 février 2018 17:39

Theos2000
Membre
Date d'inscription: 15 juin 2015
Messages: 104

Re: Postgis/qgis : creation de couche virtuelle ?

Merci pour toutes ces précisions et surtout l'asttuce de l'Id !

Pour l'instant ça bloque, je vais me contenter de lignes droites et approfondir ce "WKT"

Merci d'avoir pris le temps ! :-)

Hors ligne

 

Pied de page des forums

Powered by FluxBB

Partagez  |