Click or drag to resize

GeometryEngineCrosses Method

Returns true if geometry1 crosses geometry2.

Namespace:  Esri.ArcGISRuntime.Geometry
Assembly:  Esri.ArcGISRuntime (in Esri.ArcGISRuntime.dll) Version: 100.9.0
public static bool Crosses(
	Geometry geometry1,
	Geometry geometry2


Type: Esri.ArcGISRuntime.GeometryGeometry
The first geometry to calculate intersection with.
Type: Esri.ArcGISRuntime.GeometryGeometry
The second geometry to calculate intersection with.

Return Value

Type: Boolean
true if the geometry1 crosses geometry2.

This method is one of several that determines the spatial relationship between two geometries. If the spatial relationship exists between the two input geometries then true is returned. If the spatial relationship does not exist between the two input geometries then false is returned. The spatial relationship test used by this method is based on the Dimensionally Extended 9 Intersection Model (DE-9IM) developed Clementini, et al., and is discussed further in the web pages: DE-9IM and Understanding spatial relations.

The GeometryEngine.Crosses Method returns true if an intersection results in a geometry whose dimension is one less than the maximum dimension of the two source geometries and the intersection set is interior to both source geometries. This method returns true only for the following combinations of geometries: MultiPoint/Polygon, MultiPoint/Polyline, Polyline/Polyline, and Polyline/Polygon comparisons. The following is a visual example of when this method returns true:

GeometryEngine.Crosses visual examples.



Example Name: SpatialRelationships

Determine spatial relationships between two geometries.

Code example screen shot.

// 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:
// 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;
using Esri.ArcGISRuntime.Data;
using Esri.ArcGISRuntime.Geometry;
using Esri.ArcGISRuntime.Mapping;
using Esri.ArcGISRuntime.Symbology;
using Esri.ArcGISRuntime.UI;
using Esri.ArcGISRuntime.UI.Controls;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows;

namespace ArcGISRuntime.WPF.Samples.SpatialRelationships
        name: "Spatial relationships",
        category: "Geometry",
        description: "Determine spatial relationships between two geometries.",
        instructions: "Select one of the three graphics. The tree view will list the relationships the selected graphic has to the other graphic geometries.",
        tags: new[] { "geometries", "relationship", "spatial analysis" })]
    public partial class SpatialRelationships
        // References to the graphics and graphics overlay
        private GraphicsOverlay _graphicsOverlay;
        private Graphic _polygonGraphic;
        private Graphic _polylineGraphic;
        private Graphic _pointGraphic;

        public SpatialRelationships()


        private void Initialize()
            // Configure the basemap
            MyMapView.Map = new Map(Basemap.CreateTopographic());

            // Create the graphics overlay
            _graphicsOverlay = new GraphicsOverlay();

            // Add the overlay to the MapView

            // Create the point collection that defines the polygon
            PointCollection polygonPoints = new PointCollection(SpatialReferences.WebMercator)
                new MapPoint(-5991501.677830, 5599295.131468),
                new MapPoint(-6928550.398185, 2087936.739807),
                new MapPoint(-3149463.800709, 1840803.011362),
                new MapPoint(-1563689.043184, 3714900.452072),
                new MapPoint(-3180355.516764, 5619889.608838)

            // Create the polygon
            Polygon polygonGeometry = new Polygon(polygonPoints);

            // Define the symbology of the polygon
            SimpleLineSymbol polygonOutlineSymbol = new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, System.Drawing.Color.Green, 2);
            SimpleFillSymbol polygonFillSymbol = new SimpleFillSymbol(SimpleFillSymbolStyle.ForwardDiagonal, System.Drawing.Color.Green, polygonOutlineSymbol);

            // Create the polygon graphic and add it to the graphics overlay
            _polygonGraphic = new Graphic(polygonGeometry, polygonFillSymbol);

            // Create the point collection that defines the polyline
            PointCollection polylinePoints = new PointCollection(SpatialReferences.WebMercator)
                new MapPoint(-4354240.726880, -609939.795721),
                new MapPoint(-3427489.245210, 2139422.933233),
                new MapPoint(-2109442.693501, 4301843.057130),
                new MapPoint(-1810822.771630, 7205664.366363)

            // Create the polyline
            Polyline polylineGeometry = new Polyline(polylinePoints);

            // Create the polyline graphic and add it to the graphics overlay
            _polylineGraphic = new Graphic(polylineGeometry, new SimpleLineSymbol(SimpleLineSymbolStyle.Dash, System.Drawing.Color.Red, 4));

            // Create the point geometry that defines the point graphic
            MapPoint pointGeometry = new MapPoint(-4487263.495911, 3699176.480377, SpatialReferences.WebMercator);

            // Define the symbology for the point
            SimpleMarkerSymbol locationMarker = new SimpleMarkerSymbol(SimpleMarkerSymbolStyle.Circle, System.Drawing.Color.Blue, 10);

            // Create the point graphic and add it to the graphics overlay
            _pointGraphic = new Graphic(pointGeometry, locationMarker);

            // Update the selection color.
            MyMapView.SelectionProperties.Color = Color.Yellow;

            // Listen for taps; the spatial relationships will be updated in the handler
            MyMapView.GeoViewTapped += MapViewTapped;

            // Set the viewpoint to center on the point
            MyMapView.SetViewpointCenterAsync(pointGeometry, 200000000);

        private async void MapViewTapped(object sender, GeoViewInputEventArgs geoViewInputEventArgs)
            IdentifyGraphicsOverlayResult result = null;

                // Identify the tapped graphics
                result = await MyMapView.IdentifyGraphicsOverlayAsync(_graphicsOverlay, geoViewInputEventArgs.Position, 1, false);
            catch (Exception e)
                MessageBox.Show(e.ToString(), "Error");

            // Return if there are no results
            if (result == null || result.Graphics.Count < 1)

            // Get the first identified graphic
            Graphic identifiedGraphic = result.Graphics.First();

            // Clear any existing selection, then select the tapped graphic
            identifiedGraphic.IsSelected = true;

            // Get the selected graphic's geometry
            Geometry selectedGeometry = identifiedGraphic.Geometry;

            // Update the spatial relationship display
            switch (selectedGeometry.GeometryType)
                case GeometryType.Point:
                    PointTreeEntry.ItemsSource = null;
                    PolygonTreeEntry.ItemsSource = GetSpatialRelationships(selectedGeometry, _polygonGraphic.Geometry);
                    PolylineTreeEntry.ItemsSource = GetSpatialRelationships(selectedGeometry, _polylineGraphic.Geometry);

                case GeometryType.Polygon:
                    PolygonTreeEntry.ItemsSource = null;
                    PointTreeEntry.ItemsSource = GetSpatialRelationships(selectedGeometry, _pointGraphic.Geometry);
                    PolylineTreeEntry.ItemsSource = GetSpatialRelationships(selectedGeometry, _polylineGraphic.Geometry);

                case GeometryType.Polyline:
                    PolylineTreeEntry.ItemsSource = null;
                    PointTreeEntry.ItemsSource = GetSpatialRelationships(selectedGeometry, _pointGraphic.Geometry);
                    PolygonTreeEntry.ItemsSource = GetSpatialRelationships(selectedGeometry, _polygonGraphic.Geometry);

            // Expand the tree view
            PolylineTreeEntry.IsExpanded = true;
            PolygonTreeEntry.IsExpanded = true;
            PointTreeEntry.IsExpanded = true;

        /// <summary>
        /// Returns a list of spatial relationships between two geometries
        /// </summary>
        /// <param name="a">The 'a' in "a contains b"</param>
        /// <param name="b">The 'b' in "a contains b"</param>
        /// <returns>A list of spatial relationships that are true for a and b.</returns>
        private static IEnumerable<SpatialRelationship> GetSpatialRelationships(Geometry a, Geometry b)
            List<SpatialRelationship> relationships = new List<SpatialRelationship>();
            if (GeometryEngine.Crosses(a, b)) { relationships.Add(SpatialRelationship.Crosses); }
            if (GeometryEngine.Contains(a, b)) { relationships.Add(SpatialRelationship.Contains); }
            if (GeometryEngine.Disjoint(a, b)) { relationships.Add(SpatialRelationship.Disjoint); }
            if (GeometryEngine.Intersects(a, b)) { relationships.Add(SpatialRelationship.Intersects); }
            if (GeometryEngine.Overlaps(a, b)) { relationships.Add(SpatialRelationship.Overlaps); }
            if (GeometryEngine.Touches(a, b)) { relationships.Add(SpatialRelationship.Touches); }
            if (GeometryEngine.Within(a, b)) { relationships.Add(SpatialRelationship.Within); }
            return relationships;
<UserControl x:Class="ArcGISRuntime.WPF.Samples.SpatialRelationships.SpatialRelationships"
        <esri:MapView x:Name="MyMapView" />
        <Border Style="{StaticResource BorderStyle}">
                <TextBlock Text="Tap a graphic to see its relationship with the others."
                           FontWeight="SemiBold" TextWrapping="Wrap" TextAlignment="Center" />
                <TreeView Margin="0,5,0,0">
                        <TreeViewItem x:Name="PointTreeEntry"
                                      Header="Point" />
                        <TreeViewItem x:Name="PolylineTreeEntry"
                                      Header="Polyline" />
                        <TreeViewItem x:Name="PolygonTreeEntry"
                                      Header="Polygon" />
See Also
Additional Examples
Hyperlink to ExampleDescription
SpatialRelationshipsDetermine spatial relationships between two geometries.