# Geodesic operations

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

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

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

## Tags

densify, distance, geodesic, geodetic

## Sample Code

``````import QtQuick 2.6
import Esri.ArcGISRuntime 100.9

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

property string distanceText

MapView {
id: mapView
anchors.fill: parent

// 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 {
BasemapImagery {}
}

// 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});
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"
}
}``````