arcgis javascript api 中实现 根据一个点画出一个指定半径的圆,并且查询图层,绘制出落入这个圆中的空间对象

在一个项目中产生这样一种需求。

1. 给出一个点的坐标和半径。要求以这个点为圆心,以半径绘出一个圆圈。并且对特定的2个图层进行查询,把落入这个圆圈的空间对象标记出来,并且可以点击产生infowindow

解决思路:

a. 先通过GeometryService (几何服务)绘制出一个buffer的圆。

b.  把这个buffer,也就是一个graphic 放入到 map的graphics中显示

c. 然后定义一个query ,并且对此 query的geometry 指定为这个 buffer. 这样所有的查询结果就会是:查询出的空间对象落入这个buffer中。

d.定义一个featureLayer,对这个featureLayer 和 这个query 进行 selectFeatures 方法调用。

e. 对查询后调用的函数中,进行每个graphic 设置 infowindow 和 加入 map的graphic 。

这样就完成了需求。

/* 以一个map上标记的点 为圆心,以指定的半径标记一个圆圈
  do buffer
*/
sky.gis.Context.prototype.doBuffer = function (point,buffer_radius,lineColor,lineWidth,fillColor,infoWidth,infoHeight,url)
{
  var infoTemplate = new esri.InfoTemplate();
  infoTemplate.setTitle();
  infoTemplate.setContent("<iframe src=${iframe_url} height="+infoHeight+" width="+infoWidth+">");
  _map.infoWindow.resize(infoWidth, infoHeight);
  
  //setup the buffer parameters
  var bufferParams = new esri.tasks.BufferParameters();
  bufferParams.geometries = [ point ];
  bufferParams.distances = [ buffer_radius ];
  bufferParams.outSpatialReference = self._map.spatialReference;
  // bufferParams.unit = esri.tasks.GeometryService.esriDecimalDegrees;
  bufferParams.unit = esri.tasks.GeometryService.esriMeters;
  self.gsvc.buffer(bufferParams,function showBuffer(buffers)
  {  //做buffer处理
      dojo.forEach(buffers, function(b) {
        var bufferGeometry = b;
	//根据指定的颜色和线色进行填充。画出一个圆
        var sfs = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID,
          new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID,lineColor, lineWidth),
          fillColor
        );
        var graphic = new esri.Graphic(bufferGeometry, sfs); 

        if (graphic.attributes == null)
        {
          graphic.attributes = new Object();
          graphic.attributes.iframe_url = new Object();
          console.debug(graphic.attributes.iframe_url);
        }
        graphic.attributes.iframe_url = url;
        // graphic.setInfoTemplate(infoTemplate); //可以指定这个圆圈的infowindow
        self._map.graphics.add(graphic);    //把这个圆圈显示出来
        
        //开始查询
        var query = new esri.tasks.Query();          
        query.geometry = bufferGeometry; //指定查询出的空间对象一定要落在这个圆圈内
        
        // 查询落入buffer层的门板信息点
        self._bufferFeatureLayer = new esri.layers.FeatureLayer(infoLayerURL,
        {
          mode: esri.layers.FeatureLayer.MODE_SELECTION,
          outFields: ["*"]
        }); 
        
        self._bufferFeatureLayer.selectFeatures(query, esri.layers.FeatureLayer.SELECTION_NEW, function(results){
          dojo.forEach(results,function(result) { //对查询出的结果进行遍历。把graphic 放入map的graphics中
            var graphic = result;
            symbol = new esri.symbol.PictureMarkerSymbol('./imgs/infos.jpeg', 32, 32);
            graphic.setInfoTemplate(infoTemplate);
            graphic.setSymbol(symbol);
            self._map.graphics.add(graphic);
          });
        });

        // 查询落入buffer层的摄像头信息点
        self._bufferFeatureLayer = new esri.layers.FeatureLayer(cameraLayerURL,
        {
          mode: esri.layers.FeatureLayer.MODE_SELECTION,
          outFields: ["*"]
        }); 
        self._bufferFeatureLayer.selectFeatures(query, esri.layers.FeatureLayer.SELECTION_NEW, function(results){
            for ( var i = 0; i < results.length; i++) {
            var graphic = results[i];
            symbol = new esri.symbol.PictureMarkerSymbol('./imgs/camera.gif', 32, 32);
            graphic.setInfoTemplate(infoTemplate);
            graphic.setSymbol(symbol);
            self._map.graphics.add(graphic);
          }
        });
      });
  });
};



你可能感兴趣的:(arcgis javascript api 中实现 根据一个点画出一个指定半径的圆,并且查询图层,绘制出落入这个圆中的空间对象)