My team at ERM made some changes to get this to work for us (we opened it up for the US.
/*
* Javascript function to create a buffer around a last known point.
* Script credits:
* Modified by Ryan Rhee - Boone County Fire Protection District/MO-TF1
* Modified by Michael Stead from ERM, and Michelle Williams Survey123 Jedi
* DOES NOT PULL FROM XY
*/
function generateBufferCoordinates(center_Y, center_X, zone_utm, buffer_dist) {
// Single function to perform buffer algebra and return list of coordinates as string object
// *center_Y* and *center_X* must be passed into the function as UTM coordinates
// *buffer_dist* must be passed into the function in meters (m)
var coordinates = '';
// Empty string of coordinates to be populated
for (var angle_deg = 0.0; angle_deg < 360.0; angle_deg+=1.0) {
// For loop iteratesd over all angles from 0 to 359 and returns a coordinate pair for the point *buffer_dist* away at *angle_deg* degrees from the point defined by *center_X*,*center_Y*
const pi = 3.14159265359;
const a = 6378137;
const e = 0.081819191;
const e1sq = 0.006739497;
const k0 = 0.9996;
// Defined variables for mathematical constants
var zone = parseFloat(zone_utm)
var buff_Y = parseFloat(center_Y)+buffer_dist*(Math.sin(angle_deg*pi/180))
var buff_X = parseFloat(center_X)+buffer_dist*(Math.cos(angle_deg*pi/180))
// Gets the UTM coordinates for the point *buffer_dist* away at *angle_deg* degrees from the point defined by *center_X*,*center_Y*
var arc = buff_Y / k0;
var mu = arc / (a * (1 - Math.pow(e, 2) / 4.0 - 3 * Math.pow(e, 4) / 64.0 - 5 * Math.pow(e, 6) / 256.0));
var ei = (1 - Math.pow((1 - e * e), (1 / 2.0))) / (1 + Math.pow((1 - e * e), (1 / 2.0)));
var ca = 3 * ei / 2 - 27 * Math.pow(ei, 3) / 32.0;
var cb = 21 * Math.pow(ei, 2) / 16 - 55 * Math.pow(ei, 4) / 32;
var cc = 151 * Math.pow(ei, 3) / 96;
var cd = 1097 * Math.pow(ei, 4) / 512;
var phi1 = mu + ca * Math.sin(2 * mu) + cb * Math.sin(4 * mu) + cc * Math.sin(6 * mu) + cd * Math.sin(8 * mu);
var n0 = a / Math.pow((1 - Math.pow((e * Math.sin(phi1)), 2)), (1 / 2.0));
var r0 = a * (1 - e * e) / Math.pow((1 - Math.pow((e * Math.sin(phi1)), 2)), (3 / 2.0));
var fact1 = n0 * Math.tan(phi1) / r0;
var _a1 = 500000 - buff_X;
var dd0 = _a1 / (n0 * k0);
var fact2 = dd0 * dd0 / 2;
var t0 = Math.pow(Math.tan(phi1), 2);
var Q0 = e1sq * Math.pow(Math.cos(phi1), 2);
var fact3 = (5 + 3 * t0 + 10 * Q0 - 4 * Q0 * Q0 - 9 * e1sq) * Math.pow(dd0, 4) / 24;
var fact4 = (61 + 90 * t0 + 298 * Q0 + 45 * t0 * t0 - 252 * e1sq - 3 * Q0 * Q0) * Math.pow(dd0, 6) / 720;
var lof1 = _a1 / (n0 * k0);
var lof2 = (1 + 2 * t0 + Q0) * Math.pow(dd0, 3) / 6.0;
var lof3 = (5 - 2 * Q0 + 28 * t0 - 3 * Math.pow(Q0, 2) + 8 * e1sq + 24 * Math.pow(t0, 2)) * Math.pow(dd0, 5) / 120;
var _a2 = (lof1 - lof2 + lof3) / Math.cos(phi1);
var _a3 = _a2 * 180 / Math.PI;
var buff_lat = (180 * (phi1 - fact1 * (fact2 + fact3 + fact4)) / Math.PI).toFixed(7);
var buff_lon = ((((zone) > 0) && (6 * (zone) - 183.0) || 3.0) - _a3).toFixed(7);
// Performs conversion algebra to convert UTM coordinates to decimal degrees and rounds points to 7 decimal places
var coord_pair = buff_lat+" "+buff_lon+"; ";
coordinates += coord_pair;
// Concatenates strings to following format: "lat1 long1; lat2 long2; "
// Concatenates coordinate pair to stringified list of pairs
}
return coordinates;
}