2011-12-19 5 views
3

クライアント側のJavaScriptを使用して、緯度+経度(実際にはGoogle LatLngオブジェクト)の重心を簡単な平均計算で検索したいと考えています。latinngsの重心(単純平均)を求める

Stack Overflowでこれまで何度も同じような質問が寄せられていますが、JavaScriptについては簡単な答えが見つかりません。 (これは私のグーグルの失敗であるかもしれませんが、重複している場合はお詫び申し上げます)

私はこのようなことをしていますが、例えば緯度179度、 -179、およびので、重心が180ではなく0

var avg_lat, avg_lng; 
for (var i = 0; i < google_latlngs.length; i++) { 
    avg_lat += google_latlngs[0].lat(); 
    avg_lng += google_latlngs[1].lng(); 
} 
avg_lat = avg_lat/google_latlngs.length; 
avg_lng = avg_lng/google_latlngs.length; 

する必要があります私は、クライアント側のJavaScriptでこれを効率的に行う必要があり、そして私のポイントが離れて数km以上のなさそうなので、great-円の距離や何かファンシーは本当にこの場合に必要ではありません。

ありがとうございました。

更新:OK、 JavaScriptでセントロイドを見つける方法があります。

+0

平均値は「179」と「-179」_is_ゼロです。コードが正しく動作しています。正の数しか持たない場合は、['Math.abs()'](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Math/abs)を見てください。 – Bojangles

+0

ああ申し訳ありませんが、私は経度179と-179を意味し、セントロイドは0ではなく180でなければなりません。これは世界の半分です。質問を編集する必要がありますか? – Richard

答えて

5

2点のみを扱う場合は、機能を適用する前に2つの緯度点の差が180以下であることを確認してください。これを行うには360分を加算または減算します。これは-179から181(または179から-181)に変更されます。最終結果が得られたら、最終値が希望の範囲内になるまで360分を加算/減算します。

更新

あなたは、これが2点以上で作業する場合、我々はいくつかのジオメトリを行う必要があるでしょう。

Latitude on a unit circle

我々は、すべてのx年代とyを平均化する必要があります。私たちは、起源と特定の角度から一定の距離xya(緯度)と単位円上の点として、各緯度ポイントを処置します重心の最終的な緯度を得るために得られた点の角度を取る。ここにJavaScriptがあります:

var latXTotal = 0; 
var latYTotal = 0; 
var lonDegreesTotal = 0; 

var currentLatLong; 
for (var i = 0; currentLatLong = google_latlngs[i]; i++) { 
    var latDegrees = currentLatLong.lat(); 
    var lonDegrees = currentLatLong.lng(); 

    var latRadians = Math.PI * latDegrees/180; 
    latXTotal += Math.cos(latRadians); 
    latYTotal += Math.sin(latRadians); 

    lonDegreesTotal += lonDegrees; 
} 

var finalLatRadians = Math.atan2(latYTotal, latXTotal); 
var finalLatDegrees = finalLatRadians * 180/Math.PI; 

var finalLonDegrees = lonDegreesTotal/google_latlngs.length; 
+0

ありがとうございます。しかし、これがどのように3つ以上の値に拡大するのか分かりません。 – Richard

+0

@リチャード:複数の値を含めるようにソリューションを更新しました。 – Briguy37

-1

私は私が正しくアルゴリズムを理解したことをわからないんだけど、私はみます:

var avg_lat, avg_lng; 
for (var i = 0; i < google_latlngs.length; i++) { 
    avg_lat += (google_latlngs[0].lat() > 0 ? google_latlngs[0].lat() : 360 + google_latlngs[0].lat()); 
    avg_lng += (google_latlngs[1].lng() > 0 ? google_latlngs[1].lng() : 360 + google_latlngs[1].lng()); 
} 
avg_lat = avg_lat/google_latlngs.length; 
avg_lng = avg_lng/google_latlngs.length; 

、これはその後、-44と45の間の平均は180.5正しいされている場合 - それは、私はですを懸念。私は-44と+45の平均が0.5だと言います。私が間違っているなら私を訂正してください。

関連する問題