web-dev-qa-db-fra.com

Géolocalisation du lieu le plus proche (lat, long) de ma position

Je veux montrer des informations spécifiques en fonction de l'endroit où je suis.

J'ai cinq villes avec des informations différentes, et je veux montrer à cette ville (informations) que je suis le plus proche.

Comment faire cela de la manière la plus simple, en utilisant javascript.

Ex.

Si je stocke les villes lat, longtemps dans un tableau

var cities = [
  ['new york', '111111', '222222', 'blablabla']
  ['boston', '111111', '222222', 'blablabla']
  ['seattle', '111111', '222222', 'blablabla']
  ['london', '111111', '222222', 'blablabla']
]

Et avec ma position actuelle (lat, long), je veux la ville à laquelle je suis plus proche.

20

Voici un exemple de code de base utilisant la géolocalisation HTML5 pour obtenir la position de l'utilisateur. Il appelle ensuite NearestCity() et calcule la distance (km) entre l'emplacement et chaque ville. Je suis passé en utilisant les formules Haversine et à la place, j'ai utilisé les formules plus simples de Pythagore et une projection équirectangulaire pour ajuster la courbure en lignes de longitude.

// Get User's Coordinate from their Browser
window.onload = function() {
  // HTML5/W3C Geolocation
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(UserLocation);
  }
  // Default to Washington, DC
  else
    NearestCity(38.8951, -77.0367);
}

// Callback function for asynchronous call to HTML5 geolocation
function UserLocation(position) {
  NearestCity(position.coords.latitude, position.coords.longitude);
}


// Convert Degress to Radians
function Deg2Rad(deg) {
  return deg * Math.PI / 180;
}

function PythagorasEquirectangular(lat1, lon1, lat2, lon2) {
  lat1 = Deg2Rad(lat1);
  lat2 = Deg2Rad(lat2);
  lon1 = Deg2Rad(lon1);
  lon2 = Deg2Rad(lon2);
  var R = 6371; // km
  var x = (lon2 - lon1) * Math.cos((lat1 + lat2) / 2);
  var y = (lat2 - lat1);
  var d = Math.sqrt(x * x + y * y) * R;
  return d;
}

var lat = 20; // user's latitude
var lon = 40; // user's longitude

var cities = [
  ["city1", 10, 50, "blah"],
  ["city2", 40, 60, "blah"],
  ["city3", 25, 10, "blah"],
  ["city4", 5, 80, "blah"]
];

function NearestCity(latitude, longitude) {
  var minDif = 99999;
  var closest;

  for (index = 0; index < cities.length; ++index) {
    var dif = PythagorasEquirectangular(latitude, longitude, cities[index][1], cities[index][2]);
    if (dif < minDif) {
      closest = index;
      minDif = dif;
    }
  }

  // echo the nearest city
  alert(cities[closest]);
}
40

Avec HTML5, vous pouvez extraire l'emplacement de l'utilisateur puis comparer cet exemple à l'aide d'une fonction Haversine ( fonction ci-dessous prise à partir d'ici ):

function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) {
  var R = 6371; // Radius of the earth in km
  var dLat = deg2rad(lat2-lat1);  // deg2rad below
  var dLon = deg2rad(lon2-lon1); 
  var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2)
    ; 
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
  var d = R * c; // Distance in km
  return d;
}

function deg2rad(deg) {
  return deg * (Math.PI/180)
}
17
Pesulap

Vous pouvez calculer la distance par latitude avec votre position et celle des villes. Et trouvez le plus court et dessinez. Pour calculer, vous pouvez en savoir plus dans http://www.movable-type.co.uk/scripts/latlong.html

1
LogPi