#1 Fri 02 February 2018 18:58
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
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 (Fri 02 February 2018 18:59)
Hors ligne
#2 Fri 02 February 2018 19:47
- p.jeremie
- Participant assidu
- Lieu: Valence
- Date d'inscription: 10 Sep 2017
- Messages: 427
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 (Fri 02 February 2018 19:48)
Hors ligne
#3 Fri 02 February 2018 20:28
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
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 (Fri 02 February 2018 20:28)
Hors ligne
#4 Sat 03 February 2018 10:45
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
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
En ligne
#5 Sat 03 February 2018 12:18
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
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 (Sat 03 February 2018 12:33)
Hors ligne
#6 Sat 03 February 2018 13:08
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
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 (Sat 03 February 2018 13:23)
Hors ligne
#7 Sat 03 February 2018 17:35
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
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
En ligne
#8 Sat 03 February 2018 19:08
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
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 (Sat 03 February 2018 19:13)
Hors ligne
#9 Sat 03 February 2018 19:24
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
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 (Sat 03 February 2018 21:02)
Hors ligne
#10 Sat 03 February 2018 21:36
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
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
En ligne
#11 Sat 03 February 2018 22:03
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
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 Sat 03 February 2018 22:57
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
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
En ligne
#13 Sat 03 February 2018 22:58
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
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.
Non, PostGIS est parfait pour ca !
En ligne
#14 Sat 03 February 2018 23:17
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
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 (Sat 03 February 2018 23:21)
Hors ligne
#15 Sat 03 February 2018 23:32
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Postgis/qgis : creation de couche virtuelle ?
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
En ligne
#16 Sat 03 February 2018 23:35
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
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
En ligne
#17 Sat 03 February 2018 23:39
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
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)
En ligne
#18 Sat 03 February 2018 23:48
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
Re: Postgis/qgis : creation de couche virtuelle ?
OK super, merci...oui, je vais donner suite aux différents posts...
Hors ligne
#19 Sun 04 February 2018 18:09
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
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
En ligne
#20 Fri 09 February 2018 17:41
- Theos2000
- Participant assidu
- Date d'inscription: 15 Jun 2015
- Messages: 221
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 Mon 12 February 2018 11:39
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
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 Mon 12 February 2018 19:34
- Theos2000
- Participant assidu
- Date d'inscription: 15 Jun 2015
- Messages: 221
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 (Mon 12 February 2018 19:51)
Hors ligne
#23 Tue 13 February 2018 12:51
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
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
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
En ligne
#24 Wed 14 February 2018 17:39
- Theos2000
- Participant assidu
- Date d'inscription: 15 Jun 2015
- Messages: 221
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