2011-09-12 24 views
3

私のプロジェクトでは、ユーザは与えられた円形の領域内のランダムな位置に配置することを選択できます。 私は中心と半径の緯度と経度を持っています:どのようにして、与えられた領域内のランダムな点の緯度と経度を計算できますか? (私はPHPを使用していますが、どの言語の例でも適合します)中心と半径を指定して、領域内でランダムなLATとLNGを生成する方法

答えて

11

ランダムに生成された番号が2つ必要です。

長方形(Cartesian)(x、y)座標を使用してこれを考えると、問題の空間にはやや不自然です。半径を指定すると、中心と半径で定義される円内にある(Δx、Δy)デルタを直接計算する方法について考えるのはいくぶん難しいです。

polar coordinatesを使用して、寸法を(r1、Θ)とした問題を分析するとよいでしょう。半径で囲まれた1つのランダム距離を計算します。 0から360度までのランダムな角度を計算します。次にconvert the (r,Θ) to Cartesian (Δx,Δy)。デカルト量は単純な三角法の関係を使って円の中心からのオフセットだけです。

Δx = r * cos(Θ) 
    Δy = r * sin(Θ) 

そして新しい点は、単にこれは、地球の形状は、ユークリッド(平面)形状によって近似することができる場合には小さなR、のために働く

xnew = x + Δx 
    ynew = y + Δy 

あります。


rが大きくなるにつれて、地球の曲率はユークリッド近似が状況の現実と一致しないことを意味します。その場合、地球の3d湾曲を考慮に入れてuse the formulas for geodesic distanceにする必要があります。これは、100kmの距離を超えて、理にかなっています。もちろん、それはあなたが必要とする精度の程度にもよりますが、私はあなたにはかなりの揺れの部屋があると仮定しています。

3Dジオメトリでは、角度と距離の2つの数値を計算する必要があります。この場合、距離は地球の表面上で測定され、「大円距離」として知られています。最初の数量に対して、あなたのr以下の数を無作為に生成します。

大きな円幾何関係

d = R Δσ 

... dは、大圏距離は、球の半径との表面上の2点のなす中心角に比例することを述べて球。 「中心角」は、球の中心が頂点にあり、他の2つの点が球の表面上にある3つの点によって記述された角度を指す。

あなたの問題では、このdは元の「r」によって束縛されたランダムな量でなければなりません。 dを計算すると、地球のRが分かっているため(約6371.01 km)、中心角、つまりΔσが得られます。

これは、元の緯度/経度から離れた大きな円に沿った絶対(ランダム)距離を与えます。今度は、あなたの元のポイントからの旅行のN/S/E/Wの方向を説明する、角度で数値化された方向が必要です。 0-360度の乱数を使用してください。ここではゼロが東向きです。


緯度の変化は、d sin(Θ)によってd cos(Θ)により経度の変化を計算することができます。これはrと同じ次元(おそらくkm)の大きな円の距離を与えますが、緯度/経度が必要なので、変換する必要があります。緯度から度までの距離を得るのは簡単です:it's about 111.32 km per degree regardless of latitude。長手方向の線から長手方向への変換は、長手方向の線が極に近いほど互いに近くなるので、より複雑である。したがって、選択したd(距離)と角度に対応する経度の変化を計算するには、さらにcomplex formulaeを使用する必要があります。あなたは+/- 180°の壁を越える必要があるかもしれないことを忘れないでください。 (F22 Raptorの設計者はこれを忘れていました。their airplanes nearly crashed when attempting to cross the 180th meridian

逐次比較では誤差が累積する可能性があるため、新しい点が制約条件を満たすかどうかチェックしたいと思うでしょう。これはあなたにΔσ、新旧の緯度/経度点の間の中心角を与える式Δlatは、緯度の変化である

Δσ = arccos(cos(Δlat) - cos(lat1)*cos(lat2)*(1 - cos(Δlong)) . 

など

を使用してください。ここで計算した中心角が、以前にランダムに選択した中心角と同じであることを確認します。換言すれば、計算された点の間の計算されたd(大円距離)が、あなたがランダムに選択した大円距離と同じであることを検証する。計算されたdが選択したdと異なる場合は、数値近似を使用して精度を向上させ、基準を満たすまで緯度または経度をわずかに変更することができます。

+0

ありがとうございます*優れた説明ありがとうございます。この(より複雑な)アルゴリズムhttp://www.geomidpoint.com/random/calculation.htmlが測地線距離(私が必要としない..私たちはある都市周辺の地域について話しているので、私は100KMの制限に入っています)。しかし、私が困惑しているのは、乱数の「分布」について話している点6です。それは本当に心配ですか? – Claudio

+2

それは懸念するかもしれません。半径内で完全にランダムな分布を持つ乱数nを選択すると、円の中心に近い場所は、離れた場所よりも「頻繁に」選択されます。このように考える:半径rの円を想像してみてください。半径r/2の同じ点を中心とする別の円を想像してみましょう。最初の円の面積は2番目の円の面積の4倍です。ランダム選択が0..r/2からr/2..rの間の数を選択するように頻繁に選択できる場合は、領域の1/4以内の点を選択する時間の半分を選択することができます。 – Cheeso

+0

しかし、修正は簡単に適用できます。その効果を補う乱数ジェネレータが必要です。彼はそれを提供する。 'dist = acos(rand1 *(cos(maxdist) - 1)+ 1)'なぜ+1と-1がそこにあるのかわかりません。それはあなたがそれらを落とすことができるようです。このような変更された乱数生成器は、円の全領域にわたってより均一な点の分布を与えます。 – Cheeso

0

これは、ランダムなベアリング(0と2 * pi)と0とあなたの希望する最大半径の間のランダム距離を計算することで簡単に行うことができます。次に、与えられた緯度/経度の中心点からのランダムな方位/範囲を使用して新しい(ランダム)緯度/経度を計算します。 http://www.movable-type.co.uk/scripts/latlong.html

注意:与えられた式はすべての角度がラジアン(緯度/経度を含む)であると想定しています。結果の緯度/経度はラジアン単位であるため、度に変換する必要があります。

+0

私は問題を誤読している可能性があります。ある点からランダムな緯度/経度が欲しいのですか、それともユーザーがランダムな点を選んだのですか?その「クリックされた」点の緯度/経度を特定する必要がありますか? – TreyA

関連する問題