中心点から平方xマイルの座標を計算しますか?


11

中心点を中心にxマイルの正方形(または円)を作成しようとしています。正方形のすべての辺は中心からxマイルになります。四隅の座標が必要です。

頭を動かそうとして脳をスクランブルしているのですか?Haversineの式を使用して2点間の距離を計算できますが、数学は私の長所ではなく、罪やcosなどを理解していません。

ポイントから緯度/経度Xマイルの計算に遭遇しましたか?しかし、私はそれを取得しません!

リンゴと梨の言葉で私がこれをどのように行うのかを説明するのに十分な人がいますか?

私がやろうとしていることを正確に説明する。

ユーザーが特定の地域の建物を検索できるウェブサイトを持っています。彼らは町や場所(私は緯度の長いことを知っているだろう)に入り、その場所から約10マイルの特定の半径内で検索します。

10マイルの半径の最小/最大緯度と経度を見つける必要があるので、次のようなwhere句を使用してデータベースを照会できます。

Where buildingLat <= maxLat 
  and buildingLat <= minLat 
  and buildingLong >= minLong 
   or buildingLong >= maxLong

何らかの数式が必要です!

私の座標は小数度です

回答:


10

この目的のためには、単純な近似で十分です。 北または南、1度は約69マイルですが、東または西は69 * cos(緯度)マイルです。緯度は10マイルのスパンではあまり変化しないため、「正方形」の中心緯度のコサインを安全に使用できます。したがって、lat-lonとして与えられる、中心位置(f、l)からrマイルの距離にある正方形の頂点の望ましい座標は、次のように計算されます。

df = r/69        // North-south distance in degrees
dl = df / cos(f) // East-west distance in degrees
{(f-df,l-dl), (f+df,l-dl), (f+df,l+dl), (f-df,l+dl)} // List of vertices

たとえば、r = 10マイルで、中央の場所が北緯50度、西経1度で、(f、l)=(50、-1)度であるとします。それから

df = 10/69 = 0.145
dl = 0.145 / cos(50 degrees) = 0.145 / 0.6428 = 0.225
f - df = 50 - 0.145 = 49.855 (southernmost latitude)
f + df = 50 + 0.145 = 50.145 (northernmost latitude)
l - dl = -1 - 0.225 = -1.225 (western longitude)
l + dl = -1 + 0.225 = -0.775 (eastern longitude)

座標は(49.855、-1.225)、(50.145、-1.225)、(50.145、-0.775)、および(49.855、-0.775)であり、南西隅から正方形を時計回りに行進します。

極の近くで、または一辺が数度よりも大きい正方形では、この近似を使用しないでください。また、GISの制限に応じて、経度のグローバルカット(通常は+ -180度で行われる)に注意が必要になる場合があります。


4

中心のX座標を取得し、そこからxマイルを減算します。これは正方形の左側です。次に、中心のY座標を取得し、そこからXマイルを引きます。これが正方形の底です。これらの手順を繰り返しますが、右手と上端を得るために減算ではなく加算します。これで、正方形の四隅を構築できます。

上記では、中心点がマイルであると仮定しています。最初に再投影しない場合。それ以外の場合、すべてのベットはオフになり、あなたのスクエアはスクエアになりません。


サンプルページを参照していますか?座標からマイルを減算する方法と、地球の曲率を考慮する必要はありませんか?
ベックス

いいえ、非常に単純なので、実際に動作する例を用意する必要はありません。たぶん、使用しているソフトウェアを指定する必要がありますか?私が言ったように、私のソリューションはローカルSRSに座標を投影していることを前提としています(そうでなければ、それが最初の質問になります)
イアンタートン

今は本当に混乱しています!私がやろうとしていることを正確に伝えるために質問を更新しました。緯度と経度の最小値と最大値を見つけることができるように、バウンディングボックスを作成する必要があります。
ベックス

3
proj4js(proj4js.org)はそのとき役立つはずです
イアン・タートン

1
私の座標は次のようになります:51.498485、-0.129089それは度ではありませんか?
ベックス

4

最後に私の答えは:(c#で)

おそらく4つの座標は必要ありませんが、かなり正確だと思います。

 public static void GetBoundingCoords(double centerLat, double centerLong,  double distance)
    {
     Coordinate top=   MaxLatLongOnBearing(centerLat, centerLong,45,10);
     Coordinate right = MaxLatLongOnBearing(centerLat, centerLong, 135, 10);
     Coordinate bottom = MaxLatLongOnBearing(centerLat, centerLong, 225, 10);
     Coordinate left = MaxLatLongOnBearing(centerLat, centerLong, 315, 10);
    }

    public static Coordinate MaxLatLongOnBearing(double centerLat, double centerLong, double bearing, double distance)
    {

        var lonRads = ToRadian(centerLong);
        var latRads = ToRadian(centerLat);
        var bearingRads = ToRadian(bearing);
        var maxLatRads = Math.Asin(Math.Sin(latRads) * Math.Cos(distance / 6371) + Math.Cos(latRads) * Math.Sin(distance / 6371) * Math.Cos(bearingRads));
        var maxLonRads = lonRads + Math.Atan2((Math.Sin(bearingRads) * Math.Sin(distance / 6371) * Math.Cos(latRads)), (Math.Cos(distance / 6371) - Math.Sin(latRads) * Math.Sin(maxLatRads)));

        var maxLat = RadiansToDegrees(maxLatRads);
        var maxLong = RadiansToDegrees(maxLonRads);

        return new Coordinate(){Latitude=maxLat, Longitude=maxLong};
    }

編集

正方形の角を中心点からxマイルに設定すると、正方形の端が同じxマイルにならないことに気付きました。(数学は私の長所ではありませんでした)ですから、正方形のエッジをxマイルにしたい場合に中心点からコーナーポイントまでの距離を取得するには、ピタゴラスの定理を使用して対角線の距離を計算しました。(直角三角形では、斜辺上の正方形(対角線)は他の2つの辺の正方形に等しい)


それは正方形ではありません。
イアンタートン

ベアリングを修正しました。これはダイヤモンドでした。今では正方形になっています
ベックス

編集に関しては、ピタゴラスの定理は小さな正方形には問題ありませんが、一般に球形の直角三角形には当てはまりません。この場合、コードが球面幾何学と平面ジオメトリに基づくこの近似を使用するのは奇妙です。
whuber

私の距離は100マイルを超えることはないので、それは重要ではないと思います。不正確さは距離が小さいほど小さくなるためです。
ベックス

1
@whuberが言っているポイントは、それらをピタゴラスの定理と組み合わせると、緯度と経度に沿った距離の複雑な計算を使用してもメリットがないということです。代わりに、whuberのように、またはEwan Toddのように、はるかに単純な計算を使用できます。単純な線形式を使用して、経度をマイルに、緯度をマイルに、またはその逆に変換します。唯一の「厄介な」部分は* cos(lat)、度をマイル/ cos(lat)に変換するとき、およびマイルを度に変換するときに経度の式に調整が必要であることを知っていることです。
ToolmakerSteve

0

空間認識データベースを使用している場合、関心領域をデータが保存されている同じ座標系に変換してから、リンゴとリンゴの比較を行うことができます。

例えば:

  1. ユーザーが場所を選択すると、緯度経度になります。
  2. 空間データベースに、このポイントを面積に適した投影座標系(フィートまたはメートルなど)に変換するように依頼します。
  3. 投影点の周囲に関心領域を構築します。
  4. 空間データベースに、この対象エリアを緯度/経度に戻すように依頼します。
  5. 必要な比較を行います。

0

このページの内容を使用しました

始点からの距離と方位が指定された終点

式:
lat2 = asin(sin(lat1)* cos(d / R)+ cos(lat1)* sin(d / R)* cos(θ))
lon2 = lon1 + atan2(sin(θ)* sin(d / R)* cos(lat1)、cos(d / R)−sin(lat1)* sin(lat2))

θは方位です(ラジアン、北から時計回り)。d / Rは角距離(ラジアン単位)です。dは移動距離、Rは地球の半径です。

θについては、「左上の点」に-45度(ラジアン単位)を使用し、「右下」の点に135度を使用しました

(最近、数学サイトで同じ質問をしました)


このソリューションの問題は、最初に正方形の対角線の距離を把握する必要があることです。代わりに、測地線に沿って中央から辺の中点に移動し、次に90度回転して正方形の辺に沿って移動する方が簡単です。
whuber

@whuber、距離が十分に小さい場合、単純な三角法を使用できませんか?(d =反対側/ sin(隣接側)。距離を正確にする必要はないので、そうします。そうでなければ、この式を2回適用して正確に言うことができます(最初にθ= 0で、次にθで=例えば左上のために-90)
ファン

それは正しい、フアン。しかし、ユークリッドの式がそもそも機能すると仮定する近似から始めると、なぜ球体ジオメトリのより複雑な式を使用するのか疑問に思う人がいます。球面式を使用しても何も問題はありませんが、それは不必要であり、計算効率が悪いです。
whuber

@ whuber、2番目のケースでは概算ではありません(各辺に式を2回適用します)。ただし、それらを混ぜても意味がありません。私は実際にこれが実装されていますが、(:)ああ、と私は数学が得意ということじゃないので、理由がある)私はそれを変更します
フアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.