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?

Était-ce utile?

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");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top