transformer longitude latitude en mètres
-
26-09-2019 - |
Question
J'ai besoin d'une fonction qui cartes gps de la position de x/y, les valeurs comme ceci:
getXYpos(GeoPoint relativeNullPoint, GeoPoint p){
deltaLatitude=p.latitude-relativeNullPoint.latitude;
deltaLongitude=p.longitude-relativeNullPoint.longitude;
...
resultX=latitude (or west to east) distance in meters from p to relativeNullPoint
resultY=longitude (or south to north) distance in meters from p to relativeNullPoint
}
j'ai vu que certaines implémentations de "distance de deux geoPoints" mais ils ont tous simplement calculer la distance à vol d'.je pense que le deltaLongitude peut être transformé en mètres, mais l'deltaLatitude dépend de la Longitude.personne ne sait comment ce problème peut être résolu?
La solution
Pour commencer, je pense que vous avez votre latitude et longitude renversée.Longitude mesures de X, et la latitude des mesures Y.
La latitude est facile de se transformer en une distance nord-sud.Nous savons que la 360 degrés est un cercle complet autour de la terre à travers les pôles, et cette distance est 40008000 mètres.Tant que vous n'avez pas besoin de compte pour les erreurs dues à la terre n'étant pas parfaitement sphérique, la formule est deltaLatitude * 40008000 / 360
.
La partie la plus délicate est la conversion de longitude à l'X, comme vous soupçonne.Car il dépend de la latitude que vous devez décider de la latitude que vous allez utiliser - vous pouvez choisir la latitude de votre origine, de la latitude de votre lieu de destination, ou un point arbitraire entre les deux.La circonférence à l'équateur (latitude 0) est 40075160 mètres.La circonférence d'un cercle à une latitude sera proportionnelle au cosinus, donc, la formule sera deltaLongitude * 40075160 * cos(latitude) / 360
.
Edit: Votre commentaire indique que vous avez eu quelques ennuis avec la longitude de la formule;vous pourriez avoir utilisé degrés au lieu de radians dans l'appel à cos
, c'est une erreur de débutant.Assurez-vous il n'y a pas d'ambiguïté, ici du travail code en Python.
def asRadians(degrees):
return degrees * pi / 180
def getXYpos(relativeNullPoint, p):
""" Calculates X and Y distances in meters.
"""
deltaLatitude = p.latitude - relativeNullPoint.latitude
deltaLongitude = p.longitude - relativeNullPoint.longitude
latitudeCircumference = 40075160 * cos(asRadians(relativeNullPoint.latitude))
resultX = deltaLongitude * latitudeCircumference / 360
resultY = deltaLatitude * 40008000 / 360
return resultX, resultY
J'ai choisi d'utiliser le relativeNullPoint latitude pour le X de calcul.Ceci a l'avantage que si vous convertissez plusieurs points avec la même longitude, ils auront les mêmes X;lignes nord-sud sera à la verticale.
Modifier à nouveau: Je devrais avoir souligné qu'il s'agit d'une formule très simple, et vous devez connaître ses limites.Évidemment, la terre n'est pas plate, de sorte que toute tentative de la carte de coordonnées XY va impliquer des compromis.La formule que j'ai calculé ci-dessus fonctionne mieux lorsque la zone que vous êtes la conversion est assez petit pour envisager plat, et où la légère courbure et de la non-parallélisme des lignes nord-sud peut être ignoré.Il y a toute une science de projections cartographiques;si vous voulez voir certains de possibilités, un bon endroit pour commencer serait Wikipédia.Cette projection est connu comme la projection Équirectangulaire, avec un supplément de mise à l'échelle.
Autres conseils
La fonction Harvesine est ce dont vous avez besoin. Vérifiez-le à types mobiles Il y a la distance, le roulement, le point médian et d'autres choses que la mise en œuvre JavaScript fonctionne vraiment bien.
METTRE À JOUR
J'ai trouvé une implémentation Java de la fonction Harvesine Dans une autre question de stackOverflow
Il y a des bibliothèques sur jstott.me.uk pour Php, Java et Javascrip qui font ça, par exemple
var lld1 = new LatLng(40.718119, -73.995667); // New York
document.write("New York Lat/Long: " + lld1.toString() + "<br />");
var lld2 = new LatLng(51.499981, -0.125313); // London
document.write("London Lat/Long: " + lld2.toString() + "<br />");
var d = lld1.distance(lld2);
document.write("Surface Distance between New York and London: " + d + "km");