web-dev-qa-db-ja.com

2つの経度/緯度ポイントで方向(コンパス)を取得する

私はモバイルデバイス用の「コンパス」に取り組んでいます。私は次の点を持っています:

point 1 (current location): Latitude = 47.2246, Longitude = 8.8257
point 2 (target  location): Latitude = 50.9246, Longitude = 10.2257

また、私は次の情報を持っています(私のAndroidフォンから):

The compass-direction in degree, wich bears to the north. 
For example, when I direct my phone to north, I get 0°

ポイントへの方向を示す「コンパスのような」矢印を作成するにはどうすればよいですか?

これには数学的な問題がありますか?

ありがとう!

編集:さて私は解決策を見つけました、それはこのように見えます:

/**
 * Params: lat1, long1 => Latitude and Longitude of current point
 *         lat2, long2 => Latitude and Longitude of target  point
 *         
 *         headX       => x-Value of built-in phone-compass
 * 
 * Returns the degree of a direction from current point to target point
 *
 */
function getDegrees(lat1, long1, lat2, long2, headX) {

    var dLat = toRad(lat2-lat1);
    var dLon = toRad(lon2-lon1);

    lat1 = toRad(lat1);
    lat2 = toRad(lat2);

    var y = Math.sin(dLon) * Math.cos(lat2);
    var x = Math.cos(lat1)*Math.sin(lat2) -
            Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon);
    var brng = toDeg(Math.atan2(y, x));

    // fix negative degrees
    if(brng<0) {
        brng=360-Math.abs(brng);
    }

    return brng - headX;
}

これは私にとっては素晴らしいです!

20
eav

やがて答えを見つけたと言うのを忘れた。アプリケーションは、通過車両とその目的地のコンパスの方向を決定することです。基本的に、地球の曲率を取得し、角度/コンパスの読み取り値を見つけて、その角度を一般的なコンパス値と照合するための空想的な数学です。もちろん、単にcompassReadingを保持し、それを画像の回転量として適用することもできます。これは、終点(バス停)への車両の方向の平均決定であることに注意してください。つまり、道路が何をしているのかを知ることができません(これは、飛行機やローラーダービーに最も当てはまります)。

//example obj data containing lat and lng points
//stop location - the radii end point
endpoint.lat = 44.9631;
endpoint.lng = -93.2492;

//bus location from the southeast - the circle center
startpoint.lat = 44.95517;
startpoint.lng = -93.2427;

function vehicleBearing(endpoint, startpoint) {
    endpoint.lat = x1;
    endpoint.lng = y1;
    startpoint.lat = x2;
    startpoint.lng = y2;

    var radians = getAtan2((y1 - y2), (x1 - x2));

    function getAtan2(y, x) {
        return Math.atan2(y, x);
    };

    var compassReading = radians * (180 / Math.PI);

    var coordNames = ["N", "NE", "E", "SE", "S", "SW", "W", "NW", "N"];
    var coordIndex = Math.round(compassReading / 45);
    if (coordIndex < 0) {
        coordIndex = coordIndex + 8
    };

    return coordNames[coordIndex]; // returns the coordinate value
}

つまり、vehicleBearing(mybus、busstation)は「NW」を返す可能性があります。これは、北西に移動することを意味します。

16
efwjames

私は数学でいくつかの有用なgps座標式を見つけました here 。この場合、ここで私の解決策

 private double getDirection(double lat1, double lng1, double lat2, double lng2) {

    double PI = Math.PI;
    double dTeta = Math.log(Math.tan((lat2/2)+(PI/4))/Math.tan((lat1/2)+(PI/4)));
    double dLon = Math.abs(lng1-lng2);
    double teta = Math.atan2(dLon,dTeta);
    double direction = Math.round(Math.toDegrees(teta));
    return direction; //direction in degree

}
1
deya tri

私はあなたの解決策をよく理解できず、勾配を計算してくれました。 efwjames とその答えを変更するには、これはすべきです-

import math
def getDegrees(lat1, lon1, lat2, lon2,head):
    dLat = math.radians(lat2-lat1)
    dLon = math.radians(lon2-lon1)
    bearing = math.degrees(math.atan2(dLon, dLat))
    return head-bearing
0
Vivek