2010-06-06 4 views
3

Je suis en train de construire une application basée sur la géolocalisation et j'essaie de trouver un moyen de rendre mon application réalisable quand un utilisateur fait face à la direction de l'emplacement donné./lat co-ord). J'ai calculé les maths, j'ai juste le triangle à construire.Construction d'un triangle basé sur des coordonnées sur une carte

// Mise à jour

Je l'ai trouvé un peu de bon ... ce

est une méthode ci-dessous qui prend une valeur à long/lat et tente de calculer un triangle trouver un point 700 mètres plus loin et un à sa gauche + à droite. Il les utiliserait ensuite pour construire le triangle. Il calcule la longitude exacte, mais la latitude se termine quelque part au large des côtes de l'Afrique de l'Est. (Je suis en Irlande!)

public void drawtri(double currlng,double currlat, double bearing){ 

    bearing = (bearing < 0 ? -bearing : bearing); 

    System.out.println("RUNNING THE DRAW TRIANGLE METHOD!!!!!"); 
    System.out.println("CURRENT LNG" + currlng); 
    System.out.println("CURRENT LAT" + currlat); 
    System.out.println("CURRENT BEARING" + bearing); 

    //Find point X(x,y) 
    double distance = 0.7; //700 meters. 
    double R = 6371.0; //The radius of the earth. 
    //Finding X's y value. 

    Math.toRadians(currlng); 
    Math.toRadians(currlat); 
    Math.toRadians(bearing); 

    distance = distance/R; 
    Global.Alat = Math.asin(Math.sin(currlat)*Math.cos(distance)+ 
      Math.cos(currlat)*Math.sin(distance)*Math.cos(bearing)); 
    System.out.println("CURRENT ALAT!!: " + Global.Alat); 
    //Finding X's x value. 
    Global.Alng = currlng + Math.atan2(Math.sin(bearing)*Math.sin(distance) 
      *Math.cos(currlat), Math.cos(distance)-Math.sin(currlat)*Math.sin(Global.Alat)); 
    Math.toDegrees(Global.Alat); 
    Math.toDegrees(Global.Alng); 


    //Co-ord of Point B(x,y) 
    // Note: Lng = X axis, Lat = Y axis. 
    Global.Blat = Global.Alat+ 00.007931; 
    Global.Blng = Global.Alng; 

    //Co-ord of Point C(x,y) 
    Global.Clat = Global.Alat - 00.007931; 
    Global.Clng = Global.Alng; 

    } 

De débogage j'ai déterminé le problème réside dans le calcul de la latitude fait ici ..

Global.Alat = Math.asin(Math.sin(currlat)*Math.cos(distance)+ 
     Math.cos(currlat)*Math.sin(distance)*Math.cos(bearing)); 

Je ne sais pas pourquoi si et ne sais pas comment le résoudre. Je suis la formule de ce site ..

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

Il semble correct et je l'ai testé plusieurs choses ...

J'ai essayé de convertir en radians puis après les calculs de retour à des degrés, etc.

Quelqu'un a-t-il trouvé des idées pour corriger cette méthode afin de mapper le triangle SEULEMENT à 700 mètres de mon emplacement actuel dans la direction à laquelle je fais face?

Merci,

Répondre

0

Le problème était que peu importe ce que jarretierais dans java produirait dans Radians, Trick devait tout changer en radians et ensuite la sortie était en radians, convertir en degrés.

1

pour longue distance: http://www.dtcenter.org/met/users/docs/write_ups/gc_simple.pdf mais courte distance Vous pouvez essayer des mathématiques simples 2d pour simuler la boussole "classique" en utilisant: http://en.wikipedia.org/wiki/Compass#Using_a_compass. Par exemple, vous pouvez obtenir des coordonnées de pixels à partir des points A et B et trouver l'angle entre la ligne reliant ces points et la ligne verticale.

aussi vous devriez probablement envisager la déclinaison magnétique: http://www.ngdc.noaa.gov/geomagmodels/Declination.jsp

// edit:

Je tentais de donner une solution intuitive. Cependant, calculer les coordonnées de l'écran à partir de long/lat ne serait pas facile, donc vous devriez probablement utiliser les formules fournies dans les liens.

+0

Je ne cherche pas vraiment à dessiner une boussole en tant que telle, je veux d'ailleurs faire une vérification pour voir si la direction dans laquelle je suis est dans la même direction que l'emplacement. Getbearing() ne fonctionnera pas comme il a gagné t mise à jour quand je ne bouge pas. Supposons que l'utilisateur est stationnaire. – Skizit

+0

exactement getbearing n'est pas utile dans ce cas, utilisez getOrientation() à la place. la rotation sur l'axe z est l'azimut. Cependant, l'orientation du périphérique de lecture est probablement la partie la plus facile de ce problème. –

+0

Oui, Android sait où je suis, l'autre endroit et il connaît mes relèvements mais je veux qu'il reconnaisse quand mon relèvement est dans la même direction que l'endroit. Comment ferais-je cela? – Skizit

0

Peut-être son parce que je ne sais pas javascript, mais avez-vous pas faire quelque chose comme

currlat = Math.toRadians(currlat);

réellement changer la valeur currlat être radians.

+0

C'est java. pas JAvascript. Aussi, j'ai déjà dit que j'ai essayé les conversions Radians + Degree. – Skizit

+0

Ok. Dans le code collé ci-dessus, Math.toRadians (currlat) ne changera pas réellement la valeur de currlat. Juste pour le nettoyer, désolé. –

Questions connexes