Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #Program de calcul unghiuri intre segmentele poliliniilor unui layer QGIS
- #Layerul trebuie sa fie activ!
- #rezultatul din consola poate fi salvat ca fisier .csv si reincarcat in QGIS sub forma de puncte
- import math;
- linii = qgis.utils.iface.activeLayer()
- linii.selectAll();
- for elem in linii.selectedFeatures():
- #print "linia "+str(elem.id());
- xy = elem.geometry().asPolyline()
- for i in range(1,(len(xy)-1)):
- # verifica numitorul sa nu fie zero
- if xy[i].x()!=xy[i-1].x() and xy[i+1].x()!=xy[i].x():
- # formula 1 de calcul a unghiului folosind pantele segmentelor de dreapta
- panta1=(xy[i].y()-xy[i-1].y())/(xy[i].x()-xy[i-1].x())
- panta2=(xy[i+1].y()-xy[i].y())/(xy[i+1].x()-xy[i].x())
- if panta1*panta2!=1:
- unghiradian=math.atan((panta2-panta1)/(1-(panta1*panta2)))
- else: unghiradian=2*math.pi #nu se poate calcula - rezultatul va fi 360 de grade
- # formula 2 de calcul a unghiului dintre segmente cu atan
- unghiradian2=math.atan((xy[i].y()-xy[i-1].y())/(xy[i].x()-xy[i-1].x()))-math.atan((xy[i+1].y()-xy[i].y())/(xy[i+1].x()-xy[i].x()));
- else:
- unghiradian=unghiradian2=2*math.pi #nu se poate calcula - rezultatul va fi 360 de grade
- # formula 3 de calcul a unghiului dintre segmente cu atan2
- unghiradian3=math.atan2((xy[i].y()-xy[i-1].y()),(xy[i].x()-xy[i-1].x()))-math.atan2((xy[i+1].y()-xy[i].y()),(xy[i+1].x()-xy[i].x()));
- # formula 4 de calcul a unghiului cu teorema cosinusului
- segm_a=math.sqrt(pow(xy[i].x()-xy[i-1].x(),2)+pow((xy[i].y()-xy[i-1].y()),2))
- segm_b=math.sqrt(pow(xy[i+1].x()-xy[i].x(),2)+pow((xy[i+1].y()-xy[i].y()),2))
- segm_c=math.sqrt(pow(xy[i+1].x()-xy[i-1].x(),2)+pow((xy[i+1].y()-xy[i-1].y()),2))
- if segm_a!=0 and segm_b!=0:
- cosinus=(pow(segm_a,2)+pow(segm_b,2)-pow(segm_c,2))/(2.0*segm_a*segm_b)
- else: cosinus=1
- # o corectie
- cosinus=round(cosinus,10)
- unghiradian4=math.acos(cosinus)
- #transformare in grade
- unghi=math.degrees(unghiradian);
- unghi2=math.degrees(unghiradian2);
- unghi3=math.degrees(unghiradian3);
- unghi4=math.degrees(unghiradian4);
- #pentru comparatie rezultatele cu cele 4 formule
- #print str(xy[i].x())+','+str(xy[i].y())+','+str(unghi)+','+str(unghi2)+','+str(unghi3)+','+str(unghi4)
- #rezultatul cautat, normal e ultimul - adica cel care foloseste Teorema Cosinusului
- #indica pozitia unghiurilor mai mici de 50 de grade
- if 0<abs(unghi4)<50:
- print str(xy[i].x())+','+str(xy[i].y())+','+str(unghi4)
- print 'Am terminat!'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement