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 P>
Lorsque j'essaie de mettre en œuvre le même code, je ne reçois pas les bons résultats. P> < p> ci-dessous est mon code - p> à partir du programme principal, j'appelle les sous-procédures comme suit - p> Je reçois des résultats ci-dessous - p> la réponse que j'attends est Quelqu'un peut-il suggérer quelle erreur je fais dans le code ici? p> p> -40.939722,175.646389 code> (du lien de site Web ci-dessus). P>
4 Réponses :
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;
}
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: p> 2e: établir le point de départ, la rubrique et la distance p> 3ème: aller là-bas p> http://www.svennerberg.com/2011/04/calcult-distances-and-Areas-in-google-maps-api-3/ P > http://code.google.com /Intl/en/Apis/maps/documentation/javascript/geometry.html p> p>
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. P>
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));
}
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 code> réel code> pour rendre l'exemple complète au lieu d'indiquer ce que c'est?
D'une part, le résultat renvoyé par roulement doit être converti en degré.