This sample demonstrates using an ESRI.ArcGIS.Client.Tasks GeometryService that takes an input graphic polygon and returns a buffered (or offset) graphic polygon. To obtain the input graphic polygon, a user makes a single mouse click that generates a graphic which is turned into an MapPoint object. The MapPoint object has a SpatialReference applied and is used as an input into the FindGraphicsInHostCoordinates Method which generates the input graphic polygon.
To use the sample, click on a parcel to generate an offset (cyan).
<UserControlx:Class="ArcGISWPFSDK.Offset"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:esri="http://schemas.esri.com/arcgis/client/2009"><Gridx:Name="LayoutRoot"><Grid.Resources><esri:SimpleLineSymbolx:Key="RedLineSymbol"Color="Red"Width="4"Style="Solid"/><esri:SimpleFillSymbolx:Key="BlueFillSymbol"Fill="#990000FF"BorderBrush="Blue"/><esri:SimpleFillSymbolx:Key="CyanFillSymbol"Fill="#4400FFFF"BorderBrush="Cyan"/><LinearGradientBrushx:Key="PanelGradient"EndPoint="0.5,1"StartPoint="0.5,0"><LinearGradientBrush.RelativeTransform><TransformGroup><ScaleTransformCenterY="0.5"CenterX="0.5"/><SkewTransformCenterY="0.5"CenterX="0.5"/><RotateTransformAngle="176"CenterY="0.5"CenterX="0.5"/><TranslateTransform/></TransformGroup></LinearGradientBrush.RelativeTransform><GradientStopColor="#FF145787"Offset="0.16"/><GradientStopColor="#FF3D7FAC"Offset="0.502"/><GradientStopColor="#FF88C5EF"Offset="0.984"/></LinearGradientBrush></Grid.Resources><esri:Mapx:Name="MyMap"Extent="-9275076.4794,5253225.9406,-9274273.6411,5253885.6155"><esri:ArcGISTiledMapServiceLayerID="StreetMapLayer"Url="http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"/><esri:GraphicsLayerID="ParcelsGraphicsLayer"/><esri:GraphicsLayerID="OffsetGraphicsLayer"/></esri:Map><GridHorizontalAlignment="Right"VerticalAlignment="Top"Margin="0,10,10,0"><RectangleFill="{StaticResource PanelGradient}"Stroke="Gray"RadiusX="10"RadiusY="10"Margin="0,0,0,5"><Rectangle.Effect><DropShadowEffect/></Rectangle.Effect></Rectangle><RectangleFill="#FFFFFFFF"Stroke="DarkGray"RadiusX="5"RadiusY="5"Margin="10,10,10,15"/><TextBlockx:Name="ResponseTextBlock"Text="Click on a parcel to generate an offset (cyan)."Width="200"TextAlignment="Left"Margin="30,20,20,30"TextWrapping="Wrap"Foreground="Black"/></Grid></Grid></UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using ESRI.ArcGIS.Client;
using ESRI.ArcGIS.Client.Tasks;
using ESRI.ArcGIS.Client.Geometry;
namespace ArcGISWPFSDK
{
publicpartialclass Offset : UserControl
{
private Draw MyDrawObject;
private GraphicsLayer parcelGraphicsLayer;
private GraphicsLayer offsetGraphicsLayer;
private GeometryService geometryService;
public Offset()
{
InitializeComponent();
MyMap.Layers.LayersInitialized += Layers_LayersInitialized;
MyMap.MinimumResolution = double.Epsilon;
MyDrawObject = new Draw(MyMap)
{
DrawMode = DrawMode.Point,
IsEnabled = false,
};
MyDrawObject.DrawComplete += MyDrawObject_DrawComplete;
parcelGraphicsLayer = MyMap.Layers["ParcelsGraphicsLayer"] as GraphicsLayer;
offsetGraphicsLayer = MyMap.Layers["OffsetGraphicsLayer"] as GraphicsLayer;
}
void Layers_LayersInitialized(object sender, EventArgs args)
{
if (parcelGraphicsLayer != null && parcelGraphicsLayer.Graphics.Count == 0)
{
QueryTask queryTask =
new QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/TaxParcel/AssessorsParcelCharacteristics/MapServer/1");
Query query = new Query();
query.Geometry = new Envelope(-83.3188395774275, 42.61428312652851, -83.31295664068958, 42.61670913269855);
query.ReturnGeometry = true;
query.OutSpatialReference = MyMap.SpatialReference;
queryTask.ExecuteCompleted += queryTask_ExecuteCompleted;
queryTask.Failed += queryTask_Failed;
queryTask.ExecuteAsync(query);
}
}
void queryTask_Failed(object sender, TaskFailedEventArgs e)
{
MessageBox.Show("Query error: " + e.Error);
}
void queryTask_ExecuteCompleted(object sender, QueryEventArgs e)
{
foreach (Graphic g in e.FeatureSet.Features)
{
g.Symbol = LayoutRoot.Resources["BlueFillSymbol"] as ESRI.ArcGIS.Client.Symbols.Symbol;
g.Geometry.SpatialReference = MyMap.SpatialReference;
parcelGraphicsLayer.Graphics.Add(g);
}
MyDrawObject.IsEnabled = true;
}
privatevoid MyDrawObject_DrawComplete(object sender, DrawEventArgs args)
{
MyDrawObject.IsEnabled = false;
offsetGraphicsLayer.ClearGraphics();
ESRI.ArcGIS.Client.Geometry.MapPoint point = args.Geometry as ESRI.ArcGIS.Client.Geometry.MapPoint;
point.SpatialReference = MyMap.SpatialReference;
System.Windows.Point screenPnt = MyMap.MapToScreen(point);
// Account for difference between Map and application origin
GeneralTransform generalTransform = MyMap.TransformToVisual(Application.Current.MainWindow);
System.Windows.Point transformScreenPnt = generalTransform.Transform(screenPnt);
IEnumerable<Graphic> selected =
parcelGraphicsLayer.FindGraphicsInHostCoordinates(transformScreenPnt);
List<Graphic> selectedList = selected.ToList();
if (selectedList.Count < 1)
{
MyDrawObject.IsEnabled = true;
return;
}
geometryService =
new GeometryService("http://tasks.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer");
geometryService.OffsetCompleted += GeometryService_OffsetCompleted;
geometryService.Failed += GeometryService_Failed;
OffsetParameters offsetParameters = new OffsetParameters()
{
BevelRatio = 1.1,
OffsetDistance = -30,
OffsetHow = GeometryOffset.Bevelled,
OffsetUnit = LinearUnit.Meter,
Simplify = true
};
geometryService.OffsetAsync(selectedList, offsetParameters);
}
void GeometryService_OffsetCompleted(object sender, GraphicsEventArgs e)
{
foreach (Graphic g in e.Results)
{
g.Symbol = LayoutRoot.Resources["CyanFillSymbol"] as ESRI.ArcGIS.Client.Symbols.Symbol;
offsetGraphicsLayer.Graphics.Add(g);
}
MyDrawObject.IsEnabled = true;
}
privatevoid GeometryService_Failed(object sender, TaskFailedEventArgs e)
{
MessageBox.Show("Geometry Service error: " + e.Error);
}
}
}
Imports System.Collections.Generic
Imports System.Linq
Imports System.Net
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports ESRI.ArcGIS.Client
Imports ESRI.ArcGIS.Client.Tasks
Imports ESRI.ArcGIS.Client.Geometry
Namespace ArcGISWPFSDK
PartialPublicClass Offset
Inherits UserControl
Private MyDrawObject As Draw
Private parcelGraphicsLayer As GraphicsLayer
Private offsetGraphicsLayer As GraphicsLayer
Private geometryService As GeometryService
PublicSubNew()
InitializeComponent()
AddHandler MyMap.Layers.LayersInitialized, AddressOf Layers_LayersInitialized
MyMap.MinimumResolution = Double.Epsilon
MyDrawObject = New Draw(MyMap) With { _
.DrawMode = DrawMode.Point, _
.IsEnabled = False _
}
AddHandler MyDrawObject.DrawComplete, AddressOf MyDrawObject_DrawComplete
parcelGraphicsLayer = TryCast(MyMap.Layers("ParcelsGraphicsLayer"), GraphicsLayer)
offsetGraphicsLayer = TryCast(MyMap.Layers("OffsetGraphicsLayer"), GraphicsLayer)
EndSubPrivateSub Layers_LayersInitialized(sender AsObject, args As EventArgs)
If parcelGraphicsLayer IsNotNothingAndAlso parcelGraphicsLayer.Graphics.Count = 0 ThenDim queryTask AsNew QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/TaxParcel/AssessorsParcelCharacteristics/MapServer/1")
Dim query AsNew Query()
query.Geometry = New Envelope(-83.3188395774275, 42.6142831265285, -83.3129566406896, 42.6167091326986)
query.ReturnGeometry = True
query.OutSpatialReference = MyMap.SpatialReference
AddHandler queryTask.ExecuteCompleted, AddressOf queryTask_ExecuteCompleted
AddHandler queryTask.Failed, AddressOf queryTask_Failed
queryTask.ExecuteAsync(query)
EndIfEndSubPrivateSub queryTask_Failed(sender AsObject, e As TaskFailedEventArgs)
MessageBox.Show("Query error: " & Convert.ToString(e.[Error]))
EndSubPrivateSub queryTask_ExecuteCompleted(sender AsObject, e As QueryEventArgs)
ForEach g As Graphic In e.FeatureSet.Features
g.Symbol = TryCast(LayoutRoot.Resources("BlueFillSymbol"), ESRI.ArcGIS.Client.Symbols.Symbol)
g.Geometry.SpatialReference = MyMap.SpatialReference
parcelGraphicsLayer.Graphics.Add(g)
Next
MyDrawObject.IsEnabled = TrueEndSubPrivateSub MyDrawObject_DrawComplete(sender AsObject, args As DrawEventArgs)
MyDrawObject.IsEnabled = False
offsetGraphicsLayer.ClearGraphics()
Dim point As ESRI.ArcGIS.Client.Geometry.MapPoint = TryCast(args.Geometry, ESRI.ArcGIS.Client.Geometry.MapPoint)
point.SpatialReference = MyMap.SpatialReference
Dim screenPnt As System.Windows.Point = MyMap.MapToScreen(point)
' Account for difference between Map and application originDim generalTransform As GeneralTransform = MyMap.TransformToVisual(Application.Current.MainWindow)
Dim transformScreenPnt As System.Windows.Point = generalTransform.Transform(screenPnt)
Dim selected As IEnumerable(Of Graphic) = parcelGraphicsLayer.FindGraphicsInHostCoordinates(transformScreenPnt)
Dim selectedList As List(Of Graphic) = selected.ToList()
If selectedList.Count < 1 Then
MyDrawObject.IsEnabled = TrueReturnEndIf
geometryService = New GeometryService("http://tasks.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer")
AddHandler geometryService.OffsetCompleted, AddressOf GeometryService_OffsetCompleted
AddHandler geometryService.Failed, AddressOf GeometryService_Failed
Dim offsetParameters AsNew OffsetParameters() With { _
.BevelRatio = 1.1, _
.OffsetDistance = -30, _
.OffsetHow = GeometryOffset.Bevelled, _
.OffsetUnit = LinearUnit.Meter, _
.Simplify = True _
}
geometryService.OffsetAsync(selectedList, offsetParameters)
EndSubPrivateSub GeometryService_OffsetCompleted(sender AsObject, e As GraphicsEventArgs)
ForEach g As Graphic In e.Results
g.Symbol = TryCast(LayoutRoot.Resources("CyanFillSymbol"), ESRI.ArcGIS.Client.Symbols.Symbol)
offsetGraphicsLayer.Graphics.Add(g)
Next
MyDrawObject.IsEnabled = TrueEndSubPrivateSub GeometryService_Failed(sender AsObject, e As TaskFailedEventArgs)
MessageBox.Show("Geometry Service error: " & Convert.ToString(e.[Error]))
EndSubEndClassEndNamespace