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 : 204
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)