This sample demonstrates using an ESRI.ArcGIS.Client.Tasks GeometryService that takes graphic polyline with numerous vertices and returns a generalized polyline with less vertices. Additionally a SliderControl appears after the GeometryService completes that allows adjusting the opacity of the generalized polyline graphics layer for ease of viewing.
To use the sample, click the Generalize Line button to generalize the line feature. Original line and vertices are red. Generalized line a vertices are cyan. Use the slider to change the opacity of the generalized line. Zoom in on the graphics to see in better detail the difference between the original polyline and the generalized line.
<UserControlx:Class="ArcGISWPFSDK.Generalize"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:SimpleMarkerSymbolx:Key="DefaultMarkerSymbol"Color="Red"Size="6"/><esri:SimpleMarkerSymbolx:Key="NewMarkerSymbol"Color="#FF00FFFF"Size="6"/><esri:SimpleLineSymbolx:Key="DefaultLineSymbol"Color="#AAFF0000"Width="2"/><esri:SimpleLineSymbolx:Key="NewLineSymbol"Color="#AA00FFFF"Width="2"/><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="-12000000,3000000,-7000000,7000000"><esri:ArcGISTiledMapServiceLayerID="StreetMapLayer"Url="http://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer"/><esri:GraphicsLayerID="OriginalLineGraphicsLayer"/><esri:GraphicsLayerID="GeneralizedLineGraphicsLayer"/></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"/><StackPanelOrientation="Vertical"Margin="30,20,20,30"><TextBlockx:Name="ResponseTextBlock"Text="Click the Generalize Line button to generalize the line feature. Original line and vertices are red. Generalized line a vertices are cyan. Use the slider to change the opacity of the generalized line."Width="400"TextAlignment="Left"TextWrapping="Wrap"/><StackPanelOrientation="Horizontal"HorizontalAlignment="Center"><ButtonContent="Generalize Line"Margin="0,5,5,0"x:Name="GeneralizeButton"Click="GeneralizeButton_Click"IsEnabled="False"/></StackPanel><StackPanelx:Name="SliderStackPanel"Margin="5,5,5,5"Orientation="Horizontal"HorizontalAlignment="Center"Visibility="Collapsed"><TextBlockFontSize="9"Foreground="Black"Text="0"/><Sliderx:Name="GeneralizeLayersOpacity"Minimum="0"Maximum="1"SmallChange="0.01"LargeChange="0.1"Value="0.75"Orientation="Horizontal"ValueChanged="GeneralizeLayerOpacity_ValueChanged"Width="120"/><TextBlockFontSize="9"Foreground="Black"Text="100"/></StackPanel></StackPanel></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.Documents;
using ESRI.ArcGIS.Client.Tasks;
using ESRI.ArcGIS.Client;
using ESRI.ArcGIS.Client.Geometry;
namespace ArcGISWPFSDK
{
publicpartialclass Generalize : UserControl
{
GraphicsLayer originalGraphicsLayer;
public Generalize()
{
InitializeComponent();
MyMap.Layers.LayersInitialized += Layers_LayersInitialized;
originalGraphicsLayer = MyMap.Layers["OriginalLineGraphicsLayer"] as GraphicsLayer;
}
void Layers_LayersInitialized(object sender, EventArgs args)
{
if (originalGraphicsLayer != null && originalGraphicsLayer.Graphics.Count == 0)
{
QueryTask queryTask =
new QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/1");
Query query = new Query();
query.ReturnGeometry = true;
query.OutSpatialReference = MyMap.SpatialReference;
query.Where = "NAME = 'Mississippi'";
queryTask.ExecuteCompleted += queryTask_ExecuteCompleted;
queryTask.Failed += queryTask_Failed;
queryTask.ExecuteAsync(query, query.OutSpatialReference);
}
}
void queryTask_Failed(object sender, TaskFailedEventArgs e)
{
MessageBox.Show("Query error: " + e.Error);
}
void queryTask_ExecuteCompleted(object sender, QueryEventArgs e)
{
GraphicsLayer originalGraphicsLayer = MyMap.Layers["OriginalLineGraphicsLayer"] as GraphicsLayer;
foreach (Graphic g in e.FeatureSet.Features)
{
g.Symbol = LayoutRoot.Resources["DefaultLineSymbol"] as ESRI.ArcGIS.Client.Symbols.Symbol;
g.Geometry.SpatialReference = e.UserState as SpatialReference;
originalGraphicsLayer.Graphics.Add(g);
foreach (ESRI.ArcGIS.Client.Geometry.PointCollection pc in (g.Geometry as Polyline).Paths)
{
foreach (MapPoint point in pc)
{
Graphic vertice = new Graphic()
{
Symbol = LayoutRoot.Resources["DefaultMarkerSymbol"] as ESRI.ArcGIS.Client.Symbols.Symbol,
Geometry = point
};
originalGraphicsLayer.Graphics.Add(vertice);
}
}
}
GeneralizeButton.IsEnabled = true;
}
privatevoid GeneralizeButton_Click(object sender, RoutedEventArgs e)
{
GeneralizeButton.IsEnabled = false;
SliderStackPanel.Visibility = Visibility.Collapsed;
GraphicsLayer originalGraphicsLayer = MyMap.Layers["OriginalLineGraphicsLayer"] as GraphicsLayer;
GeometryService geometryService =
new GeometryService("http://tasks.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer");
geometryService.GeneralizeCompleted += GeometryService_GeneralizeCompleted;
geometryService.Failed += GeometryService_Failed;
GeneralizeParameters generalizeParameters = new GeneralizeParameters()
{
DeviationUnit = LinearUnit.SurveyMile,
MaxDeviation = 10
};
geometryService.GeneralizeAsync(new List<Graphic>() { originalGraphicsLayer.Graphics[0] }, generalizeParameters);
}
void GeometryService_GeneralizeCompleted(object sender, GraphicsEventArgs e)
{
GraphicsLayer generalizedGraphicsLayer = MyMap.Layers["GeneralizedLineGraphicsLayer"] as GraphicsLayer;
generalizedGraphicsLayer.ClearGraphics();
foreach (Graphic g in e.Results)
{
g.Symbol = LayoutRoot.Resources["NewLineSymbol"] as ESRI.ArcGIS.Client.Symbols.Symbol;
generalizedGraphicsLayer.Graphics.Add(g);
ESRI.ArcGIS.Client.Geometry.Polyline p = g.Geometry as ESRI.ArcGIS.Client.Geometry.Polyline;
foreach (ESRI.ArcGIS.Client.Geometry.PointCollection pc in p.Paths)
{
foreach (MapPoint point in pc)
{
Graphic vertice = new Graphic()
{
Symbol = LayoutRoot.Resources["NewMarkerSymbol"] as ESRI.ArcGIS.Client.Symbols.Symbol,
Geometry = point
};
generalizedGraphicsLayer.Graphics.Add(vertice);
}
}
}
generalizedGraphicsLayer.Opacity = 0.75;
SliderStackPanel.Visibility = Visibility.Visible;
GeneralizeButton.IsEnabled = true;
}
privatevoid GeometryService_Failed(object sender, TaskFailedEventArgs e)
{
MessageBox.Show("Geometry Service error: " + e.Error);
}
privatevoid GeneralizeLayerOpacity_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (MyMap != null)
MyMap.Layers["GeneralizedLineGraphicsLayer"].Opacity = e.NewValue;
}
}
}
Imports System.Collections.Generic
Imports System.Linq
Imports System.Net
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Documents
Imports ESRI.ArcGIS.Client.Tasks
Imports ESRI.ArcGIS.Client
Imports ESRI.ArcGIS.Client.Geometry
Namespace ArcGISWPFSDK
PartialPublicClass Generalize
Inherits UserControl
Private originalGraphicsLayer As GraphicsLayer
PublicSubNew()
InitializeComponent()
AddHandler MyMap.Layers.LayersInitialized, AddressOf Layers_LayersInitialized
originalGraphicsLayer = TryCast(MyMap.Layers("OriginalLineGraphicsLayer"), GraphicsLayer)
EndSubPrivateSub Layers_LayersInitialized(sender AsObject, args As EventArgs)
If originalGraphicsLayer IsNotNothingAndAlso originalGraphicsLayer.Graphics.Count = 0 ThenDim queryTask AsNew QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/1")
Dim query AsNew Query()
query.ReturnGeometry = True
query.OutSpatialReference = MyMap.SpatialReference
query.Where = "NAME = 'Mississippi'"AddHandler queryTask.ExecuteCompleted, AddressOf queryTask_ExecuteCompleted
AddHandler queryTask.Failed, AddressOf queryTask_Failed
queryTask.ExecuteAsync(query, query.OutSpatialReference)
EndIfEndSubPrivateSub queryTask_Failed(sender AsObject, e As TaskFailedEventArgs)
MessageBox.Show("Query error: " & Convert.ToString(e.[Error]))
EndSubPrivateSub queryTask_ExecuteCompleted(sender AsObject, e As QueryEventArgs)
Dim originalGraphicsLayer As GraphicsLayer = TryCast(MyMap.Layers("OriginalLineGraphicsLayer"), GraphicsLayer)
ForEach g As Graphic In e.FeatureSet.Features
g.Symbol = TryCast(LayoutRoot.Resources("DefaultLineSymbol"), ESRI.ArcGIS.Client.Symbols.Symbol)
g.Geometry.SpatialReference = TryCast(e.UserState, SpatialReference)
originalGraphicsLayer.Graphics.Add(g)
ForEach pc As ESRI.ArcGIS.Client.Geometry.PointCollection In TryCast(g.Geometry, Polyline).Paths
ForEach point As MapPoint In pc
Dim vertice AsNew Graphic() With { _
.Symbol = TryCast(LayoutRoot.Resources("DefaultMarkerSymbol"), ESRI.ArcGIS.Client.Symbols.Symbol), _
.Geometry = point _
}
originalGraphicsLayer.Graphics.Add(vertice)
NextNextNext
GeneralizeButton.IsEnabled = TrueEndSubPrivateSub GeneralizeButton_Click(sender AsObject, e As RoutedEventArgs)
GeneralizeButton.IsEnabled = False
SliderStackPanel.Visibility = Visibility.Collapsed
Dim originalGraphicsLayer As GraphicsLayer = TryCast(MyMap.Layers("OriginalLineGraphicsLayer"), GraphicsLayer)
Dim geometryService AsNew GeometryService("http://tasks.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer")
AddHandler geometryService.GeneralizeCompleted, AddressOf GeometryService_GeneralizeCompleted
AddHandler geometryService.Failed, AddressOf GeometryService_Failed
Dim generalizeParameters AsNew GeneralizeParameters() With { _
.DeviationUnit = LinearUnit.SurveyMile, _
.MaxDeviation = 10 _
}
geometryService.GeneralizeAsync(New List(Of Graphic)() From { _
originalGraphicsLayer.Graphics(0) _
}, generalizeParameters)
EndSubPrivateSub GeometryService_GeneralizeCompleted(sender AsObject, e As GraphicsEventArgs)
Dim generalizedGraphicsLayer As GraphicsLayer = TryCast(MyMap.Layers("GeneralizedLineGraphicsLayer"), GraphicsLayer)
generalizedGraphicsLayer.ClearGraphics()
ForEach g As Graphic In e.Results
g.Symbol = TryCast(LayoutRoot.Resources("NewLineSymbol"), ESRI.ArcGIS.Client.Symbols.Symbol)
generalizedGraphicsLayer.Graphics.Add(g)
Dim p As ESRI.ArcGIS.Client.Geometry.Polyline = TryCast(g.Geometry, ESRI.ArcGIS.Client.Geometry.Polyline)
ForEach pc As ESRI.ArcGIS.Client.Geometry.PointCollection In p.Paths
ForEach point As MapPoint In pc
Dim vertice AsNew Graphic() With { _
.Symbol = TryCast(LayoutRoot.Resources("NewMarkerSymbol"), ESRI.ArcGIS.Client.Symbols.Symbol), _
.Geometry = point _
}
generalizedGraphicsLayer.Graphics.Add(vertice)
NextNextNext
generalizedGraphicsLayer.Opacity = 0.75
SliderStackPanel.Visibility = Visibility.Visible
GeneralizeButton.IsEnabled = TrueEndSubPrivateSub GeometryService_Failed(sender AsObject, e As TaskFailedEventArgs)
MessageBox.Show("Geometry Service error: " & Convert.ToString(e.[Error]))
EndSubPrivateSub GeneralizeLayerOpacity_ValueChanged(sender AsObject, e As RoutedPropertyChangedEventArgs(Of Double))
If MyMap IsNotNothingThen
MyMap.Layers("GeneralizedLineGraphicsLayer").Opacity = e.NewValue
EndIfEndSubEndClassEndNamespace