#1 Thu 04 April 2013 09:11
- yasmine07
- Participant occasionnel
- Date d'inscription: 4 Mar 2013
- Messages: 21
Quand ST_Collect rend-t-elle un Multilinestring ?
Bonjour,
Mon problème est le suivant :
J'utilise Postgis.
J'ai besoin de créer un chemin entre plusieurs points origines et destinations.
Première méthode: je crée des lignes (Makeline) directement entre les points O/D successifs, puis j'applique la fonction ST_Collect sur ces bouts de chemins pour avoir le chemin complet. Le type de résultat obtenu est Multilinestring .
Deuxième méthode: j'ai un réseau routier. J'applique avec pgrouting la fonction de création du plus court chemin (shortest_path) ce qui me rend des bouts de segments du réseau (type Line normalement) puis j'applique la même fonction ST_Collect sur cet ensemble de segments. Sauf que là, le résultat est de type Geometrycollection.
Quel est e problème me diriez vous?
Le problème est qu'avec un geometrycollection je ne peut pas visualiser ces chemins sur un sig (qgis par exemple), ni appliquer (apparemment) des opérations de relations spatiales tels que crosses ou intersects.
Donc : puis je forcer ST_collect à retourner un Multinestring? ou existe-il une astuce pour remédier à ce problème?
Merci à vous.
Hors ligne
#2 Thu 04 April 2013 10:08
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Quand ST_Collect rend-t-elle un Multilinestring ?
Bonjour,
Le type de la collection retournée par st_collect depend des données a collecte: si elles sont heterogènes: lignes, points, geometries vides, alors une GeometryCollection sera créée.
Si les données sont homogènes: que des points, des lignes... alors une collection de ce type sera créée.
Pour filtrer une geometryCollection, il y a plusieurs methodes, mais st_dump est pratique: cela permet d'exploser une collection en objets simples, par exemple:
Code:
-- recrée une collection d'objets homogènes with explosion as ( select st_dump(macollection) as d from matable ) select st_collect( (d).geom ) as nouvelle_collection_linestring from explosion where geometryType( (d).geom ) = 'LINESTRING';
Il y a d'autres méthodes.
Il est aussi évidemment possible de faire le meme controle lors de l'appel a st_collect, en ajoutant une clause where permettant de filtrer le type d'objet qu'on souhaite collecter.
Du fait des cas possibles rencontrés lors d'opérations topologiques, il est tjs interessant de controler explicitement les resultats obtenus pour controler le type des données.
Nicolas
Hors ligne
#3 Thu 04 April 2013 11:25
- yasmine07
- Participant occasionnel
- Date d'inscription: 4 Mar 2013
- Messages: 21
Re: Quand ST_Collect rend-t-elle un Multilinestring ?
Re bonjour Nicolas,
Merci pour la réponse.
J'applique St_Collect sur un tableau de géométries , toutes de type Multilinestring. Le résultat ne devrait-il pas être un Multilinetring, plutôt qu'un GEOMETRYCOLLECTION?
C'est ce que je trouve bizarre!
Hors ligne
#4 Thu 04 April 2013 11:34
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Quand ST_Collect rend-t-elle un Multilinestring ?
Vraiment toutes de type LINESTRING ?
Il n'y en aurait pas une qui serait un point ou une GEOMETRY EMPTY ?
Si ce n'est pas le cas, oui c'est curieux.
Nicolas
Hors ligne
#5 Thu 04 April 2013 11:51
- yasmine07
- Participant occasionnel
- Date d'inscription: 4 Mar 2013
- Messages: 21
Re: Quand ST_Collect rend-t-elle un Multilinestring ?
Ouiiii toutes de type MULTILINESTRING (et non pas LINESTRING).
Je stocke ces géométries dans un tableau de type geometry[]. PAr la suite j'applique la fonction ST_Collect avec comme seul argument ce tableau.
Et le résultat est un GEOMETRYCOLLECTIN! :-(
Hors ligne
#6 Thu 04 April 2013 12:04
- yasmine07
- Participant occasionnel
- Date d'inscription: 4 Mar 2013
- Messages: 21
Re: Quand ST_Collect rend-t-elle un Multilinestring ?
J'ai appliqué le code st_dump.
J'obtiens une "explosion" de Linestring, certes . mais quand j'applique le ST_Collect , comme dans le code, je n'obtiens rien comme résultat!
Hors ligne
#7 Thu 04 April 2013 13:30
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Quand ST_Collect rend-t-elle un Multilinestring ?
Pouvez-vous poster votre requete ?
(Sinon, relisant la doc 2.0, je vois cette fonction, plutot que le test proposé:
st_collectionExtract (http://postgis.net/docs/manual-2.0/ST_C … tract.html)
Nicolas
Hors ligne
#8 Thu 04 April 2013 13:43
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Quand ST_Collect rend-t-elle un Multilinestring ?
Concernant st_collect, et relisant la doc: il est normal d'obtenir une geometryCollection a partir d'objets MULTI, c'est le comportement par défaut:
Geometries simples et homogènes passées a st_collect => MULTI*
Geometries MULTI et/ou hétérogènes passées a st_collect => GEOMETRY COLLECTION
Normal, donc.
Nicolas
Hors ligne
#9 Thu 04 April 2013 16:44
- yasmine07
- Participant occasionnel
- Date d'inscription: 4 Mar 2013
- Messages: 21
Re: Quand ST_Collect rend-t-elle un Multilinestring ?
oui. C'est ce que j'ai compris aussi.
Là, j'ai remplacé l'utilisation de ST_collect par St_Union (qui a d'après ce que j'ai compris le même comportement) et j'obtiens normalement un Multilinestring ;-)
Je fais tourner le reste du code et normalement c bon.
Merci encore.
Hors ligne