If you’re using GMap.NET to add maps to your .NET application, then the time may come when you want to calculate the area of a polygon on your map. In my case, I have an application that allows users to actually create polygons using a GMap.NET control, by placing and connecting markers to shape their […]
This article was posted by Independent Software, a website and database application development company based in Maputo, Mozambique. Our website offers regular write-ups on technical and design issues, ranging from details at code level to 3D Studio Max rendering. Read more about Independent Software's philosophy, or get in touch with Independent Software.
If you’re using GMap.NET to add maps to your .NET application, then the time may come when you want to calculate the area of a polygon on your map. In my case, I have an application that allows users to actually create polygons using a GMap.NET control, by placing and connecting markers to shape their polygon. Since the map system is used to indicate the limits of an area occupied by a rural community, it’s necessary to calculate how many hectares the delimited area occupies.
Google Maps actually provides a function in its API to calculate polygon areas:
Even so, unfortunately GMap.NET does not offer access to this API. Moreover, your GMap.NET control may be configured to work with a different map provider from Google Maps, like Bing. Consequently, you’ll have to implement your own polygon area calculation algorithms. Luckily, this is not all that complicated, and algorithms are available on the net.
Here’s my approach.
- Assuming that you have a list of PointLatLng values that form the polygon…
- For each PointLatLng value, create a new value with the latitude and longitude values converted to meters.
- Calculate the area of the polygon using this algorithm.
IList<PointLatLng> coords = // List of polygon coordinates
// Add all coordinates to a list, converting them to meters:
IList<PointLatLng> points = new List<PointLatLng>();
foreach (PointLatLng coord in coords)
PointLatLng p = new PointLatLng(
coord.Longitude * (System.Math.PI * 6378137 / 180),
coord.Latitude * (System.Math.PI * 6378137 / 180)
// Add point 0 to the end again:
// Calculate polygon area (in square meters):
var area = System.Math.Abs(points.Take(points.Count - 1)
.Select((p, i) => (points[i + 1].Lat - p.Lat) * (points[i + 1].Lng + p.Lng))
.Sum() / 2);