Bing Maps: Draw a Circle Radius Around a Lat/Long Point

Feb 9, 2008  • Mapping

I get requests on how to draw radius’ around points on the map. And, up until now, I never needed to do it myself, so I didn’t have a code snippet to do it. I did a search and quickly and didn’t really find many examples of how to do it with Virtual Earth. Other than one being coded for an older version of Virtual Earth (and incompatible with VE6); it’s coded to only handle drawing a radius in Kilometers.

So, I decided to upgrade the code example to support VE6, and support both Miles and Kilometers. I’m also converted it to make use of the GeoCodeCalc.ToDegrees function that I originally posted in my Calculate Distance of User-Drawn Polyline post.

Download the Full Example Here

And, in case you don’t feel like downloading the example code that uses it, here’s the source to the method that calculates the points that make up the radius:

 /* *************************************************************************** */
 /* Copyright (c) 2008 Chris Pietschmann (https://pietschsoft.com) */
 /* This code is dependant on the GeoCodeCalc class found here: */
 /* https://www.pietschsoft.com/post/2008/02/09/virtual-earth-draw-a-circle-radius-around-a-latlong-point */
 /* *************************************************************************** */
 /* This math code is a modified version of the code originally posted */
 /* at the following location: http://viavirtualearth.com/Wiki/Draw+a+circle.ashx */
 /* *************************************************************************** */
 if (GeoCodeCalc == undefined) 
     var GeoCodeCalc = {}

GeoCodeCalc.ToDegrees = function(radians){ return radians * 180 / Math.PI;};

function CreateCircle(loc, radius, units){ 
 var earthRadius = parseFloat(units); 
 var lat = GeoCodeCalc.ToRadian(loc.Latitude); //radians 
 var lon = GeoCodeCalc.ToRadian(loc.Longitude); //radians 
 var d = parseFloat(radius) / earthRadius; // d = angular distance covered on earth's surface 
 var locs = new Array(); 
 for (x = 0; x <= 360; x++) { 
 var p2 = new VELatLong(0,0) 
 brng = GeoCodeCalc.ToRadian(x); //radians 
 var latRadians = Math.asin(Math.sin(lat) * Math.cos(d) + Math.cos(lat) * Math.sin(d) * Math.cos(brng)); 
 var lngRadians = lon + Math.atan2(Math.sin(brng) * Math.sin(d) * Math.cos(lat), Math.cos(d) - Math.sin(lat) * Math.sin(latRadians)); 
 locs.push(new VELatLong(GeoCodeCalc.ToDegrees(latRadians), GeoCodeCalc.ToDegrees(lngRadians))); 
 } 
 return new VEShape(VEShapeType.Polyline, locs); 
 }