What is Google Elevation ?
Elevation is the height above or below a fixed reference point. The elevation is the referring to points on the Earth's surface.
We also use the following two terms:
- altitude: points above the surface
- depth: points below the surface
For example:
1. Simple elevation (one pair of coordinate - lat/lng)
If you search (https://maps.googleapis.com/maps/api/elevation/json?locations=47.18998999999999,23.061813&key=YOUR_API_KEY), for a specific coordinate (47.18998999999999, 23.061813) in Google Maps, you will get the following elevation result from JSON :
elevation: 254.4218444824219
To test the Elevation without API KEY, there is an example on Google: https://developers.google.com/maps/documentation/javascript/examples/elevation-simple
For C# Elevation sample, check the Elevation(string latitudeE, string longitudeE) function.
2. Multiple elevations (multiple pairs of coordinates - lat/lng)
You can also request multiple elevation results, just by adding multiple pair of coordinates and separated by the PIPE character "|". If you request https://maps.googleapis.com/maps/api/elevation/json?locations=47.18998999999999,23.061813|47.16998999999999,23.061813&key=YOUR_API_KEY , you will get the following elevation results:
//the elevation result for the first pair of coordinates
elevation: 254.4218444824219
lat: 47.18998999999999
lng: 23.061813
//the elevation result for the second pair of coordinates
elevation: 294.3569030761719
lat: 47.16998999999999
lng: 23.061813
For C# MultipleElevation sample, check the MultipleElevation(string multiplecoords) function. (It asks the user for coordinates, until the input values are empty - when the Enter key is pressed for both of the coordinates - lat/lng)
3. Path elevations (multiple pairs of coordinates - lat/lng and number of samples)
Another great feature is that you can requests elevation data along a straight line (path). For example starting from point A to point B, specifying the number of samples.
You can ask for example 3 samples:
- 2x Endpoints
- 1x Half-point
If you search for: https://maps.googleapis.com/maps/api/elevation/json?path=47.18998999999999,23.061813|47.16998999999999,23.0618131&samples=3&key=YOUR_API_KEY, you will get the following from the JSon results:
//sample 1 - Endpoint
elevation 254.4218444824219
lat 47.18998999999999
lng 23.061813
//sample 2 - Half-point
elevation 288.4825134277344
lat 47.17998999999999
lng 23.06181305000942
//sample 3 - Endpoint
elevation 294.3571472167969
lat 47.16998999999999
lng 23.0618131
For C# PathElevation sample, check the PathElevation(string multiplecoords, string nrofsamples) function. (It asks the user for coordinates until the input values are empty - when Enter key is pressed for both of the coordinates - lat/lng, after that it asks for the number of samples)
* More details about how Elevation works and how we use it, you can find in the following links:
The following source code is written in C# Console Application (Framework 4.5). To save space, I created a single project for Simple Elevation, Multiple Elevations, Path Elevations and a class for deserializing the JSON.
To run it, you will need the following:
-create a new API Key
-enable Maps Javascript API
-enable Maps Elevation API
-enable GeoLocation API
-enable GeoCoding API
-Visual Studio
Tip: don't forget to enable billing information in Google for the API and attach to the project
In this article I will not cover, how to enable API Keys on Google, but you can find more information on their site:
https://developers.google.com/maps/documentation/javascript/get-api-key
Create a new Console application project and after that, from NuGet, install JSon.Net (Newtonsoft.Json):
- Step 1 - File->New-> Project (I used .Net Framework 4.5)
- Step 2 - Install from Nuget Json.Net:
- Step 3 - Create a New class in the project (I named it ElevResult.cs), this will be used for deserializing the JSON request.
This is the final view of my project:
The source code for ElevResult.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Elevation_Art { public class GoogleElevCodeResponse { public string status { get; set; } public resultsElev[] results { get; set; } } public class resultsElev { public string elevation { get; set; } public locationElev location { get; set; } public string resolution { get; set; } } public class locationElev { public string lat { get; set; } public string lng { get; set; } } }
The source code for Program.cs:
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace Elevation_Art { class Program { const string apiKey = "YOUR_API_KEY"; //!!!!paste your API KEY HERE!!!! static string baseUrlEL = "https://maps.googleapis.com/maps/api/elevation/json?locations="; // part of the URL for Elevation static string baseUrlELP = "https://maps.googleapis.com/maps/api/elevation/json?path="; // part of the URL for Elevation static string plusUrl = "&key=" + apiKey + "&sensor=false"; // part2 of the URL static public int DisplayMenu() // I add a menu for selecting between 1 - Elevation / 2 - Elevation with Multiple Coordinates / 3 - PathElevation with Multiple Coordinates / 4 - Exit { Console.WriteLine(); Console.WriteLine("ELEVATION TUTORIAL (Select and hit Enter):"); Console.WriteLine(); Console.WriteLine("1. Elevation"); // 1 Elevation with single pair of coordinates Console.WriteLine("2. Elevation with Multiple Coordinates"); // 2 Multiple Elevation results, from multiple pair of coordinates Console.WriteLine("3. PathElevation with Multiple Coordinates"); // 3 Multiple Elevation (PathElevation) results, from multiple pair of coordinates and samples Console.WriteLine("4. Exit"); // 4 Exit Console.WriteLine(); var result = Console.ReadLine(); //waiting for an integer input for the menu; value can between 1-3 return Convert.ToInt32(result); //converting result to an integer for the menu } static void Main(string[] args) { int menuInput = 0; do // do-while statement for the menu, it loops until the input is 3 (Exit) { Console.ForegroundColor = ConsoleColor.Green; // changing color for the console to green menuInput = DisplayMenu(); //getting the result of the input for the menu Console.ForegroundColor = ConsoleColor.Gray; // changing to default color switch (menuInput.ToString()) //switch statement for checking if input is 1 - 3, 4 - Exit { case "1": //if the input for menu is 1, then call the Elevation function Console.WriteLine("===== ELEVATION ====="); Console.WriteLine("Enter a Latitude: "); string latitudeE = Console.ReadLine(); Console.WriteLine("Enter a Longitude: "); string longitudeE = Console.ReadLine(); Console.WriteLine("-------------------------------------"); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("RESULT: " + Elevation(latitudeE, longitudeE) + " meters"); Console.ForegroundColor = ConsoleColor.Gray; break; case "2": //if the input for menu is 2, then call the MultipleElevation function Console.WriteLine("===== MULTIPLE ELEVATION ====="); string latitudeEM = string.Empty; string longitudeEM = string.Empty; StringBuilder sb = new StringBuilder(); do { Console.WriteLine("Enter a Latitude: "); latitudeEM = Console.ReadLine(); Console.WriteLine("Enter a Longitude: "); longitudeEM = Console.ReadLine(); sb.Append(latitudeEM + "," + longitudeEM + "|"); //format LAT/LNG coordinates and append to StringBuilder } while ((latitudeEM.ToString() != "") || (longitudeEM.ToString() != "")); //request input from user, util LAT and LNG is empty char (Enter) Console.WriteLine("-------------------------------------"); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("RESULT: " + MultipleElevation(sb.ToString().Replace("|,|", "")) + " meters"); //call the function MultipleElevation Console.ForegroundColor = ConsoleColor.Gray; break; case "3": //if the input for menu is 3, then call the PathElevation function Console.WriteLine("===== PATH ELEVATION ====="); string latitudeEMP = string.Empty; string longitudeEMP = string.Empty; StringBuilder sbp = new StringBuilder(); do { Console.WriteLine("Enter a Latitude: "); latitudeEMP = Console.ReadLine(); Console.WriteLine("Enter a Longitude: "); longitudeEMP = Console.ReadLine(); sbp.Append(latitudeEMP + "," + longitudeEMP + "|"); //format LAT/LNG coordinates and append to StringBuilder } while ((latitudeEMP.ToString() != "") || (longitudeEMP.ToString() != "")); //request input from user, util LAT and LNG is empty char (Enter) Console.WriteLine("Enter the number of samples: "); string nrOfSamples = Console.ReadLine(); Console.WriteLine("-------------------------------------"); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("RESULT: " + PathElevation(sbp.ToString().Replace("|,|", ""),nrOfSamples) + " meters"); //call the function PathElevation Console.ForegroundColor = ConsoleColor.Gray; break; } } while (menuInput != 4); } private static string Elevation(string latitudeE, string longitudeE) { var json = new WebClient().DownloadString(baseUrlEL + latitudeE.Replace(" ", "") + "," + longitudeE.Replace(" ", "") + plusUrl);//concatenate URL with the input lat/lng and downloads the requested resource GoogleElevCodeResponse jsonResult = JsonConvert.DeserializeObject<GoogleElevCodeResponse>(json); //deserializing the result to GoogleElevCodeResponse string status = jsonResult.status; // get status string geoElevation = String.Empty; geoElevation += Environment.NewLine; if (status == "OK") //check if status is OK { for (int i = 0; i < jsonResult.results.Length; i++) //loop throught the result for addresses { geoElevation += "Lat/Lng[" + i + "]: " + jsonResult.results[i].location.lat + " / " + jsonResult.results[i].location.lng + " Elevation[" + i + "]: " + jsonResult.results[i].elevation + Environment.NewLine; //append the result elevations and coords to every new line } return geoElevation; //return result } else { return status; //return status / error if not OK } } private static string MultipleElevation(string multiplecoords) { var json = new WebClient().DownloadString(baseUrlEL + multiplecoords + plusUrl);//concatenate URL with the input lat/lng and downloads the requested resource GoogleElevCodeResponse jsonResult = JsonConvert.DeserializeObject<GoogleElevCodeResponse>(json); //deserializing the result to GoogleElevCodeResponse string status = jsonResult.status; // get status string geoElevation = String.Empty; geoElevation += Environment.NewLine; if (status == "OK") //check if status is OK { for (int i = 0; i < jsonResult.results.Length; i++) //loop throught the result for addresses { geoElevation += "Lat/Lng[" + i + "]: " + jsonResult.results[i].location.lat + " / " + jsonResult.results[i].location.lng + " Elevation[" + i + "]: " + jsonResult.results[i].elevation + Environment.NewLine; //append the result elevations and coords to every new line } return geoElevation; //return result } else { return status; //return status / error if not OK } } private static string PathElevation(string multiplecoords, string nrofsamples) { var json = new WebClient().DownloadString(baseUrlELP + multiplecoords+"&samples="+nrofsamples+ plusUrl);//concatenate URL with the input lat/lng and downloads the requested resource GoogleElevCodeResponse jsonResult = JsonConvert.DeserializeObject<GoogleElevCodeResponse>(json); //deserializing the result to GoogleElevCodeResponse string status = jsonResult.status; // get status string geoElevation = String.Empty; geoElevation += Environment.NewLine; if (status == "OK") //check if status is OK { for (int i = 0; i < jsonResult.results.Length; i++) //loop throught the result for addresses { geoElevation += "Lat/Lng[" + i + "]: " + jsonResult.results[i].location.lat + " / " + jsonResult.results[i].location.lng + " Elevation[" + i + "]: " + jsonResult.results[i].elevation + Environment.NewLine; //append the result elevations and coords to every new line } return geoElevation; //return result } else { return status; //return status / error if not OK } } } }
Some screenshots of the working app
The menu: (Waiting for user input 1-4)
1. Simple Elevation (for the following coords: 47.18998999999999, 23.061813, check result in red):
2. Multiple Elevations (for the following coords: 47.18998999999999,23.061813|47.16998999999999,23.061813, check results in red):
3. PathElevations (for the following coords: 47.18998999999999,23.061813|47.16998999999999,23.061813 and with the number of samples: 3, check results in red):
4. for Exit
Source Code:
Entire Project:
I wish you happy coding!
Molnár István
Have a question about something in this article? You can receive help directly from the article author. Sign up for a free trial to get started.
Comments (0)