利用GeometryService中的buffer功能做polyline的緩衝區

   最近由於工作中需要對查詢出來的polyline做緩衝區,以增加line對象對鼠標點擊事件的敏感度。按照網上和esri官方給出的例子,代碼如下

private var bufferParameters:BufferParameters=new BufferParameters;

  <esri:GeometryService id="geometryService" url="http://10.1.30.161:8399/arcgis/rest/services/Geometry/GeometryServer" />

<esri:SpatialReference wkid="4326"  id="sp" />

       bufferParameters.geometries=myLastFeatureArr;
       bufferParameters.unit = GeometryService.UNIT_METER;
       bufferParameters.distances =[200]; // [ 2000, 4000 ];50.0 / 6378137.0 * 180.0 / Math.PI
       bufferParameters.bufferSpatialReference =sp;
       bufferParameters.outSpatialReference =sp;
       geometryService.addEventListener(GeometryServiceEvent.BUFFER_COMPLETE, bufferCompleteHandler);       
       geometryService.buffer(bufferParameters);

 private function bufferCompleteHandler(event:GeometryServiceEvent):void
   {
    geometryService.removeEventListener(GeometryServiceEvent.BUFFER_COMPLETE, bufferCompleteHandler);
       for each (var geometry:Polygon in event.result)
    {
      var graphic:Graphic = new Graphic();
      graphic.geometry = geometry;    }
   }
其中myLastFeatureArr是一個array,裏面存放着要做緩衝區的polyline對象。對於GeometryService的url我是自己發佈的一個服務,當然你也可以用esri在線的服務。sp 是我聲明的一個參考座標系,我們常用的wgs_84的wkid就是4326,。 這樣做完event.result  的結果總是null。糾結了很長時間,我跟官網是的例子基本一樣啊。後來同事說好像要先對polyline做一次simplify(簡單化)。我照做了還是不行。我從網上又找了些資料,有人說要先對每一個polyline設定參考座標系,gra.geometry.spatialReference = sp;
        myLastFeatureArr.push(gra.geometry)
;  果真有效果,這次event.result  的結果不是null。可是一看結果的座標就傻了,根本不對,polyline的座標範圍經度是123.左右,可是返回結果裏面有300多也有-80多,繪出來的緩衝區當然也不對了。繼續查資料,後來在網上查找到這句話,

        點(Points)和多點(Multipoints):若單位(unit)是長度的,如:米、英尺等,測地線緩衝(geodesic buffering)分析將執行 is performed.
        線(Polylines)和多邊形(Polygons):單位(unit)必須是角度的,如:十進制度數,緩衝區分析才能執行。

好了這次找到原因了。對200做了一次角度轉換bufferParameters.distances=[200/6378137.0 * 180.0/Math.PI];這次總算得到了正確的結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章