11
votes

Calculer le point final donné la distance, le roulement, le point de départ

J'essaie de trouver le point de destination, donné un point de départ lat / long, roulement et distance. La calculatrice de ce site Web ci-dessous me donne les résultats souhaités.

http: // www.movable-type.co.uk/scripts/latlong.html

Lorsque j'essaie de mettre en œuvre le même code, je ne reçois pas les bons résultats. < p> ci-dessous est mon code - xxx

à partir du programme principal, j'appelle les sous-procédures comme suit - xxx

Je reçois des résultats ci-dessous - xxx

la réponse que j'attends est -40.939722,175.646389 (du lien de site Web ci-dessus).

Quelqu'un peut-il suggérer quelle erreur je fais dans le code ici?


1 commentaires

D'une part, le résultat renvoyé par roulement doit être converti en degré.


4 Réponses :


23
votes

Voici quelques codes qui atteignent ce que vous voulez faire.

public static GeoLocation FindPointAtDistanceFrom(GeoLocation startPoint, double initialBearingRadians, double distanceKilometres)
{
    const double radiusEarthKilometres = 6371.01;
    var distRatio = distanceKilometres / radiusEarthKilometres;
    var distRatioSine = Math.Sin(distRatio);
    var distRatioCosine = Math.Cos(distRatio);

    var startLatRad = DegreesToRadians(startPoint.Latitude);
    var startLonRad = DegreesToRadians(startPoint.Longitude);

    var startLatCos = Math.Cos(startLatRad);
    var startLatSin = Math.Sin(startLatRad);

    var endLatRads = Math.Asin((startLatSin * distRatioCosine) + (startLatCos * distRatioSine * Math.Cos(initialBearingRadians)));

    var endLonRads = startLonRad
        + Math.Atan2(
            Math.Sin(initialBearingRadians) * distRatioSine * startLatCos,
            distRatioCosine - startLatSin * Math.Sin(endLatRads));

    return new GeoLocation
    {
        Latitude = RadiansToDegrees(endLatRads),
        Longitude = RadiansToDegrees(endLonRads)
    };
}

public struct GeoLocation
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

public static double DegreesToRadians(double degrees)
{
    const double degToRadFactor = Math.PI / 180;
    return degrees * degToRadFactor;
}

public static double RadiansToDegrees(double radians)
{
    const double radToDegFactor = 180 / Math.PI;
    return radians * radToDegFactor;
}


0 commentaires

-1
votes

solution très simple dans la bibliothèque de géométrie (V3), si vous n'avez pas de problème avec l'aide de l'API V3 Google Maps (en fonction de l'application - suivi de l'actif en temps réel, par exemple - la licence gratuite n'est pas applicable ou vous ne pouvez pas Voulez-vous refacteur de V2 à V3).

1st: Déclarez une bibliothèque supplémentaire avec votre déclaration actuelle: xxx

2e: établir le point de départ, la rubrique et la distance xxx

3ème: aller là-bas xxx p> fait, vous êtes maintenant à Londres Town. Pour plus d'informations sur la calculatrice, la ComputeHeading et ComputerArea:

http://www.svennerberg.com/2011/04/calcult-distances-and-Areas-in-google-maps-api-3/

http://code.google.com /Intl/en/Apis/maps/documentation/javascript/geometry.html


0 commentaires

0
votes

ci-dessous est la mise en œuvre du code JavaScript à http: //www.movable -Type.co.uk/scripts/latlong.html que j'ai écrit pour moi-même et utiliser dans mes propres projets. Vous pouvez la mettre en œuvre à votre projet si vous voulez.

Remarque: la coordonnée est une classe avec X (longitude), Y (latitude), Z (altitude). TeaGegree () et Toradien () sont des extensions pour double type. Enfin, gettarget () est une extension d'une instance de coordonnée. xxx


0 commentaires

7
votes

Voici mon code que j'ai converti en C # de http: // www. movable-type.co.uk/scripts/latlong.html . Il devrait être assez simple à utiliser.

public static (double Lat, double Lon) Destination((double Lat, double Lon) startPoint, double distance, double bearing)
    {
        double lat1 = startPoint.Lat * (Math.PI / 180);
        double lon1 = startPoint.Lon * (Math.PI / 180);
        double brng = bearing * (Math.PI / 180);
        double lat2 = Math.Asin(Math.Sin(lat1) * Math.Cos(distance / radius) + Math.Cos(lat1) * Math.Sin(distance / radius) * Math.Cos(brng));
        double lon2 = lon1 + Math.Atan2(Math.Sin(brng) * Math.Sin(distance / radius) * Math.Cos(lat1), Math.Cos(distance / radius) - Math.Sin(lat1) * Math.Sin(lat2));
        return (lat2 * (180 / Math.PI), lon2 * (180 / Math.PI));
    }


3 commentaires

Si je peux offrir des commentaires constructifs, je pense qu'il serait préférable de modifier les noms de variables à quelque chose de plus descriptif que la plupart des gens peuvent taper facilement. Autre que ça, belle réponse: D


C'était les noms que le site que j'ai utilisé avait à Java, j'étais trop paresseux pour les changer, mais je vais faire une édition.


Pourquoi ne pouvez-vous pas montrer le rayon réel pour rendre l'exemple complète au lieu d'indiquer ce que c'est?