This sample demonstrates using the ArcGIS Runtime SDK for WPF to perform a geometry operation 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.LocalOffset"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="-15000000,2000000,-7000000,8000000"Background="#FFE3E3E3"><esri:ArcGISLocalTiledLayerID="BaseMap"Path="..\\Data\\TPKs\\Topographic.tpk"/><esri:GraphicsLayerID="ParcelsGraphicsLayer"x:Name="_ParcelsGraphicsLayer"/><esri:GraphicsLayerID="OffsetGraphicsLayer"x:Name="_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.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using ESRI.ArcGIS.Client;
using ESRI.ArcGIS.Client.Tasks;
using ESRI.ArcGIS.Client.Local;
namespace ArcGISWPFSDK
{
publicpartialclass LocalOffset : UserControl
{
private Draw _drawObject;
GeometryService _geometryTask;
public LocalOffset()
{
InitializeComponent();
MyMap.Layers.LayersInitialized += (s, e) =>
{
LocalMapService.GetServiceAsync("..\\Data\\MPKS\\USCitiesStates.mpk", (localMapService) =>
{
QueryTask _queryTask = new QueryTask();
_queryTask.Url = localMapService.UrlMapService + "/2";
Query query = new Query();
query.Geometry = MyMap.Extent;
query.ReturnGeometry = true;
query.OutSpatialReference = MyMap.SpatialReference;
_queryTask.ExecuteCompleted += queryTask_ExecuteCompleted;
_queryTask.Failed += queryTask_Failed;
_queryTask.ExecuteAsync(query);
});
_drawObject = new Draw(MyMap)
{
DrawMode = DrawMode.Point,
IsEnabled = false,
};
_drawObject.DrawComplete += DrawObject_DrawComplete;
};
LocalGeometryService.GetServiceAsync(lgs =>
{
_geometryTask = new GeometryService();
_geometryTask.Url = lgs.UrlGeometryService;
_geometryTask.OffsetCompleted += GeometryService_OffsetCompleted;
_geometryTask.Failed += GeometryService_Failed;
});
}
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;
_ParcelsGraphicsLayer.Graphics.Add(g);
}
_drawObject.IsEnabled = true;
}
privatevoid DrawObject_DrawComplete(object sender, DrawEventArgs args)
{
_drawObject.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 =
_ParcelsGraphicsLayer.FindGraphicsInHostCoordinates(transformScreenPnt);
List<Graphic> selectedList = selected.ToList();
if (selectedList.Count < 1)
{
_drawObject.IsEnabled = true;
return;
}
OffsetParameters offsetParameters = new OffsetParameters()
{
BevelRatio = 1.1,
OffsetDistance = -300,
OffsetHow = GeometryOffset.Bevelled,
OffsetUnit = LinearUnit.Kilometer,
Simplify = true
};
_geometryTask.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);
}
_drawObject.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
Imports ESRI.ArcGIS.Client.Local
Namespace ArcGISWPFSDK
PartialPublicClass LocalOffset
Inherits UserControl
Private MyDrawObject As Draw
Private parcelGraphicsLayer As GraphicsLayer
Private offsetGraphicsLayer As GraphicsLayer
Private _geometryService As GeometryService
Private _queryTask As QueryTask
Private _mapService As LocalMapService
PublicSubNew()
InitializeComponent()
LocalMapService.GetServiceAsync("..\Data\MPKS\USCitiesStates.mpk", Function(localMapService__1)
_mapService = localMapService__1
_queryTask = New QueryTask()
_queryTask.Url = _mapService.UrlMapService & "/2"Dim query AsNew Query()
query.Geometry = MyMap.Extent
query.ReturnGeometry = True
query.OutSpatialReference = MyMap.SpatialReference
AddHandler _queryTask.ExecuteCompleted, AddressOf queryTask_ExecuteCompleted
AddHandler _queryTask.Failed, AddressOf queryTask_Failed
_queryTask.ExecuteAsync(query)
EndFunction)
Dim localGeometryService AsNew LocalGeometryService()
AddHandler localGeometryService.StartCompleted, Function(sender, eventargs)
Dim lgs As LocalGeometryService = TryCast(sender, LocalGeometryService)
_geometryService = New GeometryService()
_geometryService.Url = lgs.UrlGeometryService
MyMap.IsEnabled = TrueAddHandler _geometryService.OffsetCompleted, AddressOf GeometryService_OffsetCompleted
AddHandler _geometryService.Failed, AddressOf GeometryService_Failed
MyDrawObject = New Draw(MyMap) With { _
.DrawMode = DrawMode.Point, _
.IsEnabled = False _
}
AddHandler MyDrawObject.DrawComplete, AddressOf MyDrawObject_DrawComplete
EndFunction
localGeometryService.StartAsync()
parcelGraphicsLayer = TryCast(MyMap.Layers("ParcelsGraphicsLayer"), GraphicsLayer)
offsetGraphicsLayer = TryCast(MyMap.Layers("OffsetGraphicsLayer"), GraphicsLayer)
EndSubPrivateSub 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 = TrueReturnEndIfDim offsetParameters AsNew OffsetParameters() With { _
.BevelRatio = 1.1, _
.OffsetDistance = -300, _
.OffsetHow = GeometryOffset.Bevelled, _
.OffsetUnit = LinearUnit.Kilometer, _
.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