1 pièce(s) jointe(s)
Diviser un élément linéaire selon les directions ou azimuts de la ligne
Citation:
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.
Code:
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) |
Citation:
mais le problem du code est :
Code:
if angle &>= 0: else math.degrees(angle) + 180
Citation:
j'ai un syntax error angle &>= 0
Code:
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] |
Citation:
j'ai une erreur de position 29: ordinal not in range(128)