2014-04-24 2 views
2

Mon problème est un peu délicat, apologyze si ma question n'est pas claire du tout.conversion latitude/longitude en distance

J'utilise l'API googleMap v3. l'utilisateur peut clique sur la carte pour créer une marque, s'il clique sur la marque, je donne la latitude & informations de longitude dans une infoWindow (ceci est fait et c'est OK)

Les choses que l'on essaie de faire: l'utilisateur peut donne une dimension (km/miles) et je dois dessiner un rectangle de la taille donnée (la marque de création doit être au milieu de la zone). Le problème vient des latlng ou des limites qui prennent seulement la longitude &. donc j'essaye de le convertir.

Voici la partie principale du code.

//latitude 
// 1°lat = 111,11 km 
//for me: 1km = 0.00900 . 

//longitude 
//1°lat = 111,11 km * cos latitude 
// for me : 1 km = ((1/Math.cos(latitude)) /111.11) 

var myBounds = new Array(); 

var longkm = 5; 
var largkm = 2; 
myBounds[0] = new google.maps.LatLngBounds(
    new google.maps.LatLng(positionmarqueur.lat()-(0.009*longkm), positionmarqueur.lng()-(Math.abs(((1/Math.cos(positionmarqueur.lat()-(0.009*longkm))) /111.11))*largkm)), 
    new google.maps.LatLng(positionmarqueur.lat()+(0.009*longkm), positionmarqueur.lng()+(Math.abs(((1/Math.cos(positionmarqueur.lat()+(0.009*longkm))) /111.11))*largkm)) 
); 

var overlay1 = new google.maps.Rectangle({ 
    map: map, 
    bounds: myBounds[0], 
    strokeColor: "green", 
    strokeWeight: 1 
}); 

var longkm = 10; 
var largkm = 10; 
myBounds[1] = new google.maps.LatLngBounds(
    new google.maps.LatLng(positionmarqueur.lat()-(0.009*longkm), positionmarqueur.lng()-(Math.abs(((1/Math.cos(positionmarqueur.lat()-(0.009*longkm))) /111.11))*largkm)), 
    new google.maps.LatLng(positionmarqueur.lat()+(0.009*longkm), positionmarqueur.lng()+(Math.abs(((1/Math.cos(positionmarqueur.lat()+(0.009*longkm))) /111.11))*largkm)) 
); 

var overlay2 = new google.maps.Rectangle({ 
    map: map, 
    bounds: myBounds[1], 
    strokeColor: "blue", 
    strokeWeight: 1 
}); 

Ce shoud dessiner un rectanle et un 5,2 rectangle 10,10 (bien, un carré 10 km) (pour info: var = positionmarqueur latlng, ci-dessus dans le code)

si je prends un coup d'oeil au résultat: le premier rectangle a l'air de plus de 50/20 km. (Ai-je fait une erreur quand je divise? avec un facteur 10? Je ne suis pas très bon en mathématique, mais il semble correct).

Le .... il suffit de regarder seconde comme un rectangle de 200 * 40 km ....

So. Où est le problème? La formule est-elle fausse? Ou je suis juste idiot et il me manque quelque chose?

Thinqs.

Répondre

2

L'algorithme à utiliser est

var largkm = 5, 
     longkm = 10; 

    var bounds = new google.maps.LatLngBounds(
    new google.maps.LatLng(positionmarqueur.lat() - ((largkm/2)/110.54), positionmarqueur.lng() - ((longkm/2)/(Math.cos(positionmarqueur.lat())*111.32))), 
    new google.maps.LatLng(positionmarqueur.lat() + ((largkm/2)/110.54), positionmarqueur.lng() + ((longkm/2)/(Math.cos(positionmarqueur.lat())*111.32))) 
); 

(Note: je partagerai la taille du rectangle par 2 puisque nous définissons les limites du centre)

Démo àhttp://jsfiddle.net/gaby/a5QVM/


Mettre à jour

Vous devez utiliser la bibliothèque google geometry qui utilise la projection utilisée par google maps, afin que les transformations soient précises. (vous devez changer l'URL de l'API Google pour http://maps.googleapis.com/maps/api/js?libraries=geometry&sensor=false)

Plus spécifique que vous devriez utiliser la méthode google.maps.geometry.spherical.computeOffset

var rectbounds = new google.maps.LatLngBounds(
    spherical.computeOffset(spherical.computeOffset(positionmarqueur, longkm*1000/2, -90),largkm*1000/2,0), 
    spherical.computeOffset(spherical.computeOffset(positionmarqueur, longkm*1000/2, 90), largkm*1000/2,180) 
); 

Mise à jour démo àhttp://jsfiddle.net/a5QVM/10/
(le *1000 est à convertir la distance en mètres comme c'est ce que l'on attend de la méthode computeOffset)

+0

il y a un truc si vous utilisez la position Clermont-ferrand (45.7581263,3.1317803). Je vais éditer le jsfiddle et la réponse valide – ssbb

+0

Êtes-vous sûr de la formule? Je veux dire, si vous dessinez un 100/100km, ce n'est pas vraiment un carré, c'est un rectangle, ça vient d'une approximation javascript? Ou je le vois comme ça sur googlemap à cause de l'inclinaison de la terre? – ssbb

+0

@ssbb mise à jour réponse avec une solution plus précise (* qui utilise des méthodes google pour effectuer la transformation *) –

Questions connexes