您的位置:首页 > Web前端 > JavaScript

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

2013-10-08 17:15 701 查看
在一个项目中产生这样一种需求。

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);
}
});
});
});
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐