#1 Fri 06 March 2020 12:12
- preliator
- Participant assidu
- Date d'inscription: 17 Nov 2018
- Messages: 433
MultiLigneString vers LineString
Bonjour à tous,
Je dispose d'une couche traces en multiligne, et j'aimerais pouvoir récupérer le nom du polygone de commune d'ou commence la ligne avec St_StartPoint.
Bien entendu, St_StartPoint me renverra NULL vu que je suis en multiligne. Je me demandais s'il était possible de convertir temporairement ma couche en LigneString juste le temps de faire fonctionner cette formule avec PostGis ?
Voici ma formule de base :
Code:
update traces set commune_debut = nom_commune from commune where st_within(st_startpoint(traces.geom), commune.geom)
Merci.
Dernière modification par preliator (Fri 06 March 2020 12:16)
Hors ligne
#2 Fri 06 March 2020 12:24
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: MultiLigneString vers LineString
Bonjour,
Essayez avec st_linemerge :
Code:
UPDATE traces t1 SET commune_debut = nom_commune FROM commune t2 WHERE st_within(st_startpoint(st_linemerge(t1.geom)), t2.geom)
Hors ligne
#3 Fri 06 March 2020 12:44
- preliator
- Participant assidu
- Date d'inscription: 17 Nov 2018
- Messages: 433
Re: MultiLigneString vers LineString
Merci beaucoup pour votre réponse. Effectivement, cela résout mon problème
Edit : bizarrement, certains tracés restent en null. En tentant de trouver la position de leur st_startpoint en créant un point sur cette position avec :
Code:
create table emplacement_st_startpoint as select traces, ST_CollectionExtract(st_startpoint(st_linemerge(traces.geom)), 1) as geom from traces
Effectivement, aucun point ne se trouve là où devrait être le début de la ligne. Bizarre.
Hors ligne
#4 Fri 06 March 2020 14:12
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: MultiLigneString vers LineString
Juste par curiosité malsaine, qu'est-ce que ce la donne si vous utilisez st_dumppoints de la façon suivante :
Code:
SELECT * FROM ( SELECT id /*id de la ligne*/ , (st_dumppoints(the_geom)).path /*position du point*/ , (st_dumppoints(the_geom)).geom /*geometrie*/ FROM traces ) t1 WHERE path[1] = 1 /*point avec la position 1*/
Hors ligne
#5 Fri 06 March 2020 14:24
- preliator
- Participant assidu
- Date d'inscription: 17 Nov 2018
- Messages: 433
Re: MultiLigneString vers LineString
Merci pour ce bout de code ^^
Voici le code entré :
Code:
SELECT * FROM ( SELECT id /*id de la ligne*/ , (st_dumppoints(traces.geom)).path /*position du point*/ , (st_dumppoints(traces.geom)).geom /*geometrie*/ FROM traces ) t1 WHERE path[1] = 1/*point avec la position 1*/ order by id
Cela me sort 90322 éléments, pour 272 traces à l'origine :
Code:
1 {1,337} "01010000A06A0800004E0C45A5B2C32C416572618638DD5741000000009A7C8540" 1 {1,680} "01010000A06A080000B86E4BABADC12C41066D5AE8DCDD5741000000C068498840" 1 {1,679} "01010000A06A080000A0C4B28FB0C12C411A233701DDDD5741000000C068498840" 1 {1,678} "01010000A06A080000E230668BAFC12C417842509CDCDD5741000000C068498840" 1 {1,677} "01010000A06A080000B0D09495B0C12C4122809E64DCDD5741000000C068498840" 1 {1,676} "01010000A06A080000243FEB6AB2C12C4121F71F3CDCDD5741000000C068498840" 1 {1,675} "01010000A06A0800004E6542E4B0C12C4179E63A73DCDD5741000000C068498840" 1 {1,674} "01010000A06A08000065C3146CB1C12C419EF48AD7DCDD5741000000C068498840" 1 {1,673} "01010000A06A08000013138074B6C12C41418B85D6DCDD5741000000C068498840" 1 {1,672} "01010000A06A080000700A85C6C0C12C417CDD7986DCDD5741000000C068498840" 1 {1,660} "01010000A06A080000F88F46EEC1C12C41A04CFC63DBDD5741000000C068498840" 1 {1,658} "01010000A06A080000ED734812C5C12C4146EE38BDDBDD5741000000C068498840" 1 {1,656} "01010000A06A080000D0B4FDBAC4C12C419E3A0CCBDBDD5741000000C068498840"
Que cela signifie t-il ?
Hors ligne
#6 Fri 06 March 2020 15:15
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: MultiLigneString vers LineString
Cela signifie que je me suis planté : D
Plus sérieusement, st_dumppoints extrait tous les points de construction des géométries. l'attribut path vous situe le point dans la géométrie :
1er colonne est le numéro de la géométrie simple (si votre multilinestring est composée de x lignes vous aurez 1 à x ), le 2eme colonne est la position du point dans cette géométrie.
La requête que je vous ai donnée identifiait tous les points de construction des geométries n°1 (pas très intéressant pour notre affaire...)
Par contre si votre condition se porte sur le numéro du point : path[2] = 1, vous devriez récolter les startpoints souhaités.
Cela permet de comparer si vous obtenez les mêmes résultats qu'avec st_startpoint.
Je vous remets la requête corrigée en espérant que cela fonctionne cette fois :
Code:
SELECT * FROM ( SELECT id /*id de la ligne*/ , (st_dumppoints(traces.geom)).path /*position du point*/ , (st_dumppoints(traces.geom)).geom /*geometrie*/ FROM traces ) t1 WHERE path[2] = 1/*point avec la position 1*/ order by id
Bien à vous
Hors ligne
#7 Fri 06 March 2020 15:25
- preliator
- Participant assidu
- Date d'inscription: 17 Nov 2018
- Messages: 433
Re: MultiLigneString vers LineString
Un grand merci à vous pour cette aide vous m'avez appris une nouvelle formule (st_dumppoints) dont j'ignorais l’existence !
Hors ligne