IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Diviser un élément linéaire selon les directions ou azimuts de la ligne


Sujet :

Python

  1. #1
    Futur Membre du Club
    Femme Profil pro
    sig
    Inscrit en
    Février 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : sig

    Informations forums :
    Inscription : Février 2016
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Diviser un élément linéaire selon les directions ou azimuts de la ligne
    J'ai un shapefile linéaire de formes qui contient un seul élément comme vous le voyez sur l'image et je veux le diviser en plusieurs tronçon selon l'azimut et la direction de la ligne.
    Nom : Capture1.PNG
Affichages : 184
Taille : 49,8 Ko

    j'ai ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import os
    import fiona
    from shapely.geometry import mapping
    from shapely.geometry import Point,LineString
    import math
     
    os.chdir('SHP')
     
    def azimut(point1, point2):
           #Retourne l'azimuth de la ligne entre 2 points shapely
           angle = math.atan2(point2.x - point1.x, point2.y - point1.y)
           return math.degrees(angle)
           print angle
           if angle &>= 0: else math.degrees(angle) + 180
     
     
    def paires(liste):
         '''parcourt une liste par paires'''
         for i in range(1, len(liste)):
             yield liste[i-1], liste[i]
     
    with fiona.collection('BOM1.shp', 'r') as entree:
        # copie du schema de la couche et création d'un nouveau champ 'azimut'
        schema = entree.schema.copy()
        schema['properties']['azimut'] = 'int'
        # création d' une nouvelle couche avec le schéma résultant
        with fiona.collection('testligne_azim.shp', 'w', 'ESRI Shapefile', schema) as sortie:
            for ligne in entree:
            # utilisation de la fonction paire() pour extraire les segments de lignes
                for seg_start, seg_end in paires(ligne['geometry']['coordinates']):
                    # création d'une ligne en fonction des points des segments
                    line_start =Point(seg_start)
                    line_end = Point(seg_end)
                    segment = LineString([line_start.coords[0],line_end.coords[0]])
                    # copie des attributs d'entrée et ajout de la valeur résultante
                    # de la fonction azimut()
                    elem = {}                  
                    elem['properties'] = ligne['properties'] 
                    elem['properties']['azimut'] = azimut(line_start, line_end)
                    elem['geometry'] = mapping(segment)
                    sortie.write(elem)
    mais le problem du code est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if angle &>= 0: else math.degrees(angle) + 180
    j'ai un syntax error angle &>= 0
    et aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def paires(liste):
             '''parcourt une liste par paires'''
             for i in range(1, len(liste)):
                 yield liste[i-1], liste[i]
    j'ai une erreur de position 29: ordinal not in range(128)

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Salut,

    L'erreur de syntaxe est évidente, non ?
    &> ce n'est pas du Python mais semble tout droit sortit d'un HTML

    De toutes façons ces lignes de code ne devraient pas s'exécuter puisqu'il y a un return avant

    Pour la deuxième erreur, ça ne semble pas correspondre au code que tu montres, alors copie-colle plutôt le traceback complet de l'erreur.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 149
    Points : 219
    Points
    219
    Par défaut
    C'est apparemment ce qui arrive lorsqu'on copie du code sans comprendre. Le script provient de Python: traitement des couches vectorielles dans une perspective géologique, lecture et enregistrement des couches sous forme de dictionnaires avec le module Fiona

    1. si vous connaissez Python, vous savez que >0 ne signifie rien et est une erreur (c'est aussi une erreur de transformation HTML sur le Portail qui varie suivant les navigateurs)
    2. en HTML "&>" = >
    3. si vous connaissez en plus les règle de géométrie angulaire (de 0 à 360°), il est facile de corriger le tir


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def azimut(point1, point2):
           '''Retourne l'azimuth de la ligne entre 2 points shapely'''
           angle = math.atan2(point2.x - point1.x, point2.y - point1.y)
           return math.degrees(angle)if angle > 0 else math.degrees(angle) + 180
    Vous pourriez tout aussi bien utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     return math.degrees(angle) % 360
    Le résultat de la deuxième partie du script est un simple générateur Python présenté sur ce Forum dans parcours d'une liste par paires, quelques solutions . Donc il ne peut pas être la cause de votre erreur.

    Vous avez posé la même question sur Gis Stackexchange: Cut a linear feature according to the directions or azimuths/q/180098/2581

  4. #4
    Futur Membre du Club
    Femme Profil pro
    sig
    Inscrit en
    Février 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : sig

    Informations forums :
    Inscription : Février 2016
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    L'erreur de syntaxe est évidente, non ?
    &> ce n'est pas du Python mais semble tout droit sortit d'un HTML

    De toutes façons ces lignes de code ne devraient pas s'exécuter puisqu'il y a un return avant

    Pour la deuxième erreur, ça ne semble pas correspondre au code que tu montres, alors copie-colle plutôt le traceback complet de l'erreur.
    merci pour votre réponse oui c'est bien un code que j'ai trouvé , et qui n'est pas claire jarrive pas de comprendre la partie de la fonction paires
    l'erreur compléte est :

    Traceback (most recent call last):

    File "C:\Anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 3052, in run_code
    self.showtraceback()

    File "C:\Anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 1851, in showtraceback
    value, tb, tb_offset=tb_offset)

    File "C:\Anaconda\lib\site-packages\IPython\core\ultratb.py", line 1240, in structured_traceback
    self, etype, value, tb, tb_offset, number_of_lines_of_context)

    File "C:\Anaconda\lib\site-packages\IPython\core\ultratb.py", line 1157, in structured_traceback
    self, etype, value, elist, tb_offset, number_of_lines_of_context

    File "C:\Anaconda\lib\site-packages\IPython\core\ultratb.py", line 511, in structured_traceback
    lines = ''.join(self._format_exception_only(etype, value))

    File "C:\Anaconda\lib\site-packages\IPython\core\ultratb.py", line 623, in _format_exception_only
    Colors.Normal, s))

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 29: ordinal not in range(128)


    In [14]:


    j'ai remarqué que y'a quelque chose qui ne vas pas sur import fiona c'est a cause de sa j'ai cette erreur quand je supprime import fiona je n'est plus cette erreur

Discussions similaires

  1. [XL-2010] 2 LISTBOX qui varient selon les éléments sélectionnés
    Par MatthieuT42 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 05/06/2015, 10h19
  2. Réponses: 1
    Dernier message: 16/12/2012, 13h35
  3. élément qui bouge selon les résolutions dans un mail
    Par petitobi dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 24/10/2009, 00h18
  4. Réponses: 4
    Dernier message: 09/08/2006, 12h05
  5. tourner autour d'1 objet ds ttes les directions
    Par Mat 74 dans le forum OpenGL
    Réponses: 2
    Dernier message: 20/10/2004, 21h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo