A quick article to document how to calculate the distance "as the crow files" between two coordinates given the latitude and longitude of each.
Why?
Well, you can pay for a good Google solution that will distance following roads and the such but.. the following is free albeit as-the-crow flies.
This makes use of an undocumented function in Zoho which is acos or inverse cosine. Just lifted from the JavaScript library figuring if it supports cos() then try this standard function. Note this has only been tested in Zoho Creator rather than Zoho CRM.
How?
This function returns the distance as the crow flies.
Update 2020
Not sure exactly when but Zoho have made available this function in Creator:
<response> = zoho.map.distanceBetween(<source_address>, <destination_address>, <unit>); // where unit can be "MILE", "KILOMETRE" or "NAUTICAL"
- <response> = zoho.map.distanceBetween(<source_address>, <destination_address>, <unit>);
- // where unit can be "MILE", "KILOMETRE" or "NAUTICAL"
Version 2019
string fn_getMilesBetweenCoords(float p_Lat1, float p_Lng1, float p_Lat2, float p_Lng2) { v_MathPi = 3.1415926535897932384626433832795028841971693993751; if ((p_Lat1 == p_Lat2) && (p_Lng1 == p_Lng2)) { return 0; } else { v_RadLat1 = v_MathPi * p_Lat1 / 180; v_RadLat2 = v_MathPi * p_Lat2 / 180; v_Theta = p_Lng1 - p_Lng2; v_RadTheta = v_MathPi * v_Theta / 180; v_Dist = (sin(v_RadLat1) * sin(v_RadLat2)) + (cos(v_RadLat1) * cos(v_RadLat2) * cos(v_RadTheta)); if (v_Dist > 1) { v_Dist = 1; } v_AcosDist = acos(v_Dist); v_CalcDist = v_AcosDist * 180 / v_MathPi; v_Miles = v_CalcDist * 60 * 1.1515; } return round(v_Miles,2) + " miles"; }
- string fn_getMilesBetweenCoords(float p_Lat1, float p_Lng1, float p_Lat2, float p_Lng2)
- {
- v_MathPi = 3.1415926535897932384626433832795028841971693993751;
- if ((p_Lat1 == p_Lat2) && (p_Lng1 == p_Lng2)) {
- return 0;
- }
- else
- {
- v_RadLat1 = v_MathPi * p_Lat1 / 180;
- v_RadLat2 = v_MathPi * p_Lat2 / 180;
- v_Theta = p_Lng1 - p_Lng2;
- v_RadTheta = v_MathPi * v_Theta / 180;
- v_Dist = (sin(v_RadLat1) * sin(v_RadLat2)) + (cos(v_RadLat1) * cos(v_RadLat2) * cos(v_RadTheta));
- if (v_Dist > 1) {
- v_Dist = 1;
- }
- v_AcosDist = acos(v_Dist);
- v_CalcDist = v_AcosDist * 180 / v_MathPi;
- v_Miles = v_CalcDist * 60 * 1.1515;
- }
- return round(v_Miles,2) + " miles";
- }
if (unit=="K") { dist = dist * 1.609344 } // kilometers if (unit=="N") { dist = dist * 0.8684 } // nautical
- if (unit=="K") { dist = dist * 1.609344 }  // kilometers
- if (unit=="N") { dist = dist * 0.8684 }  // nautical
Production code
// v_Latitude1, v_Longitude1 are coords for origin // v_Latitude2, v_Longitude2 are coords for destination v_Latitude1 = v_Latitude1.toDecimal(); v_Longitude1 = v_Longitude1.toDecimal(); v_Theta = v_Longitude2 - v_Longitude1; v_Basecalc = 0.017453292519943295; v_Coord1 = sin(v_Latitude2 * v_Basecalc) * sin(v_Latitude1 * v_Basecalc); v_Coord2 = cos(v_Latitude2 * v_Basecalc) * cos(v_Latitude1 * v_Basecalc) * cos(v_Theta * v_Basecalc); v_Dist = v_Coord1 + v_Coord2; v_Dist = acos(v_Dist); v_Dist = v_Dist * 180 / 3.1415926535897932384626433832795028841971693993751; v_Miles = v_Dist * 60 * 1.1515; // returns Miles as a float
- // v_Latitude1, v_Longitude1 are coords for origin
- // v_Latitude2, v_Longitude2 are coords for destination
- v_Latitude1 = v_Latitude1.toDecimal();
- v_Longitude1 = v_Longitude1.toDecimal();
- v_Theta = v_Longitude2 - v_Longitude1;
- v_Basecalc = 0.017453292519943295;
- v_Coord1 = sin(v_Latitude2 * v_Basecalc) * sin(v_Latitude1 * v_Basecalc);
- v_Coord2 = cos(v_Latitude2 * v_Basecalc) * cos(v_Latitude1 * v_Basecalc) * cos(v_Theta * v_Basecalc);
- v_Dist = v_Coord1 + v_Coord2;
- v_Dist = acos(v_Dist);
- v_Dist = v_Dist * 180 / 3.1415926535897932384626433832795028841971693993751;
- v_Miles = v_Dist * 60 * 1.1515;
- // returns Miles as a float