2012-04-11 4 views
3

Je suis en train d'écrire une application basée sur la localisation et je veux avoir un peu de sagesse sur l'utilisation sensible de l'API.Location vs GeoPoint vs 1E6 vs Charging

Ce que j'ai compris jusqu'à présent, c'est que travailler avec int est plus efficace. Je vais devoir en stocker beaucoup et faire beaucoup de calculs de distance.

Mon application utilise un service qui implémente LocationListener et je stocke la longitude & latitude int valeurs (micro-degrés) à l'intérieur d'un db SQL (via ormlite) ainsi calculée ::

public static int degreesToMicroDegrees(double degrees){ 
    return (int)(degrees * 1E6); 
} 

Parfois, j'ai besoin de savoir quand je suis retourné à un «emplacement» particulier et en tant que tel, je récupère les valeurs int hors de la base de données pour comparer avec la dernière mise à jour de l'emplacement. Question est, quelle est la meilleure façon de comparer «emplacement» entre les valeurs int (où je l'habitude d'être) et les valeurs doubles (où je suis maintenant) dans ma dernière mise à jour de localisation?

J'ai cherché autour de quelques calculs pour réaliser le calcul de la distance et a trouvé cette ::

public static double distanceBetween(double lat1, double lng1, double lat2, double lng2) { 

      double earthRadius = 3958.75; 
      double dLat = Math.toRadians(lat2-lat1); 
      double dLng = Math.toRadians(lng2-lng1); 
      double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
        Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
        Math.sin(dLng/2) * Math.sin(dLng/2); 
      double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
      double dist = earthRadius * c; 

      return dist; 
     } 

J'ai essayé passer mes int valeurs dans comme celui-ci :: ((double) myIntValue)/1E6F Le les valeurs de distance retournées me confondent. Si je marche 100m mon application me dit judicieusement que je suis allé environ 100m en utilisant Location.distanceTo (myLastLocation). Mais si j'utilise la méthode ci-dessus par rapport à mes valeurs int stockées, je récupère la valeur zéro.

Si quelqu'un peut expliquer le format E6 ce serait génial.

1E6 est la même que 1000000?

De plus, je peux voir qu'il y a cette classe GeoPoint. J'hésite à l'utiliser car je ne sais pas si Google va facturer un grand nombre de calculs sur GeoPoints. Il semble y avoir un peu de bruit sur les frais d'utilisation des API GoogleMaps et je n'ai pas été en mesure de trouver une explication claire de la façon dont cette charge fonctionne.

Toute sagesse reçue avec reconnaissance.

Répondre

3

Just my 2cents:

1E6 est le même que 1000000.

Pour convertir votre int latitude/longitude à un double un, vous pouvez juste faire:

(double)theLat/1E6; 

Je recommande également que vous utilisez la méthode Location.distanceBetween de la classe Location.


GeoPoint n'encourra aucun coût pour votre application. Je l'utilise tout le temps. :-)

+0

Merci pour vos commentaires. J'utilise Location.distanceTo (myLastLocation) quand j'en ai besoin et cela fonctionne très bien. La plupart des calculs que je fais sont sur les valeurs int. La grande majorité sera sur des paires lat/lng stockées comme ints pour lesquelles il semble que GeoPoint soit mon ami. (Si cela n'entraîne aucun coût) –

+0

Si ma réponse est ce que vous cherchiez, assurez-vous de l'accepter pour que les autres sachent que c'est une bonne réponse! – hwrdprkns