Suite

Pourquoi ma polyligne est-elle sur le mauvais relèvement ?


J'essaie de superposer des segments de polylignes en double sur une carte via javascript. J'utilise latlon.js et geo.js d'ici

L'idée est qu'un utilisateur puisse saisir la distance qu'il a parcourue et lorsque la carte est actualisée, une deuxième multipolyligne sera ajoutée. Pour calculer le point qui représente l'endroit où se trouve actuellement l'utilisateur, j'utilise un emplacement précédent connu et un "emplacement suivant" connu pour calculer un relèvement entre les deux, puis j'utilise ce relèvement, combiné à la distance parcourue par l'utilisateur pour calculer où ils le sont maintenant, avant de finalement créer une nouvelle polyligne basée sur ces données.

Le problème est que cette nouvelle polyligne est mal dessinée sur ma carte et je ne comprends pas pourquoi. Vous pouvez voir le problème sur [supprimé]. Connectez-vous en tant qu'utilisateur2/pass2, puis sélectionnez « défis » dans la barre de navigation. Le code le plus pertinent de map.js suit. J'utilise des cartes dépliantes.

var userDistance = GymloopChallenge.user_distance; var dernierPoint; var comparaisonArr = []; //utilisé pour calculer le relèvement if (userDistance <= dist1) { comparaisonArr = [rioLL,laLL]; distToAdd = Math.abs(userDistance); userPoly = []; dernierPoint = rioLL; console.log('si 1'); } else if(userDistance >= dist1 && userDistance <= dist2 ) { comparaisonArr = [laLL,nyLL]; distToAdd = Math.abs(dist2 - userDistance); userPoly = [ligne5]; dernierPoint = laLL; console.log('si 2'); } else if (userDistance > dist2 && userDistance <= dist3) { comparaisonArr = [nyLL,lonLL]; distToAdd = Math.abs(userDistance - dist3) ; userPoly = [ligne5, ligne1]; dernierPoint = nyLL; console.log('si 3'); } else if (userDistance > dist3 && userDistance <= dist4) { comparaisonArr = [lonLL,sydLL]; distToAdd = Math.abs(userDistance - dist4) ; userPoly = [ligne5, ligne1, ligne2]; dernierPoint = lonLL; console.log('si 4'); } else if (userDistance > dist4 && userDistance <= dist5) { comparaisonArr = [sydLL,tokLL]; distToAdd = Math.abs(userDistance - dist5) ; userPoly = [ligne5, ligne1, ligne2, ligne3]; dernierPoint = sydLL; console.log('si 5'); } console.log("Distance à ajouter : "+ distToAdd) //console.log("Tableau de comparaison : "+comparisonArr); var roulement = comparaisonArr[0].finalBearingTo(comparisonArr[1]); var userLocation = lastPoint.destinationPoint(bearing, distToAdd); //console.log(userLocation); userLineStartPoint = new L.LatLng(lastPoint._lat,lastPoint._lon ); userLocationMapPoint = new L.LatLng(userLocation._lat,userLocation._lon ); userPoly.push(new Array(userLineStartPoint ,userLocationMapPoint)); console.log(userPoly); var userPolyline = new L.MultiPolyline(userPoly, { color: 'red', id:'poly2', weight: 3, opacity: 0.8 }); map.addLayer(userPolyline);

Il semble que vous utilisiez les mauvaises fonctions dans latlon.js car votre carte est dans une projection Mercator.

Avec ce type de projection, les lignes droites de gisement constant sont appelées lignes de rhumb, ou loxodromes. Ces lignes sont idéales pour la navigation car vous définissez un cap et vous dirigez dans cette direction, mais ce n'est pas le chemin le plus court. Pour cela, vous auriez besoin d'un grand cercle, qui apparaîtra incurvé sur une projection de Mercator (pensez aux pistes de missiles dans le film War Games).

Parce que vous n'avez affaire qu'à une représentation simple d'un voyage entre les villes du monde et que les lignes droites sont faciles à tracer, vous devez utiliser des calculs loxodromiques. Heureusement, latlon.js ne fournit que les fonctions dont vous avez besoin :rhumbDistanceVers(),rhumbRoulementVers(), etrhumbPointDestination(), qui devraient remplacer les fonctions que vous utilisez déjà.

Si vous vouliez des distances orthodromiques, regardez le code du premier exemple sur la page Movable Type. Mais je dirais que c'est plus difficile à saisir pour votre utilisateur moyen, car les distances réelles n'ont pas de relation linéaire avec les distances projetées.


Voir la vidéo: Le passage ne sera pas très difficile (Octobre 2021).