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 !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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 smile

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 ? smile

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 smile vous m'avez appris une nouvelle formule (st_dumppoints) dont j'ignorais l’existence !

Hors ligne

 

Pied de page des forums

Powered by FluxBB