最近在研究flex下针对点要素实现缓冲分析,并查询指定图层在缓冲区域内的点要素。实现思路是先使用GeometryService服务的Buffer方法对点进行缓冲分析,然后将分析出的缓冲区域作为QueryTask的参数去查询指定图层中的要素,这样查询出来的要素都是包含在缓冲区域内的。但是,在有些业务场景中,要查询的点要素是保存在业务数据库中的。所以,就需要我们自己去写一些方法代替QueryTask的工作。基本思路是:将点的经纬度坐标转换成魔卡托投影后,使用几何学公式(x1-x2)^2+(y1-y2)^2 <= r^2 来判断点是否在圆的范围内。
下面是实现的步骤:
第一步:使用GeometryService服务的Buffer方法进行缓冲分析,将得到的缓冲区域显示在地图上。
private var geometryService:GeometryService = new GeometryService();
//缓冲分析
private function onBufferAnlysis():void
{
if(building != null && queryTarget != null)
{
var bufferParm:BufferParameters=new BufferParameters();
bufferParm.bufferSpatialReference = map.spatialReference;
bufferParm.outSpatialReference=map.spatialReference;
bufferParm.unit=GeometryService.UNIT_METER; //指定单位为米
bufferParm.distances=[this.txtScope.value*1000];
bufferParm.geometries = [cmbLP.selectedItem.geo]; //缓冲分析的点
geometryService.showBusyCursor = true;
geometryService.buffer(bufferParm, new AsyncResponder(onBufferCompleted, onBufferFaultd, null));
}
}
//加载缓冲区
private function onBufferCompleted(event:Object,token:Object = null):void
{
bufferLayer.clear();
var sfs:SimpleFillSymbol=new SimpleFillSymbol("solid",0x6699FF,0.5);
for each (var geometry:Polygon in event)
{
var graphic:Graphic = new Graphic();
graphic.geometry = geometry;
graphic.symbol = sfs;
bufferLayer.add(graphic);
this.queryTask.url = LayerOper.getInstance().getLayerUrl(queryTarget); //设置图层Url
//定位到点
this.map.zoomTo(geometry);
//查询指定图层在缓冲区域内的点要素
indentifyQuery(geometry);
}
}
//缓冲区建立失败
private function onBufferFaultd(error:Object, token:Object = null):void
{
Alert.show(String(error), "缓冲分析失败!");
}
第二步:查询指定图层在缓冲区域内的点要素,讲查询到的要素在地图上显示。
//查询指定图层在缓冲区域内的点要素
private function indentifyQuery(geo:Geometry):void
{
var query:Query = new Query();
query.returnGeometry = true;
query.geometry = geo; //指定缓冲区域,对区域内的要素进行查询
query.where="1=1";
query.outFields = ["UserID","Name"];
queryTask.showBusyCursor = true;
queryTask.execute(query, new AsyncResponder(onQueryComplated, onQueryFault));
}
//将查询到的要素在地图上显示
private function onQueryComplated(results:FeatureSet, token:Object = null):void
{
if (results.features.length > 0)
{
var source:ArrayCollection = new ArrayCollection();
for each (var obj:Object in results.features)
{
var _g:Graphic = Graphic(obj);
_g.toolTip = _g.attributes.Name;
source.addItem({id:_g.attributes.UserID,name:_g.attributes.Name,geo:_g.geometry});
_g.symbol = LayerOper.getInstance().getSymbol(queryTarget);
this.bufferLayer.add(_g);
}
}
}
//查询失败
private function onQueryFault(error:Object, token:Object = null):void
{
Alert.show(String(error), "查询要素失败!");
}
参考资料:http://blog.csdn.net/lxping1012/article/details/8489115