1

私はarray次のように長い緯度を持っています:

var locationList = new Array( '23.2531803, 72.4774396', '22.808782, 70.823863', '24.3310019, 72.8516531', '22.3073095, 73.1810976', '22.3038945, 70.8021599', '23.850809, 72.114838' );

最初に指定された配列から約25kmの緯度に最も近くなりたい23.2531803, 72.4774396

与えられたアレイから最も近い25kmの緯度の計算はありますか。

NOTE: for some reason i can not use sql query, because i get lat long from given address 
4

3 に答える 3

4

ステップ 1: 開始座標とすべてのサブ座標の間の距離を計算します ステップ 2: 最小の距離を選択します ステップ 3: < 25 km ですか? 成功!

2 つの座標間の距離を計算する方法:

function distance($lat1, $lon1, $lat2, $lon2) {

$D = 6371; // Earth Radius
$dLat = $lat2-$lat1;
$dLon = $lon2-$lon1;

$a = sin($dLat/2) * sin($dLat/2) +
     sin($dLon/2) * sin($dLon/2) * cos($lat1) * cos($lat2); 

$b = 2 * atan2(sqrt($a), sqrt(1-$a)); 
$c = 2 * atan2(sqrt($a), sqrt(1-$a)); 


return $D * $c;

}

この関数は、地球を完全な球と見なしますが、そうではありません。わずかな変動は適用されますが、必要な 25km の直径では無視できます。

于 2012-06-05T07:09:39.143 に答える
1

まず、データ配列がひどいです。データをコンピュータで読み取りやすくする必要があります。次に、ピタゴラスの定理を使用して、各場所からの距離を計算できます。最初の距離とインデックスを変数に保存し、それが短い場合は新しい距離とインデックスに置き換えることができます。

var closest = {id:0,dist:-1};
var myloc = [23.2531303, 72.4774398]
for(var i = 0; i < locationList.length; i++)
{
  var long_lat = locationList[i].match(/([0-9.]+)+/)
  long_lat[0] = parseFloat(long_lat[0]);
  long_lat[1] = parseFloat(long_lat[1]);
  var dist = Math.sqrt(Math.pow(long_lat[0] - myloc[0], 2)+Math.pow(long_lat[1] - myloc[1], 2)));
  if((closest.dist == -1) || (closest.dist > dist))
  {
    closest.dist = dist;
    closest.id = i;
  }

}
于 2012-06-05T07:18:46.337 に答える