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é.