toRad () 자바 스크립트 함수에서 오류 발생
두 위도-경도 지점 사이의 거리 계산에 설명 된 기술을 사용하여 두 지점 (위도와 경도가 있음) 사이의 거리를 찾으려고합니다 . (하버 신 공식)
코드는 다음과 같습니다. 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
그러나 그것을 구현하려고 할 때 오류가 나타납니다 Uncaught TypeError: Object 20 has no Method 'toRad'
.
.toRad ()를 작동시키기 위해 특별한 라이브러리 나 무언가가 필요합니까? 두 번째 줄에서 망가진 것 같기 때문입니다.
함수 선언이 누락되었습니다.
에서 이 경우 toRad()
첫 번째로 정의해야합니다 :
/** Converts numeric degrees to radians */
if (typeof(Number.prototype.toRad) === "undefined") {
Number.prototype.toRad = function() {
return this * Math.PI / 180;
}
}
페이지 하단의 코드 세그먼트에 따라
또는 제 경우에는 이것이 작동하지 않았습니다. jquery 내에서 toRad ()를 호출해야했기 때문일 수 있습니다. 100 % 확실하지 않아서 이렇게했습니다.
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;
}
내 프로젝트를 위해 포인트 사이의 많은 거리를 계산해야했기 때문에 코드를 최적화하려고했는데 여기서 찾았습니다. 평균적으로 다른 브라우저에서 새로운 구현 은 여기에 언급 된 것 보다 거의 3 배 빠르게 실행 됩니다.
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));
}
내 jsPerf (Bart 덕분에 크게 향상됨)로 플레이하고 여기 에서 결과를 볼 수 있습니다 .
위의 방정식을 단순화하고 몇 가지 계산을 동일하게하지 않는 이유는 무엇입니까?
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
나는 같은 문제를 겪고 있었다 .. Casper의 대답을보고, 나는 방금 빠른 수정을했다 : Ctrl+H
(Find and Replace), 모든 인스턴스 .toRad()
를 * Math.PI / 180
. 그것은 나를 위해 일했습니다.
그래도 브라우저 성능 속도 등에 대해서는 알 수 없습니다. 내 사용 사례는 사용자가지도를 클릭 할 때만 필요합니다.
몇 가지를 변경했습니다.
if (!Number.prototype.toRad || (typeof(Number.prototype.toRad) === undefined)) {
and, I noticed there was no checking for the arguments
. You should make sure the args are defined AND probably do a parseInt(arg, 10)
/ parseFloat
on there.
참고URL : https://stackoverflow.com/questions/5260423/torad-javascript-function-throwing-error
'Programing' 카테고리의 다른 글
Angular 2에서 제출 한 후 양식을 지우는 방법은 무엇입니까? (0) | 2020.12.03 |
---|---|
MYSQL 파티셔닝이란? (0) | 2020.12.03 |
Firebug에서 축소 된 JS를 어떻게 디버깅 할 수 있습니까? (0) | 2020.12.03 |
롤링 분산 알고리즘 (0) | 2020.12.02 |
WCF 서비스 클라이언트 : 콘텐츠 유형 text / html; (0) | 2020.12.02 |