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.
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) + 180j'ai un syntax error angle &>= 0et 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)
Partager