Geodesic operations

View inC++QMLView on GitHubSample viewer app

Calculate a geodesic path between two points and measure its distance.

screenshot

Use case

A geodesic distance provides an accurate, real-world distance between two points. Visualizing flight paths between cities is a common example of a geodesic operation since the flight path between two airports takes into account the curvature of the earth, rather than following the planar path between those points, which appears as a straight line on a projected map.

How to use the sample

Click anywhere on the map. A line graphic will display the geodesic line between the two points. In addition, text that indicates the geodesic distance between the two points will be updated. Click elsewhere and a new line will be created.

How it works

  1. A Point is created in New York City and displayed as a Graphic.
  2. When a click occurs on the MapView, a new Point is obtained from the mouse click. This Point is added as a Graphic.
  3. A Polyline is created with the two Point objects.
  4. GeometryEngine.densifyGeodetic is executed by passing in the Polyline object, and the returned Geometry is added as a Graphic.
  5. GeometryEngine.lengthGeodetic is executed by passing in the two Point objects, and the returned number is displayed on the screen.

Relevant API

  • GeometryEngine.densifyGeodetic
  • GeometryEngine.lengthGeodetic

About the data

The Imagery basemap provides the global context for the displayed geodesic line.

Tags

densify, distance, geodesic, geodetic

Sample Code

GeodesicOperations.qml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// [WriteFile Name=GeodesicOperations, Category=Geometry]
// [Legal]
// 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.
// [Legal]

import QtQuick 2.6
import Esri.ArcGISRuntime 100.15

Rectangle {
    id: rootRectangle
    clip: true
    width: 800
    height: 600

    property string distanceText

    MapView {
        id: mapView
        anchors.fill: parent

        Component.onCompleted: {
            // Set the focus on MapView to initially enable keyboard navigation
            forceActiveFocus();
        }

        // create a graphics overlay
        GraphicsOverlay {

            // add a marker graphic for NYC
            Graphic {
                id: nycGraphic
                Point {
                    x: -73.7781
                    y: 40.6413
                    spatialReference: SpatialReference { wkid: 4326 }
                }
                symbol: markerSymbol
            }

            // add a graphic for the path
            Graphic {
                id: pathGraphic
                symbol: pathSymbol
            }

            // add an end marker graphic
            Graphic {
                id: destinationGraphic
                symbol: markerSymbol
            }
        }

        // create a map with the imagery basemap
        Map {
            Basemap {
                initStyle: Enums.BasemapStyleArcGISImageryStandard
            }
        }

        // handle the mouse click
        onMouseClicked: {
            // re-project the point to match the NYC graphic
            const destination = GeometryEngine.project(mouse.mapPoint, nycGraphic.geometry.spatialReference);

            // update the destination graphic
            destinationGraphic.geometry = destination;

            // create line with start/end points
            const polylineBuilder = ArcGISRuntimeEnvironment.createObject("PolylineBuilder", {spatialReference: destination.spatialReference});
            polylineBuilder.addPoints([nycGraphic.geometry, destinationGraphic.geometry]);
            const polyline = polylineBuilder.geometry;

            // densify the path as a geodesic curve and show it with the path graphic
            const maxSegmentLength = 1;
            const unitOfMeasurement = ArcGISRuntimeEnvironment.createObject("LinearUnit", {linearUnitId: Enums.LinearUnitIdKilometers});
            const curveType = Enums.GeodeticCurveTypeGeodesic;
            const pathGeometry = GeometryEngine.densifyGeodetic(polyline, maxSegmentLength, unitOfMeasurement, curveType);

            // update the graphic
            pathGraphic.geometry = pathGeometry;

            // calculate the path's geodetic length
            distanceText = GeometryEngine.lengthGeodetic(pathGeometry, unitOfMeasurement, curveType).toFixed(2);
        }
    }

    // create a line symbol
    SimpleLineSymbol {
        id: pathSymbol
        color: "blue"
        width: 5
        style: Enums.SimpleLineSymbolStyleDash
    }

    // create a marker symbol
    SimpleMarkerSymbol {
        id: markerSymbol
        color: "blue"
        style: Enums.SimpleMarkerSymbolStyleCircle
        size: 10
    }

    // display text for geodesic length
    Text {
        anchors {
            left: parent.left
            top: parent.top
            margins: 10
        }

        text: "%1 kilometers".arg(distanceText)
        visible: distanceText.length > 0
        font.pixelSize: 20
        color: "white"
    }
}

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.

You can no longer sign into this site. Go to your ArcGIS portal or the ArcGIS Location Platform dashboard to perform management tasks.

Your ArcGIS portal

Create, manage, and access API keys and OAuth 2.0 developer credentials, hosted layers, and data services.

Your ArcGIS Location Platform dashboard

Manage billing, monitor service usage, and access additional resources.

Learn more about these changes in the What's new in Esri Developers June 2024 blog post.

Close