• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Peilung anhand zweier Koordinaten berechnen

Hallo zusammen,

ich hoffe dass ich meine Frage bei der Suche hier im Forum nicht übersehen habe.

Was mich derzeit beschäftigt:
Es gibt Caches im Sinne "Peile von Punkt A xy Meter mit z Grad um Punkt B zu erreichen"
Wie bekomme ich so etwas berechnet, wenn ich Punkt B bereits als Koordinaten vor mier liegen habe.

Ja - ich könnte die Strecke mit einem Meterzähler abgehen. Aber wenn die Strecke durch Gestrüpp geht oder gar über einen Fluss (nur als Beispiel), strauchel ich sicher in der Meterangabe.

Zu dem interessiert mich wirklich wie so etwas berechnet werden könnte.

Jepp - geht um nen Cache (noch nicht existent), also gibt evtl. Spoilerseiten für so etwas?

Grüße aus dem Pott,
Marco
 
siehe auch hier http://www.geoclub.de/viewtopic.php?f=17&t=15179&start=0

dort ist eine excel-tabelle verlinkt, mit der du das alles berechnen lassen kannst.
 

Aceacin

Geowizard
Das Ausmessen ist ja denkbar einfach. Hab ich (zwangsläufig) gemacht. als ich noch mein eTrex H hatte.
Ein Kreis hat 360 Grad, demnach hat ein Halbkreis 180°. Wenn Du Dich nun von Punkt A wegbewegst wird Dir die Entfernung dorthin und eine Gradzahl angezeigt. Addiere oder subtrahiere 180° (je nach dem ob die Gradangabe größer oder kleiner 180° ist) und Du weißt, in welche Richtung Du Dich bewegt hast.
In Deinem Beispiel:
Du hast Koordinate A und gehst zu Punkt B. Von hier aus siehst Du meinetwegen dass A in 326m und 143° liegt.
143° ist kleiner 180 also 180° addieren = 323°
Punkt B liegt also von A aus gesehen in 326m, 323°
Zur Berechnung von Wegpunktprojektionen kannst Du zusätzlich natürlich noch Google bemühen. (z.B. Theorie bei CacheWiki)

Ich hoffe, das hilft Dir weiter.

CU,
Aceacin
 

kiozen

Geomaster
Folgendes gibt Dir bei gegebenen Punkt p1 und p2 die Distanz zwischen den beiden Punkten. In a1 und a2 wird der vorwärtige und rückwärtige Azimut zurück gegeben.

Code:
// from http://www.movable-type.co.uk/scripts/LatLongVincenty.html
// additional antipodal convergence trick might be a bit lame, but it seems to work
double distance(const XY& p1, const XY& p2, double& a1, double& a2)
{
    double cosSigma = 0.0;
    double sigma = 0.0;
    double sinAlpha = 0.0;
    double cosSqAlpha = 0.0;
    double cos2SigmaM = 0.0;
    double sinSigma = 0.0;
    double sinLambda = 0.0;
    double cosLambda = 0.0;

    double L = p2.u - p1.u;

    double U1 = atan((1-WGS84_f) * tan(p1.v));
    double U2 = atan((1-WGS84_f) * tan(p2.v));
    double sinU1 = sin(U1), cosU1 = cos(U1);
    double sinU2 = sin(U2), cosU2 = cos(U2);
    double lambda = L, lambdaP = (double)(2*PI);
    unsigned iterLimit = 20;

    while (fabs(lambda - lambdaP) > 1e-12)
    {
        if (!iterLimit)
        {
            lambda = PI;
            qDebug() << "No lambda convergence, most likely due to near-antipodal points. Assuming antipodal.";
        }

        sinLambda = sin(lambda);
        cosLambda = cos(lambda);
        sinSigma = sqrt((cosU2*sinLambda) * (cosU2*sinLambda) + (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda));

        if (sinSigma==0)
        {
            return 0;            // co-incident points
        }

        cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;
        sigma = atan2(sinSigma, cosSigma);
        sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma;
        cosSqAlpha = 1 - sinAlpha * sinAlpha;
        cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSqAlpha;

        if (isnan(cos2SigmaM))
        {
            cos2SigmaM = 0;      // equatorial line: cosSqAlpha=0 (6)
        }

        double C = WGS84_f/16 * cosSqAlpha * (4 + WGS84_f * (4 - 3 * cosSqAlpha));
        lambdaP = lambda;

        if (iterLimit--) lambda = L + (1-C) * WGS84_f * sinAlpha * (sigma + C*sinSigma*(cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)));
    }

    double uSq = cosSqAlpha * (WGS84_a*WGS84_a - WGS84_b*WGS84_b) / (WGS84_b*WGS84_b);
    double A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));
    double B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));
    double deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));
    double s = WGS84_b*A*(sigma-deltaSigma);

    a1 = atan2(cosU2 * sinLambda, cosU1 * sinU2 - sinU1 * cosU2 * cosLambda) * 360 / TWOPI;
    a2 = atan2(cosU1 * sinLambda, -sinU1 * cosU2 + cosU1 * sinU2 * cosLambda) * 360 / TWOPI;
    return s;
}

Und hiermit kannst Du bei bekanntem Punkt pt1, Abstand "distance" und Winkel "bearing" den 2. Punkt pt2 berechnen:

Code:
XY GPS_Math_Wpt_Projection(const XY& pt1, double distance, double bearing)
{
    XY pt2;

    double d    = distance / 6378130.0;
    double lon1 = pt1.u;
    double lat1 = pt1.v;

    double lat2 = asin(sin(lat1) * cos(d) + cos(lat1) * sin(d) * cos(-bearing));
    double lon2 = cos(lat1) == 0 ? lon1 : fmod(lon1 - asin(sin(-bearing) * sin(d) / cos(lat1)) + PI, TWOPI) - PI;

    pt2.u = lon2;
    pt2.v = lat2;
    return pt2;
}

Könnte man das mal pinnen? Die Frage kommt alle paar Wochen und es scheint unmöglich die Suche passend zu benutzen.

Oliver
 

moenk

Administrator
Teammitglied
Die Frage wie man sowas angeht ist hier gut erläutert: http://de.wikipedia.org/wiki/Orthodrome
 
Oben