0

こんにちは、ユーザーの現在の位置と配列内のオブジェクトとの間の距離を取得するために正弦関数を使用するのに苦労しています。この質問に対する優れた答えを見つけましたが、実際の座標の代わりに変数を使用しようとすると、式は機能しません。 、うまくいけば、誰かが私が間違っている場所を知っているでしょう

これが私をここまで導いた質問です。Talkol さん、回答ありがとうございます

Javascript で Haversine 式を使用する

これは私がこれまでに得たものです

  navigator.geolocation.getCurrentPosition (function (posa)
{
  var lat = posa.coords.latitude.toFixed(6);
  var lng = posa.coords.longitude.toFixed(6);

});

    function getCurrent() {

var lat1 = lat; 
var lon1 = lng;

var lat2 = 42.741; 
var lon2 = -71.3161; 

Number.prototype.toRad = function() {
   return this * Math.PI / 180;
}
 var R = 6371; // km 
//has a problem with the .toRad() method below.
var x1 = lat2-lat1;
var dLat = x1.toRad();  
var x2 = lon2-lon1;
var dLon = x2.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; 

alert(d);
var distance = d

$("#distance").val (distance);
}
4

2 に答える 2

1

あなたのコードをエラーなしで動作させようとしました。最終的には独自のコードを使用しました。ご覧のとおり、lat2&lon2 はグローバルに宣言されています。2 つの関数 Haversine() と deg2rad() は、load() の外部で宣言され、パラメータと戻り値を伴います。

<script type="text/javascript">
var lat2 = 42.741; 
var lon2 = -71.3161; 

function deg2rad(degrees){
radians = degrees * (Math.PI/180);
return radians;
}

function Haversine(lat1,lon1,lat2,lon2) {
  deltaLat = lat2 - lat1 ;
  deltaLon = lon2 - lon1 ;
  earthRadius =  6369087 ; // in meters 3959 in miles.
  alpha    = deltaLat/2;
  beta     = deltaLon/2;
  a        = Math.sin(deg2rad(alpha)) * Math.sin(deg2rad(alpha)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.sin(deg2rad(beta)) * Math.sin(deg2rad(beta)) ;
  c        = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  distance =  earthRadius * c;
  return distance.toFixed(2);
}

function load(){//Called on page load
if(navigator.geolocation)
  {
  navigator.geolocation.getCurrentPosition(function(position)
   {
  var lat1 = position.coords.latitude.toFixed(6);
  var lon1 = position.coords.longitude.toFixed(6);
  var distance = Haversine(lat1,lon1,lat2,lon2)+ " meters";
  $("#distance").val (distance);

    });
}
}
</script>
于 2013-07-24T17:36:24.070 に答える
0

lat宣言またはスコープ内にあるようには見えませんlng-現在、非同期getCurrentPositionコールバック関数でローカル変数として割り当てられているため、現在は(オブジェクトundefinedではなく)変数です。Number

getCurrentコールバック内から呼び出し、パラメータlatlngパラメータを渡す必要があります。また、それらをオブジェクトとして保持する必要がありNumberます-への呼び出しは.toFixedそれらを強制的に文字列に変換し、これも機能しなくなり.toRadます。

.toRad最後に、関数が呼び出されるNumber.prototypeたびにではなく、一度だけ追加する必要があります。getCurrent

于 2013-07-23T10:51:58.190 に答える