2010-07-04 26 views
0

comment projeter un hotspot lat/lon sur une image panoramique de 360x180 degrés?
Vous utilisez javascript?javascript: lat/lon, lat1/lon1, relèvement, distance à x, y coordonnées de l'écran?

Données réelles:
latitude/longitude en degrés décimaux et altitude en mètres:
coordonne l'appareil photo: 49,994249, 8,66539, 2
coordonnées Hotspot: 49,994163, 8,665388, 2

caméra Distance à point chaud en mètres : 9,55
Boussole portant la caméra vers le point d'accès en degrés (0-360): 170
Sens de l'image: 130 degrés (x milieu de l'image) Est-ce nécessaire?
L'horizon est au milieu de l'image.

largeur Taille de l'image: 1024, hauteur: 512 pixels

Ce que je dois le code javascript pour déterminer x, image pixel coordonnée y du point d'accès.
0 est le coin supérieur gauche.

La précision est sans importance. La distance sera toujours inférieure à 100 mètres.

Merci,
Jan
janmartin AT DOT org diy-streetview

Répondre

0

Il semble que vous avez déjà fait le plus dur: convertir les coordonnées GPS dans un gisement (et à distance). Si le centre de votre image à 360 ° pointe vers le nord à 130 ° (en tournant dans le sens des aiguilles d'une montre) et que le relèvement à partir de l'emplacement de la caméra est à 170 ° du nord, il semble que le hotspot est 40 ° sur votre image, par rapport au centre de l'image. Et, puisque l'image contient 360 ° et 1024px horizontalement, alors il semblerait que le hotspot soit situé à 1024px/360 ° * 40 ° = 114 px du centre de l'image.

Etant donné que la caméra et le point d'accès sont tous les deux à la même altitude, la hauteur relative est zéro.

Mettre cela ensemble, vous obtenez les coordonnées: 512 + 114, 256 + 0 = coordonnées: 626, 256.

Si l'altitude du point d'accès sont pas les mêmes que l'appareil photo, alors vous auriez pour calculer une hauteur en utilisant un simple trig:

Supposons d'abord que ground distance = la distance au niveau du sol entre l'emplacement de la caméra et l'emplacement du point chaud. Ce sera la même indépendamment de l'altitude de chacun. Donc, votre hauteur serait: atan [(altitude de l'hotspot - altitude de la caméra)/distance au sol].

Par exemple, si vous aviez une distance au sol de 100 m et le point d'accès à été 10.75m avec l'appareil photo à 2 m d'altitude, alors vous calculez votre emplacement comme:

pas = atan [(10.75m - 2m)/100m] = atan (8.75m/100m) = atan (0.0875) = 5 °

Pour tracer ceci sur votre panorama: 512px/180 ° * 5 ° = 14px plus haut que le milieu.Puisque le milieu est à 256px et que le coin supérieur gauche de l'image est 0,0, alors nous soustrairions 14px de 256 pour arriver à 242px.

Mettre tout cela ensemble en Javascript que vous avez demandé:

// We'll use degrees, but this would be simpler if 
// everything were computed in radians, since that 
// is how the Math methods work. 
function getRelativePitch(cameraAlt, hsAlt, groundDistance) 
{ 
    var degPerRad = 180/Math.PI; 

    if (groundDistance == 0) { return 0.0; } // fringe case 

    var rad = Math.atan((hsAlt - cameraAlt)/groundDistance); 

    // Convert to degress 
    return rad * degPerRad; 
} 

// Pretty simply this one. 
function getRelativeHeading(cameraHeading, hsHeading) 
{ 
    return hsHeading - cameraHeading; 
} 

var cameraHeading = 130; // degrees 
var hotspotHeading = 170; // degrees 
var cameraAltitude = 2; // meters 
var hotspotAltitude = 10.75; // meters 
var groundDistance = 100; // meters 

var panoWidth = 1024; // pixels 
var panoHeight = 512; // pixels 

var panoRangeX = 360; // degrees 
var panoRangeY = 180; // degrees 

var relativeHeading = getRelativeHeading(cameraHeading, hotspotHeading); 
var relativePitch = getRelativePitch(cameraAltitude, hotspotAltitude, groundDistance); 

// Now convert to pixels 
var hotspotX = Math.round(panoWidth/2 + panoWidth/panoRangeX * relativeHeading); 
var hotspotY = Math.round(panoHeight/2 - panoHeight/panoRangeY * relativePitch); 

// Just in case we endup out of range 
while (hotspotX < 0) { hotspotX += panoWidth; } 
while (hotspotX > panoWidth) { hotspotX -= panoWidth; } 

while (hotspotY < 0) { hotspotY += panoHeight; } 
while (hotspotY > panoHeight) { hotspotY -= panoHeight; } 

alert("Hotspot is at: " + hotspotX + ", " + hotspotY); 

J'espère que cela aide!