I'm trying to modify the example http://help.arcgis.com/en/webapi/silverlight/samples/start.htm#BufferQueryI want to use a input of a line instead of a point. I almost have it working but the two problems I am having is it is drawing a huge buffer distance when it should be doing like 500 feet it creating a buffer around half of the world so every parcel (or whatever layer is chosen in the drop down list I have it hooked to select a layer that the user defines). My other problem is the buffer it is drawing is a Circle (that covers all of North America and some parts of Africa) and obvisouly it should be a polygon shaped like the line that was drawn.Could someone look at my code and maybe give me a heads up on what I'm doing wrong. The Here's my code behind:
private void CreateBuffLine_Click(object sender, RoutedEventArgs e)
{
_geometryService = new GeometryService("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer");
_geometryService.BufferCompleted += GeometryService_BufferLineCompleted;
_geometryService.Failed += BuffLineSelectGeometryService_Failed;
_queryTask = new QueryTask((Layers.SelectedItem as FeatureLayer).Url);
_queryTask.ExecuteCompleted += BuffLineQueryTask_ExecuteCompleted;
_queryTask.Failed += BuffLineQueryTask_Failed;
_lineAndBufferGraphicsLayer = Map.Layers["MyGraphicsLayer"] as GraphicsLayer;
GraphicsLayer graphicsLayer = Map.Layers["MySelectionGraphicsLayer"] as GraphicsLayer;
_geometryService.CancelAsync();
_queryTask.CancelAsync();
//Gives users ability to draw line
MyDrawObject = new Draw(Map)
{
DrawMode = DrawMode.Polyline,
IsEnabled = true,
LineSymbol = LayoutRoot.Resources["ClipLineSymbol"] as ESRI.ArcGIS.Client.Symbols.LineSymbol
};
// Start MyDrawObject_DrawComplete, which turns the drawn poly into a graphic
MyDrawObject.DrawComplete += MyDrawObject_BuffLineDrawComplete;
}
private void MyDrawObject_BuffLineDrawComplete(object sender, DrawEventArgs args)
{
//Disable the drawing tool
MyDrawObject.IsEnabled = false;
//Assign the graphic draw to a graphiclayer, the graphic layer is defined in xaml
GraphicsLayer graphicsLayer = Map.Layers["MyGraphicsLayer"] as GraphicsLayer;
//Ready the graphic
Graphic graphic = new Graphic()
{
Symbol = LayoutRoot.Resources["ClipLineSymbol"] as ESRI.ArcGIS.Client.Symbols.LineSymbol,
Geometry = args.Geometry
};
// Input spatial reference for buffer operation defined by first feature of input geometry array
graphic.Geometry.SpatialReference = Map.SpatialReference;
_lineAndBufferGraphicsLayer.ClearGraphics();
graphicsLayer.ClearGraphics();
graphic.SetZIndex(2);
_lineAndBufferGraphicsLayer.Graphics.Add(graphic);
// If buffer spatial reference is GCS and unit is linear, geometry service will do geodesic buffering
ESRI.ArcGIS.Client.Tasks.BufferParameters bufferParams = new ESRI.ArcGIS.Client.Tasks.BufferParameters()
{
BufferSpatialReference = new SpatialReference(4326),
OutSpatialReference = Map.SpatialReference,
Unit = LinearUnit.Foot,
};
bufferParams.Distances.Add(Int32.Parse(BufferLineSelectDistanceTextBox.Text));
bufferParams.Features.Add(graphic);
_geometryService.BufferAsync(bufferParams);
}
void GeometryService_BufferLineCompleted(object sender, GraphicsEventArgs args)
{
Graphic bufferGraphic = new Graphic();
bufferGraphic.Geometry = args.Results[0].Geometry;
bufferGraphic.Symbol = LayoutRoot.Resources["BufferSymbol"] as ESRI.ArcGIS.Client.Symbols.Symbol;
bufferGraphic.SetZIndex(1);
_lineAndBufferGraphicsLayer.Graphics.Add(bufferGraphic);
ESRI.ArcGIS.Client.Tasks.Query query = new ESRI.ArcGIS.Client.Tasks.Query();
query.ReturnGeometry = true;
query.OutSpatialReference = Map.SpatialReference;
query.Geometry = bufferGraphic.Geometry;
query.OutFields.Add("*");
_queryTask.ExecuteAsync(query);
}
private void BuffLineQueryTask_ExecuteCompleted(object sender, ESRI.ArcGIS.Client.Tasks.QueryEventArgs args)
{
FeatureSet featureSet = args.FeatureSet;
if (featureSet == null || featureSet.Features.Count < 1)
{
MessageBox.Show("No features retured from query");
return;
}
GraphicsLayer graphicsLayer = Map.Layers["MySelectionGraphicsLayer"] as GraphicsLayer;
if (featureSet != null && featureSet.Features.Count > 0)
{
foreach (Graphic feature in featureSet.Features)
{
switch (featureSet.GeometryType.ToString())
{
case "Polygon":
feature.Symbol = LayoutRoot.Resources["ResultsFillSymbol"] as FillSymbol;
break;
case "Polyline":
feature.Symbol = LayoutRoot.Resources["CustomGrowLineSymbol"] as LineSymbol;
break;
case "Point":
feature.Symbol = LayoutRoot.Resources["ResultsMarkerSymbol"] as SimpleMarkerSymbol;
break;
}
graphicsLayer.Graphics.Insert(0, feature);
}
ResultsDisplay.IsExpanded = true;
}
MyDrawSurface.IsEnabled = false;
}
private void BuffLineSelectGeometryService_Failed(object sender, TaskFailedEventArgs args)
{
MessageBox.Show("Geometry service failed: " + args.Error);
}
private void BuffLineQueryTask_Failed(object sender, TaskFailedEventArgs args)
{
MessageBox.Show("Query failed: " + args.Error);
}