新しい経度、古いものからの緯度+ nメートルの計算


84

座標とメートル単位の距離に基づいて、2つの新しい経度と2つの新しい緯度を作成したいのですが、特定のポイントの周りに素敵な境界ボックスを作成したいと思います。これは都市の一部であり、最大±1500メートルです。したがって、地球の曲率を考慮する必要はないと思います。

だから私は50.0452345(x)と4.3242234(y)を持っていて、x + 500メートル、x-500メートル、y-500メートル、y +500メートルを知りたい

多くのアルゴリズムを見つけましたが、ほとんどすべてがポイント間の距離を処理しているようです。


回答:


122

経度1度あたりのキロメートル数はおよそ

(2*pi/360) * r_earth * cos(theta)

ここthetaで、は度単位の緯度で、r_earth約6378kmです。

緯度1度あたりのキロメートル数は、すべての場所でほぼ同じで、約

(2*pi/360) * r_earth = 111 km / degree 

だからあなたはすることができます:

new_latitude  = latitude  + (dy / r_earth) * (180 / pi);
new_longitude = longitude + (dx / r_earth) * (180 / pi) / cos(latitude * pi/180);

限りdxdy地球の半径に比べて小さいと、あなたはあまりにも近く極に得ることはありません。


2
度からラジアンに変換するには、pyを掛けて、180で割ります。しかし、次のように書きますcos(latitude*180/pi)
josch 2014

9
@josch:いいキャッチ。単に訂正を提案するのではなく、次回は回答を訂正してみてください。多くの人は、StackOverflowからコードをコピーして貼り付けるだけで、正しくてすぐに使用できると考えています。
Alex Essilfie 2014

4
わかりました、方向はどうなりますか?50メートルを追加したい場合、どこに追加されますか?右、左、上または下?
Tushar Monirul 2017

3
地球は完全に球形ではないため、「半径」に単一の値を使用することは概算です。ウィキペディアによると、「地表から中心までの距離は6,353kmから6,384kmです」とのことです。また、「地球を球としてモデル化するいくつかの異なる方法では、それぞれ平均半径6,371 kmが得られます」と書かれており、これはあなたの価値を示しています。実際、この修正がアプリケーションで重要である場合は、とにかくより良いアルゴリズムを使用する必要があります。
nibot 2017年

4
わからない人のためr_earth変数はメートルにする必要があり、約6371000.0に等しくなるべきである
アミットAssaraf

26

受け入れられた答えは完全に正しく、機能します。私はいくつかの調整を行い、これに変わりました:

double meters = 50;

// number of km per degree = ~111km (111.32 in google maps, but range varies
   between 110.567km at the equator and 111.699km at the poles)
// 1km in degree = 1 / 111.32km = 0.0089
// 1m in degree = 0.0089 / 1000 = 0.0000089
double coef = meters * 0.0000089;

double new_lat = my_lat + coef;

// pi / 180 = 0.018
double new_long = my_long + coef / Math.cos(my_lat * 0.018);

これもお役に立てば幸いです。


27
0.0000089?マジックナンバーは避けてください。誰もこれを理解できません。
scai 2016年

2
これは、コード内の地球の直径と円周率の短いバージョンです。魔法ではありません。
Numan Karaaslan 2016年

16
この数字を再現する方法を誰も知らなければ、それはまだ魔法です。完全な計算をコードに入れてみませんか?
scai 2016年

13
グーグルマップの1度は111.32キロメートルに等しい。1度= 111.32KM。1KM(度)= 1 / 111.32 = 0.008983。1M in Degree = 0.000008983。
Muhammad Azeem 2017年

7
あなたはあなたの答えにコメントをするべきでした、コメントにそれを入れることは役に立ちません。
chutsu 2017

18

緯度については、次のようにします。

var earth = 6378.137,  //radius of the earth in kilometer
    pi = Math.PI,
    m = (1 / ((2 * pi / 360) * earth)) / 1000;  //1 meter in degree

var new_latitude = latitude + (your_meters * m);

経度については:

var earth = 6378.137,  //radius of the earth in kilometer
    pi = Math.PI,
    cos = Math.cos,
    m = (1 / ((2 * pi / 360) * earth)) / 1000;  //1 meter in degree

var new_longitude = longitude + (your_meters * m) / cos(latitude * (pi / 180));

変数にyour_metersは、正の値または負の値を含めることができます。


8

チェックアウトしましたか:指定された緯度/経度の北xkmにある緯度/経度を見つけるにはどうすればよいですか?

これらの計算はせいぜい面倒です、私はそれらの多くをしました。半正矢式はあなたの友達になります。

いくつかの参照:http//www.movable-type.co.uk/scripts/latlong.html


非常に狭いエリアで作業している場合、緯度-0.09と経度-0.0148を実行して、約1平方キロメートルのエリアを取得するのは本当に悪いことですか?
ベンジャミンウディンクテンケイト2011

それほど悪くはないと思います。そのレベルの平方キロメートルは、地球の曲率によって歪められることはありません-扱っているLat / Lngが10進数である限り、
ライアンテルニエ2011

1
@BenjaminUdinktenCateこれはアムステルダムでは機能しますが、世界の他の地域では不正確になります。「経度-0.0148」を実行すると、赤道で約0.16kmしか取得できません。
nibot 2011

3

@nibotによる解決策を見つけるために、約2時間費やす必要がありました。中心点と幅/高さ(または半径)をキロメートルで指定して、境界ボックスを作成する方法が必要でした。

私はその解決策を数学的に/地理的に理解していません。4つの座標を取得するために(試行錯誤によって)ソリューションを微調整しました。

北:

private static Position FromKmToNPosition(Position p, double km)
{
    double r_earth = 6378;
    var pi = Math.PI;
    var new_latitude = p.Lat + (km / r_earth) * (180 / pi);
    return new Position(new_latitude, p.Long);
}

東:

private static Position FromKmToEPosition(Position p, double km)
{
    double r_earth = 6378;
    var pi = Math.PI;
    var new_longitude = p.Long + (km / r_earth) * (180 / pi) / Math.Cos(p.Lat * pi / 180);
    return new Position(p.Lat, new_longitude);
}

南:

private static Position FromKmToSPosition(Position p, double km)
{
    double r_earth = 6378;
    var pi = Math.PI;
    var new_latitude = p.Lat - (km / r_earth) * (180 / pi);
    return new Position(new_latitude, p.Long);
}

西:

private static Position FromKmToWPosition(Position p, double km)
{
    double r_earth = 6378;
    var pi = Math.PI;
    var new_longitude = p.Long - (km / r_earth) * (180 / pi) / Math.Cos(p.Lat * pi / 180);
    return new Position(p.Lat, new_longitude);
}

1

正確である必要がない場合は、緯度と経度で10000メートルごとに約0.1です。たとえば、データベースからpoint_Aの周囲3000メートルの場所をロードしたいとします。

double newMeter =  3000 * 0.1 / 10000;
double lat1 = point_A.latitude - newMeter;
double lat2 = point_A.latitude + newMeter;
double lon1 = point_A.longitude - newMeter;
double lon1 = point_A.longitude + newMeter;
Cursor c = mDb.rawQuery("select * from TABLE1  where lat >= " + lat1 + " and lat <= " + lat2 + " and lon >= " + lon1 + " and lon <= " + lon2 + " order by id", null);

0
public double MeterToDegree(double meters, double latitude)
{
    return meters / (111.32 * 1000 * Math.Cos(latitude * (Math.PI / 180)));
}

-1
var meters = 50;
var coef = meters * 0.0000089;
var new_lat = map.getCenter().lat.apply() + coef;
var new_long = map.getCenter().lng.apply() + coef / Math.cos(new_lat * 0.018);
map.setCenter({lat:new_lat, lng:new_long});

2
あなたの答えにいくつかの説明を追加してください。
アンナ

現在のマップの中心近くでマップオブジェクトを約50メートル移動する場合は、+ 50の代わりに+、-の数字を使用してこのコードを使用できます
EyniKave19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.