2016-10-24 3 views
-1

Je suis actuellement capable de calculer l'altitude et l'azimut du soleil sur une date donnée, maintenant je voudrais être en mesure de pointer une flèche de n'importe quelle position actuelle sur Google Map vers la direction du soleil (basée sur les coordonnées d'altitude et l'azimut).Direction de l'emplacement actuel sur Google Maps au Soleil

Je travaille sur une application qui est censée montrer à un utilisateur la direction du soleil de l'emplacement actuel des utilisateurs.

Toutes les idées sont les bienvenues.

+0

Puisqu'il s'agit d'une carte 2D, l'altitude ne joue aucun rôle. Selon le système de coordonnées que vous utilisez, vous utiliserez sinus et cosinus pour obtenir les composants de la flèche (par exemple '(-sin (azimuth), cos (asimuth))', ceci suppose que y est l'axe nord-sud et x est l'axe ouest-est et les deux axes sont proportionnels les uns aux autres). –

+0

Merci pour votre commentaire ... Qu'est-ce que cela signifie concrètement si vous utilisez Google Maps qui utilise Altitude et Longitude? Supposons que Azimuth a la valeur 0.13224351331114464. Comment pensez-vous que je pourrais obtenir un emplacement sur Google Maps à partir de: Sin (0.13224351331114464) et Cos (0.13224351331114464)? – Toothfairy

+0

De quoi avez-vous besoin? Coordonnées sur l'écran ou les coordonnées de latitude/longitude sur le globe? –

Répondre

1

Étant donné les coordonnées géographiques lat (positives pour le nord) et long (positifs pour l'est), les coordonnées en 3D sur le globe sont (une possibilité):

/x \ /cos(lat) * sin(long) \ 
p = | y | = | cos(lat) * cos(long) | 
    \ z/ \ sin(lat)   /

La direction du nord est alors:

 /-sin(lat) * sin(long) \ 
north = | -sin(lat) * cos(long) | 
     \ cos(lat)   /

Et la direction est est:

 /cos(lat) * cos(long) \ 
east = | -cos(lat) * sin(long) | 
     \ 0     /

Compte tenu de l'azimut et l'altitude, vous pouvez obtenir la direction 3D comme:

dir = (-cos(azimuth) * north -sin(azimuth) * east) * cos(altitude) + sin(altitude) * p 

Par conséquent, pour tout scalaire positif t, vous pouvez calculer un point entre votre position sur le globe et l'objet:

pos(t) = p + t * dir 

Vous pouvez projeter la position arrière sur le globe par la normalisation:

pos_normalized(t) = pos(t)/||pos(t)|| 

, où ||pos(t)|| est la longueur de pos(t).

Et étant donné cela, vous pouvez calculer la latitude et la longitude:

lat2 = asin(pos_normalized(t).z) 
long2 = atan2(pos_normalized(t).x, pos_normalized(t).y) 

C'est un point qui se trouve dans la direction du soleil. Choisissez un nombre suffisamment petit pour le calculer (il doit être beaucoup plus petit que 1, l'unité est fondamentalement multiple du rayon de la terre). Pour certaines cartes, toutes ces positions peuvent se trouver sur une ligne. Cependant, ceci n'est pas garanti pour les cartes arbitraires. Donc, vous pourriez vouloir échantillonner quelques points et générer une polyligne à la place.