1. 程式人生 > 程式設計 >基於openlayers實現角度測量功能

基於openlayers實現角度測量功能

基於openlayers的測量功能,官網提供了長度測量和角度測量,但是沒有角度測量,在此寫一下基於openlayers的角度測量功能,主要方法如下:

var formatAngle = function (line) {
  var coordinates = line.getCoordinates();
  var angle=0;
  var sourceProj = map.getView().getProjection();
  for (var i =0,ii = coordinates.length - 1; i < ii; ++i) {
    var c1 = ol.proj.transform(coordinates[i],sourceProj,'EPSG:4326');
    var c2 = ol.proj.transform(coordinates[i + 1],'EPSG:4326');
    var c3=0
    //當繪製兩個及以上點的時候,將c1的值傳給C3,C2的值傳給C1
    if(i>=1){
      c3=ol.proj.transform(coordinates[i-1],'EPSG:4326');
      var disa=wgs84Sphere.haversineDistance(c3,c1);
      var disb=wgs84Sphere.haversineDistance(c1,c2);
      var disc=wgs84Sphere.haversineDistance(c2,c3);
      //由於繪製結束的時候雙擊會導致c1=c2,從而disb=0,而分母不能為零,導致angle=NAN值,所以需要取雙擊的前一次值。
      //當有三個以上的點的時候,形成了角度,需要對角度進行測量輸出。
      if(disb===0&&i>=2){
        c1 = ol.proj.transform(coordinates[i-1],'EPSG:4326');
        c2 = ol.proj.transform(coordinates[i],'EPSG:4326');
        c3 = ol.proj.transform(coordinates[i-2],'EPSG:4326');
        disa=wgs84Sphere.haversineDistance(c3,c1);
        disb=wgs84Sphere.haversineDistance(c1,c2);
        disc=wgs84Sphere.haversineDistance(c2,c3);
      }
      var cos=(disa*disa+disb*disb-disc*disc)/(2*disa*disb);  //利用餘弦定理公式計算cos值
      angle=Math.acos(cos)*180/Math.PI;  //求反餘弦值,得到弧度制,並將弧度值轉角度值
      angle=angle.toFixed(2)+"度";  //對計算完成的角度,保留兩位小數
      //由於繪製結束的時候雙擊會導致c1=c2,從而disb=0,而分母不能為零,導致angle=NAN值,所以需要取雙擊的前一次值。
      //當只有兩個點的時候,只是一條線,並不形成角度,需要提示繼續繪製。
      if(disb===0&&i<2){
        angle="請繼續繪製形成角度";
      }
    }
    //當只是繪製一個點的時候,提示繼續繪製。
    else{
      angle="請繼續繪製形成角度";
    }
  }
  var output;
  output=angle;
  return output;//返回
};

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。