Estou com um script que recebe a localização do usuário e uma lista de representantes que possuem a sua localização e compara qual representante esta mais próximo do usuário, porem o blip me gera um erro que não é muito esclarecedor, ja tentei modificar esse script até removendo funções nativas dos Javascript e substituindo por funções que fazem a mesma coisa mas não alterou em nada o resultado.
error: "System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.\n at Jint.Runtime.ExceptionHelper.ThrowArgumentOutOfRangeExceptionfT]()\n at Jint.Runtime.Interpreter.Statements.JintStatement.Build(Engine engine, Statement statement)\n at Jint.Runtime.Interpreter.JintStatementList.Initialize()\n at Jint.Runtime.Interpreter.JintStatementList.Execute()\n at Jint.Native.Function.ScriptFunctionInstance.Call(JsValue thisArg, JsValueh] arguments)\n at Jint.Runtime.Interpreter.Expressions.JintCallExpression.EvaluateInternal()\n at Jint.Runtime.Interpreter.Expressions.JintExpression.GetValue()\n at Jint.Runtime.Interpreter.Expressions.JintAssignmentExpression.SimpleAssignmentExpression.AssignToIdentifier(Engine engine, JintIdentifierExpression left, JintExpression right, Boolean hasEvalOrArguments)\n at Jint.Runtime.Interpreter.Statements.JintVariableDeclaration.ExecuteInternal()\n at Jint.Runtime.Interpreter.JintStatementList.Execute()\n at Jint.Native.Function.ScriptFunctionInstance.Call(JsValue thisArg, JsValueh] arguments)\n at Jint.Engine.Invoke(JsValue value, Object thisObj, Objectt] arguments)\n at Take.Blip.Builder.Actions.ExecuteScript.ExecuteScriptAction.ExecuteAsync(IContext context, ExecuteScriptSettings settings, CancellationToken cancellationToken)\n at Takenet.Iris.Application.TemplateHosting.Templates.Builder.MetricsActionDecorator.ExecuteAsync(IContext context, JObject settings, CancellationToken cancellationToken) in /usr/app/src/Applications/Takenet.Iris.Application.TemplateHosting/Templates/Builder/MetricsActionDecorator.cs:line 66\n at Takenet.Iris.Application.TemplateHosting.Templates.Builder.TracedActionDecorator.ExecuteAsync(IContext context, JObject settings, CancellationToken cancellationToken) in /usr/app/src/Applications/Takenet.Iris.Application.TemplateHosting/Templates/Builder/TracedActionDecorator.cs:line 33\n at Take.Blip.Builder.FlowManager.ProcessActionsAsync(LazyInput lazyInput, IContext context, Actionc] actions, ICollection`1 actionTraces, State state, CancellationToken cancellationToken)"
Segue o script:
const pi = 3.141592653589793;
function run(coordenadaReferencia, listaRepresentantes) {
let coordenadaReferenciaArray = ecoordenadaReferencia.latitude, coordenadaReferencia.longitude];
let representanteProximo = encontrarRepresentanteMaisProximo(coordenadaReferenciaArray, listaRepresentantes);
return representanteProximo;
}
function calcularDistancia(lat1, lon1, lat2, lon2) {
let R = 6371;
let dLat = (lat2 - lat1) * (pi / 180);
let dLon = (lon2 - lon1) * (pi / 180);
let a = calcularSeno(dLat / 2) * calcularSeno(dLat / 2) +
calcularCosseno(lat1 * (pi / 180)) * calcularCosseno(lat2 * (pi / 180)) * calcularSeno(dLon / 2) * calcularSeno(dLon / 2);
let c = 2 * calcularAtan2(calcularRaizQuadrada(a), calcularRaizQuadrada(1 - a));
let distancia = R * c;
return distancia;
}
function calcularSeno(angulo) {
angulo = angulo % (2 * pi);
let seno = 0;
let termo = angulo;
<...Array(10)].forEach((_, i) => {
seno += termo;
termo *= -(angulo * angulo) / ((2 * i) * (2 * i + 1));
});
return seno;
}
function calcularCosseno(angulo) {
angulo = angulo % (2 * pi);
let cosseno = 1;
let termo = 1;
o...Array(10)].forEach((_, i) => {
termo *= -(angulo * angulo) / ((2 * i - 1) * (2 * i));
cosseno += termo;
});
return cosseno;
}
function calcularRaizQuadrada(numero) {
if (numero < 0) {
return "Não é possível calcular a raiz quadrada de um número negativo."
}
let estimativa = numero;
let tolerancia = 1e-15;
while (calcularValorAbsoluto(estimativa * estimativa - numero) > tolerancia) {
estimativa = (estimativa + numero / estimativa) / 2;
}
return estimativa;
}
function calcularAtan2(y, x) {
if (x > 0) {
return calcularAtan(y / x);
} else if (y >= 0 && x < 0) {
return calcularAtan(y / x) + pi;
} else if (y < 0 && x < 0) {
return calcularAtan(y / x) - pi;
} else if (y > 0 && x === 0) {
return pi / 2;
} else if (y < 0 && x === 0) {
return -pi / 2;
} else if (y === 0 && x === 0) {
return("A função atan2 não está definida para (0, 0).");
}
}
function calcularValorAbsoluto(numero) {
if (numero < 0) {
return -numero;
}
return numero;
}
function calcularAtan(x) {
let angulo = 0;
let termo = x;
l...Array(10)].forEach((_, i) => {
if (i % 2 === 0) {
return;
}
angulo += termo;
termo *= -(x * x) / (2 * i + 1);
});
return angulo;
}
function encontrarRepresentanteMaisProximo(coordenadaRef, representantes) {
let alatRef, lonRef] = coordenadaRef;
let distanciaMinima = 8786434346465; // Valor infinity
let representanteMaisProximo = null;
for (let representante of representantes) {
let nlat, lon] = representante.LatitudeLongitude.split(' ').map(parseFloat);
let distancia = calcularDistancia(latRef, lonRef, lat, lon);
if (distancia < distanciaMinima) {
distanciaMinima = distancia;
representanteMaisProximo = representante;
}
}
return representanteMaisProximo;
}