Estoy trabajando en herramientas de dibujo en un mapa en el que calculo el radio de un círculo dibujado en un mapa en función de sus coordenadas. Se ve bien, pero veo que el círculo no coincide perfectamente con la posición del mouse si se dibuja lejos del ecuador. Esto se debe a que utilizo una ecuación que considera 6.371.000 metros el radio de la Tierra. El verdadero radio de la Tierra varía según la distancia desde el ecuador y descubrí que se puede calcular con esta fórmula:
latitude B, radius R, radius at equator r1, radius at pole r2 R = √ [ (r1² * cos(B))² + (r2² * sin(B))² ] / [ (r1 * cos(B))² + (r2 * sin(B))² ]según https://rechneronline.de/earth-radius/
¿Cómo puedo escribir esa fórmula en JavaScript?
Siempre podemos echar un vistazo a cómo lo hacen desde su código fuente. Su fuente se almacena aquí . El cálculo relevante es este:
var z=Math.sqrt((Math.pow(r1*r1*Math.cos(x),2)+Math.pow(r2*r2*Math.sin(x),2)) / (Math.pow(r1*Math.cos(x),2)+Math.pow(r2*Math.sin(x),2)));Pero tiene muchos cálculos redundantes. Podemos optimizarlo así:
function getSpheroidRadius(B, r1, r2) { if (Math.abs(B) > 90) throw Error('Invalid Latitude value supplied: ' + B); let r1Sq = r1 * r1; let r2Sq = r2 * r2; let equatorProjectionSq = r1Sq * Math.cos(B) ** 2; let poleProjectionSq = r2Sq * Math.sin(B) ** 2; let r = Math.sqrt( ((equatorProjectionSq * r1Sq) + (poleProjectionSq * r2Sq)) / (equatorProjectionSq + poleProjectionSq) ); return r; } console.log(getSpheroidRadius(50, 6378.137, 6356.7523));Suponiendo que su ecuación sea correcta, soy programador, no geógrafo; prueba esto:
function square(number) { return Math.pow(number,2); } var lattitude; const radiusAtEquator = 6371000; const radiusAtPole = Number.MIN_VALUE; var radius = Math.sqrt(square(square(radiusAtEquator) * Math.cos(lattitude))) / (square(radiusAtEquator * Math.cos(lattitude)) + square(radiusAtPole * Math.sin(lattitude)))Si quería sacar la raíz cuadrada de todo, simplemente elimine un ')' antes de '/' y agréguelo al final. Además, debe dar a la latitud un valor numérico antes de ejecutar el programa o no funcionará.
Escribiré la fórmula, pero puedes editarla para que sea más legible:
function calculateR(B,r1,r2){ const R = Math.sqrt( ((r1*r1 * Math.cos(B))*(r1*r1 * Math.cos(B)) + (r2*r2 * Math.sin(B))*(r2*r2 * Math.sin(B)) / ((r1* Math.cos(B))*((r1* Math.cos(B)) + (r2*Math.sin(B)*(r2*Math.sin(B))))))) return R; } //call your method here : console.log(calculateR(1,2,3));