toRad () function JavaScript jogando erro

Eu estou tentando encontrar a distância entre dois pontos (para os quais eu tenho latitudes e longitudes) usando a técnica descrita aqui em Calcular a distância entre dois pontos de latitude-longitude? (Fórmula de Haversine)

Os códigos são como abaixo Javascript:

var R = 6371; // Radius of the earth in km var dLat = (lat2-lat1).toRad(); // Javascript functions in radians var dLon = (lon2-lon1).toRad(); var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * Math.sin(dLon/2) * Math.sin(dLon/2); var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); var d = R * c; // Distance in km 

Mas quando eu tento implementá-lo, um erro aparece dizendo Uncaught TypeError: Object 20 has no Method 'toRad' .

Preciso de uma biblioteca especial ou algo assim para obter o trabalho .toRad ()? porque parece estar estragando a segunda linha.

Você está faltando uma declaração de function.

Nesse caso, toRad() deve ser definido primeiro como:

 /** Converts numeric degrees to radians */ if (typeof(Number.prototype.toRad) === "undefined") { Number.prototype.toRad = function() { return this * Math.PI / 180; } } 

de acordo com o segmento de código, tudo na parte inferior da página

Ou no meu caso isso não funcionou. Pode ser porque eu precisei chamar toRad () dentro do jquery. Eu não tenho 100% de certeza, então eu fiz isso:

 function CalcDistanceBetween(lat1, lon1, lat2, lon2) { //Radius of the earth in: 1.609344 miles, 6371 km | var R = (6371 / 1.609344); var R = 3958.7558657440545; // Radius of earth in Miles var dLat = toRad(lat2-lat1); var dLon = toRad(lon2-lon1); var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon/2) * Math.sin(dLon/2); var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); var d = R * c; return d; } function toRad(Value) { /** Converts numeric degrees to radians */ return Value * Math.PI / 180; } 

Eu precisava calcular muitas distâncias entre os pontos do meu projeto, então fui em frente e tentei otimizar o código, eu encontrei aqui. Em média, em diferentes navegadores, minha nova implementação é executada quase três vezes mais rápido do que o mencionado aqui.

 function distance(lat1, lon1, lat2, lon2) { var R = 6371; // Radius of the earth in km var dLat = (lat2 - lat1) * Math.PI / 180; // deg2rad below var dLon = (lon2 - lon1) * Math.PI / 180; var a = 0.5 - Math.cos(dLat)/2 + Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * (1 - Math.cos(dLon))/2; return R * 2 * Math.asin(Math.sqrt(a)); } 

Você pode jogar com o meu jsPerf (que foi muito melhorado graças ao Bart) e ver os resultados aqui .

Por que não simplificar a equação acima e alguns poucos cálculos?

Math.sin(dLat/2) * Math.sin(dLat/2) = (1.0-Math.cos(dLat))/2.0

Math.sin(dLon/2) * Math.sin(dLon/2) = (1.0-Math.cos(dLon))/2.0

Eu estava tendo o mesmo problema … olhando para a resposta de Casper, eu apenas fiz uma correção rápida: Ctrl+H (Find and Replace), substituí todas as instâncias de .toRad() por * Math.PI / 180 . Isso funcionou para mim.

Nenhuma ideia sobre o desempenho do navegador acelera, etc .. Meu caso de uso só precisa disso quando o usuário clica em um mapa.

Eu mudei algumas coisas:

 if (!Number.prototype.toRad || (typeof(Number.prototype.toRad) === undefined)) { 

e notei que não havia verificação dos arguments . Você deve certificar-se de que os argumentos estão definidos E provavelmente faça um parseInt(arg, 10) / parseFloat lá.