Advertisement
jucky

Identifica unghiuri in polilinii QGIS

Jun 27th, 2014
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.83 KB | None | 0 0
  1. #Program de calcul unghiuri intre segmentele poliliniilor unui layer QGIS
  2. #Layerul trebuie sa fie activ!
  3. #rezultatul din consola poate fi salvat ca fisier .csv si reincarcat in QGIS sub forma de puncte
  4. import math;
  5. linii = qgis.utils.iface.activeLayer()
  6. linii.selectAll();
  7. for elem in linii.selectedFeatures():
  8.       #print  "linia "+str(elem.id());
  9.       xy = elem.geometry().asPolyline()
  10.       for i in range(1,(len(xy)-1)):
  11.             # verifica numitorul sa nu fie zero
  12.             if xy[i].x()!=xy[i-1].x() and xy[i+1].x()!=xy[i].x():
  13.                 # formula 1 de calcul a unghiului folosind pantele segmentelor de dreapta
  14.                 panta1=(xy[i].y()-xy[i-1].y())/(xy[i].x()-xy[i-1].x())
  15.                 panta2=(xy[i+1].y()-xy[i].y())/(xy[i+1].x()-xy[i].x())
  16.                 if panta1*panta2!=1:
  17.                     unghiradian=math.atan((panta2-panta1)/(1-(panta1*panta2)))
  18.                 else: unghiradian=2*math.pi #nu se poate calcula  - rezultatul va fi 360 de grade
  19.                # formula 2 de calcul a unghiului dintre segmente cu atan
  20.                 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()));
  21.             else:
  22.                 unghiradian=unghiradian2=2*math.pi #nu se poate calcula - rezultatul va fi 360 de grade
  23.             # formula 3 de calcul a unghiului dintre segmente cu atan2
  24.             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()));
  25.             # formula 4 de calcul a unghiului cu teorema cosinusului
  26.             segm_a=math.sqrt(pow(xy[i].x()-xy[i-1].x(),2)+pow((xy[i].y()-xy[i-1].y()),2))
  27.             segm_b=math.sqrt(pow(xy[i+1].x()-xy[i].x(),2)+pow((xy[i+1].y()-xy[i].y()),2))
  28.             segm_c=math.sqrt(pow(xy[i+1].x()-xy[i-1].x(),2)+pow((xy[i+1].y()-xy[i-1].y()),2))
  29.             if segm_a!=0 and segm_b!=0:
  30.                 cosinus=(pow(segm_a,2)+pow(segm_b,2)-pow(segm_c,2))/(2.0*segm_a*segm_b)
  31.             else: cosinus=1
  32.             # o corectie
  33.             cosinus=round(cosinus,10)
  34.  
  35.             unghiradian4=math.acos(cosinus)
  36.             #transformare in grade
  37.             unghi=math.degrees(unghiradian);
  38.             unghi2=math.degrees(unghiradian2);
  39.             unghi3=math.degrees(unghiradian3);
  40.             unghi4=math.degrees(unghiradian4);
  41.             #pentru comparatie rezultatele cu cele 4 formule
  42.             #print str(xy[i].x())+','+str(xy[i].y())+','+str(unghi)+','+str(unghi2)+','+str(unghi3)+','+str(unghi4)
  43.            
  44.             #rezultatul cautat, normal e ultimul - adica cel care foloseste Teorema Cosinusului
  45.             #indica pozitia unghiurilor mai mici de 50 de grade
  46.             if 0<abs(unghi4)<50:
  47.                 print str(xy[i].x())+','+str(xy[i].y())+','+str(unghi4)
  48. print 'Am terminat!'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement