Click or drag to resize

GeometryEngineBufferGeodetic Method (Geometry, Double, LinearUnit, Double, GeodeticCurveType)

Performs a geodesic buffer operation on a single geometry.

Namespace:  Esri.ArcGISRuntime.Geometry
Assembly:  Esri.ArcGISRuntime (in Esri.ArcGISRuntime.dll) Version: 100.9.0
Syntax
public static Geometry BufferGeodetic(
	Geometry geometry,
	double distance,
	LinearUnit unit,
	double maxDeviation = NaN,
	GeodeticCurveType geodeticCurveType = GeodeticCurveType.Geodesic
)

Parameters

geometry
Type: Esri.ArcGISRuntime.GeometryGeometry
The geometry to buffer.
distance
Type: SystemDouble
The distance to buffer.
unit
Type: Esri.ArcGISRuntime.GeometryLinearUnit
The unit of distance.
maxDeviation (Optional)
Type: SystemDouble
The maximum deviation between points.
geodeticCurveType (Optional)
Type: Esri.ArcGISRuntime.GeometryGeodeticCurveType
The curve type to calculate.

Return Value

Type: Geometry
A Geometry object.
Examples

WPF

Example Name: Buffer

Create a buffer around a map point and display the results as a `Graphic`

Code example screen shot.

C#
// Copyright 2018 Esri.
// 
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
// You may obtain a copy of the License at: http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
// language governing permissions and limitations under the License.

using System.Windows;
using Esri.ArcGISRuntime.Geometry;
using Esri.ArcGISRuntime.Mapping;
using Esri.ArcGISRuntime.Symbology;
using Esri.ArcGISRuntime.UI;
using System.Drawing;

namespace ArcGISRuntime.WPF.Samples.Buffer
{
    [ArcGISRuntime.Samples.Shared.Attributes.Sample(
        name: "Buffer",
        category: "Geometry",
        description: "Create a buffer around a map point and display the results as a `Graphic`",
        instructions: "1. Tap on the map.",
        tags: new[] { "analysis", "buffer", "euclidean", "geodesic", "geometry", "planar" })]
    public partial class Buffer
    {
        public Buffer()
        {
            InitializeComponent();

            // Initialize the map and graphics overlays.
            Initialize();
        }

        private void Initialize()
        {
            // Create a map with a topographic basemap and add it to the map view.
            MyMapView.Map = new Map(Basemap.CreateTopographic());

            // Handle the MapView's GeoViewTapped event to create buffers.
            MyMapView.GeoViewTapped += MyMapView_GeoViewTapped;

            // Create a fill symbol for geodesic buffer polygons.            
            Color geodesicBufferColor = Color.FromArgb(120, 255, 0, 0);
            SimpleLineSymbol geodesicOutlineSymbol = new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, geodesicBufferColor, 2);
            SimpleFillSymbol geodesicBufferFillSymbol = new SimpleFillSymbol(SimpleFillSymbolStyle.Solid, geodesicBufferColor, geodesicOutlineSymbol);

            // Create a fill symbol for planar buffer polygons.            
            Color planarBufferColor = Color.FromArgb(120, 0, 0, 255);
            SimpleLineSymbol planarOutlineSymbol = new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, planarBufferColor, 2);
            SimpleFillSymbol planarBufferFillSymbol = new SimpleFillSymbol(SimpleFillSymbolStyle.Solid, planarBufferColor, planarOutlineSymbol);

            // Create a marker symbol for tap locations.
            SimpleMarkerSymbol tapSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbolStyle.Cross, Color.White, 14);

            // Create a graphics overlay to display geodesic polygons, set its renderer and add it to the map view.
            GraphicsOverlay geodesicPolysOverlay = new GraphicsOverlay
            { 
                Id = "GeodesicPolys",
                Renderer = new SimpleRenderer(geodesicBufferFillSymbol)
            };
            MyMapView.GraphicsOverlays.Add(geodesicPolysOverlay);

            // Create a graphics overlay to display planar polygons, set its renderer and add it to the map view.
            GraphicsOverlay planarPolysOverlay = new GraphicsOverlay
            {
                Id = "PlanarPolys",
                Renderer = new SimpleRenderer(planarBufferFillSymbol)
            };
            MyMapView.GraphicsOverlays.Add(planarPolysOverlay);

            // Create a graphics overlay to display tap locations for buffers, set its renderer and add it to the map view.
            GraphicsOverlay tapLocationsOverlay = new GraphicsOverlay
            {
                Id = "TapPoints",
                Renderer = new SimpleRenderer(tapSymbol)
            };
            MyMapView.GraphicsOverlays.Add(tapLocationsOverlay);

            // Show the colors for each type of buffer in the UI.
            ShowBufferSwatches(planarBufferColor, geodesicBufferColor);
        }

        private void MyMapView_GeoViewTapped(object sender, Esri.ArcGISRuntime.UI.Controls.GeoViewInputEventArgs e)
        {
            try
            {
                // Get the location tapped by the user (a map point in the WebMercator projected coordinate system).
                MapPoint userTapPoint = e.Location;

                // Get the buffer distance (miles) entered in the text box.
                double bufferInMiles = System.Convert.ToDouble(BufferDistanceMilesTextBox.Text);

                // Call a helper method to convert the input distance to meters.
                double bufferInMeters = LinearUnits.Miles.ToMeters(bufferInMiles);

                // Create a planar buffer graphic around the input location at the specified distance.
                Geometry bufferGeometryPlanar = GeometryEngine.Buffer(userTapPoint, bufferInMeters);
                Graphic planarBufferGraphic = new Graphic(bufferGeometryPlanar);

                // Create a geodesic buffer graphic using the same location and distance.
                Geometry bufferGeometryGeodesic = GeometryEngine.BufferGeodetic(userTapPoint, bufferInMeters, LinearUnits.Meters, double.NaN, GeodeticCurveType.Geodesic);
                Graphic geodesicBufferGraphic = new Graphic(bufferGeometryGeodesic);

                // Create a graphic for the user tap location.
                Graphic locationGraphic = new Graphic(userTapPoint); 

                // Get the graphics overlays.
                GraphicsOverlay planarBufferGraphicsOverlay = MyMapView.GraphicsOverlays["PlanarPolys"];
                GraphicsOverlay geodesicBufferGraphicsOverlay = MyMapView.GraphicsOverlays["GeodesicPolys"];
                GraphicsOverlay tapPointGraphicsOverlay = MyMapView.GraphicsOverlays["TapPoints"];

                // Add the buffer polygons and tap location graphics to the appropriate graphic overlays.
                planarBufferGraphicsOverlay.Graphics.Add(planarBufferGraphic);
                geodesicBufferGraphicsOverlay.Graphics.Add(geodesicBufferGraphic);
                tapPointGraphicsOverlay.Graphics.Add(locationGraphic);
            }
            catch (System.Exception ex)
            {
                // Display an error message if there is a problem generating the buffers.
                MessageBox.Show(ex.Message, "Error creating buffers");
            }
        }

        private void ShowBufferSwatches(Color planarBufferColor, Color geodesicBufferColor)
        {
            // Create an equivalent System.Windows.Media.Color for each of the buffer symbol colors (System.Drawing.Color).
            System.Windows.Media.Color planarLabelColor = System.Windows.Media.Color.FromArgb(
                planarBufferColor.A,
                planarBufferColor.R,
                planarBufferColor.G,
                planarBufferColor.B);
            System.Windows.Media.Color geodesicLabelColor = System.Windows.Media.Color.FromArgb(
                geodesicBufferColor.A,
                geodesicBufferColor.R,
                geodesicBufferColor.G,
                geodesicBufferColor.B);

            // Show buffer symbol colors in the UI by setting the appropriate Ellipse object fill color.
            BufferSwatchPlanarEllipse.Fill = new System.Windows.Media.SolidColorBrush(planarLabelColor);
            BufferSwatchGeodesicEllipse.Fill = new System.Windows.Media.SolidColorBrush(geodesicLabelColor);
        }

        private void ClearBuffersButton_Click(object sender, RoutedEventArgs e)
        {
            // Clear the buffer and point graphics.
            foreach (GraphicsOverlay ov in MyMapView.GraphicsOverlays)
            {
                ov.Graphics.Clear();
            }
        }
    }
}
XAML
<UserControl x:Class="ArcGISRuntime.WPF.Samples.Buffer.Buffer"
             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/runtime/2013">
    <Grid>
        <esri:MapView x:Name="MyMapView" />
        <Border Style="{StaticResource BorderStyle}">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <Label Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3"
                       HorizontalContentAlignment="Center"
                       FontWeight="SemiBold"
                       Content="Click the map to create planar and geodesic buffers." />
                <Label Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2"
                       HorizontalAlignment="Right"
                       Content="Buffer distance (miles):" />
                <TextBox x:Name="BufferDistanceMilesTextBox"
                         Grid.Row="1" Grid.Column="2"
                         TextAlignment="Right" VerticalContentAlignment="Center"
                         MinWidth="80"
                         Text="1000" />
                <Ellipse x:Name="BufferSwatchPlanarEllipse"
                         Grid.Row="2" Grid.Column="0"
                         Stroke="LightGray"
                         Width="20" Height="20" />
                <Label Grid.Row="2" Grid.Column="1"
                       HorizontalAlignment="Left"
                       Content="Planar buffers (Web Mercator)" />
                <Ellipse x:Name="BufferSwatchGeodesicEllipse"
                         Grid.Row="3" Grid.Column="0"
                         Stroke="LightGray"
                         Width="20" Height="20" />
                <Label Grid.Row="3" Grid.Column="1"
                       HorizontalAlignment="Left"
                       Content="Geodesic buffers" />
                <Button x:Name="ClearBuffersButton"
                        Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="3"
                        Margin="0,10,0,0"
                        Content="Clear"
                        Click="ClearBuffersButton_Click" />
            </Grid>
        </Border>
    </Grid>
</UserControl>
See Also
Additional Examples
Hyperlink to ExampleDescription
BufferCreate a buffer around a map point and display the results as a `Graphic`
GenerateOfflineMapWithOverridesTake a web map offline with additional options for each layer.
RouteAroundBarriersFind a route that reaches all stops without crossing any barriers.