Calculate a geodesic path between two points and measure its distance.
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
A Point is created in New York City and displayed as a Graphic.
When a click occurs on the MapView, a new Point is obtained from the mouse click. This Point is added as a Graphic.
A Polyline is created with the two Point objects.
GeometryEngine.densifyGeodetic is executed by passing in the Polyline object, and the returned Geometry is added as a Graphic.
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
Use dark colors for code blocksCopy
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
import Esri.ArcGISRuntime
Rectangle {
id: rootRectangleclip: truewidth: 800height: 600property string distanceTextMapView {
id: mapViewanchors.fill: parentComponent.onCompleted: {
// Set the focus on MapView to initially enable keyboard navigation forceActiveFocus();
}
// create a graphics overlayGraphicsOverlay {
// add a marker graphic for NYCGraphic {
id: nycGraphicPoint {
x: -73.7781y: 40.6413spatialReference: SpatialReference { wkid: 4326 }
}
symbol: markerSymbol
}
// add a graphic for the pathGraphic {
id: pathGraphicsymbol: pathSymbol
}
// add an end marker graphicGraphic {
id: destinationGraphicsymbol: markerSymbol
}
}
// create a map with the imagery basemapMap {
Basemap {
initStyle: Enums.BasemapStyleArcGISImageryStandard
}
}
// handle the mouse clickonMouseClicked: mouse => {
// re-project the point to match the NYC graphicconst destination = GeometryEngine.project(mouse.mapPoint, nycGraphic.geometry.spatialReference);
// update the destination graphic destinationGraphic.geometry = destination;
// create line with start/end pointsconst 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 graphicconst 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 symbolSimpleLineSymbol {
id: pathSymbolcolor: "blue"width: 5style: Enums.SimpleLineSymbolStyleDash
}
// create a marker symbolSimpleMarkerSymbol {
id: markerSymbolcolor: "blue"style: Enums.SimpleMarkerSymbolStyleCircle
size: 10 }
// display text for geodesic lengthText {
anchors {
left: parent.left
top: parent.top
margins: 10 }
text: "%1 kilometers".arg(distanceText)
visible: distanceText.length > 0font.pixelSize: 20color: "white" }
}