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

Printemps des cartes 2024

#1 Wed 24 April 2019 13:51

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

QGIS: Manipulation de chaines de caracs pour afficher des polygones

Bonjour à tous,

Je souhaiterais afficher automatiquement des zones polygonales dont la description géométrique est une suite de points fournis en lat, long (degrés décimaux).

Exemple (pour un triangle) :
43.737222,1.5675
43.703611,1.540278
43.635,1.477778
43.737222,1.5675


Pour afficher ce triangle dans QGIS je dois transformer cette série de coordonnées en un champ géométrie dont la valeur est :
LineString (1.5675 43.737222,1.540278 43.703611,43.635 1.477778,1.5675 43.737222)

Il y a donc une série de manipulations de chaines de caractères à réaliser dans la calculatrice de champs pour faire cette transformation, mais je ne maitrise pas du tout bien ce domaine.

Si quelqu'un pouvait me donner un coup de main, ça serait super.
Merci d'avance.

Hors ligne

 

#2 Wed 24 April 2019 14:28

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Manipulation de chaines de caracs pour afficher des polygones

Sous quel format sont les données de départ ? Un exemple serait utile. Merci.

Hors ligne

 

#3 Wed 24 April 2019 14:47

sylvain poupard
Participant assidu
Date d'inscription: 19 Mar 2009
Messages: 362

Re: QGIS: Manipulation de chaines de caracs pour afficher des polygones

Bonjour,

En attendant un de vos exemples vous pouvez inverser les éléments d'un champs à partir d'un caractère comme ci-dessous:

Code:

 right( "mon_champs" , length(  "mon_champs" )-strpos(  "mon_champs" ,',')) || ',' || left(  "mon_champs" , strpos(  "mon_champs" ,',')-1)

Bon courage

Hors ligne

 

#4 Wed 24 April 2019 18:23

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Manipulation de chaines de caracs pour afficher des polygones

Le fichier en entrée est au format XML. Je l'ouvre sous excel et l'exporte en CSV pour le visualiser sous QGIS.
Pour les ponctuels, pas de soucis, mais pour les linéaires et les surfaciques, je dois lui faire lire la géométrie du fichier en WKT avec le "Linestring (...)" décrit dans mon message précédent.
Je joins un exemple de polygone, c'est la série de coordonnées de la case I2 qu'il faut transformer en Linestring (...).
PS : Pour la case I2, il faut l'agrandir. Les lat-long sont en degrés décimaux, le "0" des longitudes n’apparait pas : ".86"="0.86".
Merci encore.


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

Hors ligne

 

#5 Wed 24 April 2019 19:12

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Manipulation de chaines de caracs pour afficher des polygones

Puisqu'il faut inverser les X et Y pour de nombreuses paires, ça prendrait un script python à mon avis.

Hors ligne

 

#6 Thu 25 April 2019 13:41

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Manipulation de chaines de caracs pour afficher des polygones

En faite, il faut:
- inverser les X et les Y pour toutes les paires de coordonnées
- remplacer la virgule qui sépare chaque paire par un espace
- remplacer le saut de ligne entre chaque paire par une virgule
- remplacer les "." par "0." pour les longitudes
- mettre le tout dans les parenthèses de LineString (...)

Si tout est faisable consécutivement par des manipes de chaines de caractères implémentées dans QGIS, c'est cool.
S'il faut se lancer dans des scripts Python, j'avoue ma totale incompétence ...

Hors ligne

 

#7 Thu 25 April 2019 14:54

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Manipulation de chaines de caracs pour afficher des polygones

- remplacer la virgule qui sépare chaque paire par un espace
- remplacer le saut de ligne entre chaque paire par une virgule
- remplacer les "." par "0." pour les longitudes
- mettre le tout dans les parenthèses de LineString (...)


Tout cela se fait avec les outils de chaînes Replace et Concat.

inverser les X et les Y pour toutes les paires de coordonnées


Ça, ça doit être scripté, sauf erreur de ma part.

Hors ligne

 

#8 Sun 28 April 2019 11:06

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Manipulation de chaines de caracs pour afficher des polygones

Bonjour Vincent et Sylvain,

Merci pour vos réponses.

Les 3 Replace de mon algo fonctionnent bien, pourriez-vous m'indiquer un moyen de les exécuter en batch plutôt que de les exécuter consécutivement en créant un nouveau champ à chaque fois.

Pour l'inversion des coordonnées, Sylvain, j'ai testé votre code, voilà ce qu'il fait (si je reprends l'exemple de mon triangle (avec des sauts de ligne entre chaque paire de coordonnées) ) :
en entrée
43.737222,1.5675
43.703611,1.540278
43.635,1.477778
43.737222,1.5675


en sortie
1.5675
43.703611,1.540278
43.635,1.477778
43.737222,1.5675,43.737222


J'aurais préféré avoir ça (un petit réglage à faire?) :
1.5675,43.737222
1.540278,43.703611
1.477778,43.635
1.5675,43.737222


Merci beaucoup d'avance.

Hors ligne

 

#9 Thu 02 May 2019 10:16

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Manipulation de chaines de caracs pour afficher des polygones

Bonjour à tous,

Pardonnez-moi d'insister sur 2 petits points :

Premier point
Pour mes manipulations de chaine de caractères, je souhaiterais savoir s'il est possible d'éxécuter en une seule passe les 4 traitements suivants :
- replace( "Geom1" ,',',' ')
- replace( "Geom2" ,'\n',',')
- replace( "Geom3" ,' -.',' -0.')
- concat( 'Linestring(', "Geom4",')')

Deuxième point
Pour l'inversion des coordonnées, je m'en sors en appliquant à ma couche l'algorithme Inverser les X et les Y après avoir effectué les traitements décrits dans le premier point. Mais, si quelqu'un a une idée de code dans la calculatrice de champs, sans passer par des scripts Python, je suis preneur.

Merci d'avance.

Hors ligne

 

#10 Thu 02 May 2019 14:25

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Manipulation de chaines de caracs pour afficher des polygones

je souhaiterais savoir s'il est possible d'éxécuter en une seule passe les 4 traitements suivants


On peut imbriquer les manipulations en une seule ligne ! Le 1er argument est donc un appel à une autre manipulation.

Exemple : Replace(Replace(Replace(...,...,...),...,...), , ',')

Mon exemple est sommaire, mais vous comprenez le concept je crois.

je m'en sors en appliquant à ma couche l'algorithme Inverser les X et les Y après avoir effectué les traitements décrits


Bonne idée ! J'y avais pensé, mais ne savais pas qu'un outil était disponible.

J'aurais préféré avoir ça (un petit réglage à faire?) :


Postez le code utilisé s.v.p. Ce sera plus simple pour l'adapter.

Hors ligne

 

#11 Thu 02 May 2019 15:13

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 722

Re: QGIS: Manipulation de chaines de caracs pour afficher des polygones

A partir de la version 3.6.2 de qgis on peut faire des choses sympas avec les tableaux (array)

Code:

format('LINESTRING(%1)',
    array_to_string(
        array_foreach(
            string_to_array(
                replace("Geometrie", '\n','@'),'@'), 
                    replace(
                        format_number(  right( @element , length( @element)-strpos(  @element ,',')),5),',','.') || 
                        ' ' || left( @element , strpos( @element ,',')-1)
        ),' ,'
    )
)

donne le résultat suivant :

Code:

LINESTRING(0.86000 45.798889 ,0.68500 45.633056 ,0.68732 45.631158 ,0.69296 45.626217 ,0.69874 45.62136 ,0.70467 45.61659 ,0.71073 45.611907 ,0.71694 45.607315 ,0.72328 45.602816 ,0.72975 45.59841 ,0.73635 45.594102 ,0.74308 45.589891 ,0.74994 45.58578 ,0.75691 45.581771 ,0.76400 45.577866 ,0.77121 45.574066 ,0.77852 45.570373 ,0.78595 45.566788 ,0.79348 45.563314 ,0.80111 45.559951 ,0.80884 45.556702 ,0.81667 45.553567 ,0.82459 45.550548 ,0.83259 45.547646 ,0.84068 45.544863 ,0.84885 45.542199 ,0.85710 45.539657 ,0.86542 45.537236 ,0.87381 45.534939 ,0.88226 45.532765 ,0.89078 45.530717 ,0.89936 45.528794 ,0.90800 45.526999 ,0.91668 45.525331 ,0.92541 45.523791 ,0.93419 45.52238 ,0.94301 45.521099 ,0.95186 45.519947 ,0.96074 45.518927 ,0.96966 45.518037 ,0.97859 45.517279 ,0.98755 45.516653 ,0.99653 45.516159 ,1.00551 45.515797 ,1.01451 45.515568 ,1.02351 45.515471 ,1.03251 45.515507 ,1.04151 45.515675 ,1.05050 45.515976 ,1.05948 45.516409 ,1.06845 45.516975 ,1.07740 45.517672 ,1.08632 45.518501 ,1.09522 45.519461 ,1.10409 45.520552 ,1.11292 45.521774 ,1.12172 45.523125 ,1.13047 45.524606 ,1.13918 45.526215 ,1.14784 45.527952 ,1.15644 45.529816 ,1.16499 45.531806 ,1.17347 45.533922 ,1.18190 45.536163 ,1.19025 45.538527 ,1.19853 45.541013 ,1.20674 45.543621 ,1.21486 45.54635 ,1.22291 45.549197 ,1.23087 45.552162 ,1.23873 45.555244 ,1.24651 45.558441 ,1.25419 45.561752 ,1.26167 45.565278 ,1.34167 45.695833 ,1.01833 45.699444 ,1.01316 45.699434 ,1.00755 45.699793 ,1.00197 45.700285 ,0.99641 45.700908 ,0.99088 45.701662 ,0.98539 45.702547 ,0.97995 45.70356 ,0.97456 45.704702 ,0.96922 45.70597 ,0.96395 45.707363 ,0.95875 45.70888 ,0.95363 45.710519 ,0.94859 45.712278 ,0.94363 45.714156 ,0.93877 45.716149 ,0.93401 45.718256 ,0.92935 45.720474 ,0.92480 45.7228 ,0.92036 45.725233 ,0.91605 45.72777 ,0.91186 45.730407 ,0.90779 45.733141 ,0.90387 45.73597 ,0.90007 45.73889 ,0.89643 45.741897 ,0.89293 45.74499 ,0.88958 45.748163 ,0.88638 45.751413 ,0.88334 45.754737 ,0.88047 45.758131 ,0.87776 45.761591 ,0.87521 45.765113 ,0.87284 45.768693 ,0.87065 45.772327 ,0.86862 45.776011 ,0.86678 45.77974 ,0.86512 45.783511 ,0.86364 45.787319 ,0.86235 45.79116 ,0.86124 45.795029 ,0.86000 45.798889)

Edit : je n'ai pas réussi à ouvrir le wkt

Dernière modification par lejedi76 (Thu 02 May 2019 15:22)

Hors ligne

 

#12 Thu 02 May 2019 15:37

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Manipulation de chaines de caracs pour afficher des polygones

[supprimé]

Dernière modification par carteq (Thu 02 May 2019 15:39)

Hors ligne

 

#13 Fri 03 May 2019 12:56

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Manipulation de chaines de caracs pour afficher des polygones

Merci de vos réponses, Vincent, l'imbrication des manipulations a bien fonctionné.
Le code utilisé était celui proposé par Sylvain
right( "mon_champs" , length(  "mon_champs" )-strpos(  "mon_champs" ,',')) || ',' || left(  "mon_champs" , strpos(  "mon_champs" ,',')-1)

Lejedi76, j'ai essayé votre code, il a l'air de bien fonctionner, un grand merci également.

Hors ligne

 

#14 Fri 03 May 2019 14:39

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Manipulation de chaines de caracs pour afficher des polygones

Je confirme Lejedi76 ce code assez complexe pour moi (j'avoue à avoir du mal à le comprendre ...) fonctionne parfaitement. Magique !!!
Un grand merci.

Hors ligne

 

#15 Fri 03 May 2019 17:21

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 722

Re: QGIS: Manipulation de chaines de caracs pour afficher des polygones

ODJAC33 a écrit:

Je confirme Lejedi76 ce code assez complexe pour moi (j'avoue à avoir du mal à le comprendre ...) fonctionne parfaitement. Magique !!!
Un grand merci.


Je vais le détailler cela servira peut-être à d'autres :

Code:

    format('LINESTRING(%1)', 'texte') 
    --> renverra LINESTRING(texte)
    
    array_to_string([0.86000 45.798889 ,0.68500 45.633056, ... ,0.86000 45.798889], ' # ') 
    --> renverra une chaine de caractère séparée par #
    --> 0.86000 45.798889 # 0.68500 45.633056 # ... # 0.86000 45.798889
    --> dans la formule le séparateur est ' ,' (blanc, virgule)

     string_to_array permet de construire un tableau à partir d'un caractère
   --> ici la fonction le construit à partir du caractère @ 
    au préalable dans la formule le saut à la ligne est remplacé par @, 
   on aurait pu tout simplement construire le tableau en prenant comme séparateur le saut à la ligne (\n)
   --> on obtient donc  [45.798889 .86  , 45.633056 .6850, ..., 45.798889 0.86 ]

    array_foreach permet de boucler et de faire un traitement sur chaque élément du tableau
   à savoir 45.798889 .86, puis 45.633056 .6850, ... et enfin 45.798889 0.86

et de renvoyer le traitement sous forme de tableau

   par exemple 
    array_foreach([45.798889 .86  , 45.633056 .6850, ..., 45.798889 0.86 ], '#'|| @element) --> [#45.798889 .86  , #45.633056 .6850, ..., #45.798889 0.86 ]
    @element renvoie à chacun des éléments

    --> dans la formule on utilise la formule qui permet de switcher les coordonnées et d'ajouter le 0 devant la décimiale quand c'est nécessaire

Hors ligne

 

#16 Sat 04 May 2019 10:27

ODJAC33
Participant assidu
Date d'inscription: 6 Aug 2017
Messages: 240

Re: QGIS: Manipulation de chaines de caracs pour afficher des polygones

Merci pour ces explications, grâce à vous, je vais afficher mes polygones en quelques secondes (au lieu d'une bonne heure, car je faisais des manipulations très longues sur NotePad ++  pour modifier mes chaines de caractères).

Hors ligne

 

Pied de page des forums

Powered by FluxBB