/* * Javascript function to create a buffer around a last known point. * Script credits: * DanielDery | https://community.esri.com/t5/arcgis-survey123-questions/buffer-tool-for-survey123-map/td-p/846713?attachment-id=78542 * Modified by Ryan Rhee - Boone County Fire Protection District/MO-TF1 */ function generateBufferCoordinates(center_Y, center_X, 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 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 = (((15 > 0) && (6 * 15 - 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; }