在一个项目中产生这样一种需求。
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); } }); }); }); };