参见SearchWidget源代码,以上是精炼材料
(1)鼠标事件
private function activateDrawTool(event:MouseEvent):void
{addSharedData("Deactivate_DrawTool", null); // to be able to deactivate drawTool on other widgets
// apply glow
selectedDrawingIcon = Image(event.currentTarget);
clearSelectionFilter();
selectedDrawingIcon.filters = [ glowFilter ];
finishDrawing = false;
var status:String;
var value:String = selectedDrawingIcon.name;
switch (value)
{
case DrawTool.MAPPOINT://点查图
{
status = pointLabel;
drawSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CIRCLE, 15, 0x3FAFDC, 1);
break;
}
case DrawTool.POLYLINE://线查图
{
status = lineLabel;
drawSymbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID, 0x3FAFDC, 1, 1);
break;
}
case DrawTool.EXTENT://矩形查图
{
status = rectangleLabel;
drawSymbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, 0x3FAFDC, 0.5, new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID, 0x3FAFDC, 1, 1));
break;
}
case DrawTool.POLYGON://多变形查图
{
status = polygonLabel;
drawSymbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, 0x3FAFDC, 0.5, new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID, 0x3FAFDC, 1, 1));
break;
}
}
setMapAction(value, status, drawSymbol, searchDrawEnd);
}
(2)searchDrawEnd图查过度函数
private function searchDrawEnd(event:DrawEvent):void
{
// deactivate the draw tool
finishDrawing = true;
selectedDrawingIcon = null;
clearSelectionFilter();
event.target.deactivate();
var geom:Geometry = event.graphic.geometry;
//简化图层
if (geom is Polygon && GeometryUtil.polygonSelfIntersecting(geom as Polygon))
{
geometryService.simplify([ geom ]);
}
else
{
//to improve search results
if (geom.type == Geometry.MAPPOINT)
{
geom = createExtentAroundMapPoint(geom as MapPoint, pointSearchTolerance);
}
queryFeaturesGraphical(geom);
}
}
(3)关键函数:(该方法完全可以参考arcigs server flex api)
private function queryFeaturesGraphical(geom:Geometry):void
{
hideInfoWindow();
var i:int = cboLayerGraphical.selectedIndex;
queryLayer = configSearchGraphical[i].layer;//关键方法,得到查询的图层
if (queryLayer && !queryLayer.loaded)
{
queryLayer.addEventListener(LayerEvent.LOAD, queryLayer_loadHandler);
function queryLayer_loadHandler(event:LayerEvent):void
{
queryFeaturesGraphical(geom)
}
return;
}
queryGeom = geom;
queryFields = configSearchGraphical[i].fields;
queryTitleField = configSearchGraphical[i].titlefield;
queryLinkField = configSearchGraphical[i].linkfield;
queryLinkAlias = configSearchGraphical[i].linkalias;
if (queryLayer)
{
var query:Query = new Query();
query.geometry = queryGeom;
query.spatialRelationship = Query.SPATIAL_REL_INTERSECTS;
query.outSpatialReference = map.spatialReference;
queryLayer.queryFeatures(query, new AsyncResponder(onResult, onFault, queryFields));
showMessage(loadingLabel, true);
showStateResults();
function onResult(featureSet:FeatureSet, token:XMLList = null):void
{
try
{
searchResultAC = createSearchResults(featureSet, token);
addSharedData(widgetTitle, searchResultAC);//查到的图元,增加到上节说的共享数据区域,提供其他插件或本身使用。
if (featureSet.features.length < 1)
{
showMessage(noResultLabel, false);
}
else
{
showMessage(selectionLabel + " " + featureSet.features.length, false);
}
}
catch (error:Error)
{
showMessage(error.message, false);
}
}
function onFault(info:Object, token:Object = null):void
{
showMessage(info.toString(), false);
}
}
}
这个例子存在小问题,只有点查的时候,会无法得到数据,留做一个记号,就不写原因了。