Реагировать на собственный поиск ближайшего местоположения Из местоположения пользователя

у меня есть массив местоположений (городов), и я хочу найти из моего текущего местоположения ближайший город из этого массива местоположений.

Я хотел бы проверить расстояние между местоположениями моего пользователя и моим массивом, чтобы увидеть, какое местоположение является ближайшим. Как мне это сделать?


person user137418    schedule 26.03.2018    source источник
comment
Вы используете API направления Google developers.google.com/maps/documentation/distance-matrix /введение   -  person Tech    schedule 26.03.2018


Ответы (4)


Существует довольно хорошая документация о том, как рассчитать расстояние между двумя географическими точками с примерами Javascript, которую вы можете найти здесь.

Расчет расстояния, азимута и других параметров между точками широты/долготы

На этой странице представлены различные вычисления для точек широты/долготы с формулами и фрагментами кода для их реализации.

Все эти формулы предназначены для расчетов на основе сферической Земли (игнорируя эллипсоидальные эффекты) — что достаточно точно * для большинства целей… [На самом деле Земля очень слегка эллипсоидальна; использование сферической модели дает ошибки, как правило, до 0,3%1 – дополнительные сведения см. в примечаниях].

Предполагая, что у вас есть массив с географическим расположением городов, вы можете выполнить цикл и вычислить расстояние относительно текущего местоположения пользователя, которого вы получаете, с помощью API геолокации для react-native.

person bennygenel    schedule 26.03.2018

Предполагая, что у вас есть данные в виде массива массива/объекта. Для демонстрационного кода я использую массив массивов.

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

deg2Rad = (deg) => {
  return deg * Math.PI / 180;
}

pythagorasEquirectangular = (lat1, lon1, lat2, lon2) => {
  lat1 = this.deg2Rad(lat1);
  lat2 = this.deg2Rad(lat2);
  lon1 = this.deg2Rad(lon1);
  lon2 = this.deg2Rad(lon2);
  const R = 6371;
  const x = (lon2 - lon1) * Math.cos((lat1 + lat2) / 2);
  const y = (lat2 - lat1);
  const d = Math.sqrt(x * x + y * y) * R;
  return d;
}
nearestCity = (latitude, longitude) => {
 let mindif = 99999;
 let closest;

 for (index = 0; index < cities.length; ++index) {
  const dif = this.pythagorasEquirectangular(latitude, longitude, cities[index][1], 
    cities[index][2]);
    if (dif < mindif) {
    closest = index;
    mindif = dif;
 }
 return cities[closest]
}

или что-то в этом роде. Также вы можете получить текущее местоположение, используя геолокацию. Позвоните nearestCity(lat, lon) и сообщите свои текущие широту и долготу. Надеюсь это поможет.

person Subhendu Kundu    schedule 26.03.2018
comment
а как насчет ПифагораПравильноугольный - person user137418; 26.03.2018
comment
Обновлена ​​функция pythagorasEquirectangular. Прости за это. mindif — это просто локальная переменная. - person Subhendu Kundu; 26.03.2018
comment
Соответствует ли Пифагору равнопрямоугольному обратному пути в метрах? @SubhenduKundu - person Daniel Barde; 12.10.2020

Этот метод уже использовался в предыдущей реакции, к сожалению, он не подошел для React Native. Я отредактировал код, чтобы он работал на React Native.

Код выглядит следующим образом:

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

    deg2Rad = (deg) => {
      return deg * Math.PI / 180;
    }

    pythagorasEquirectangular = (lat1, lon1, lat2, lon2) => {
      lat1 = this.deg2Rad(lat1);
      lat2 = this.deg2Rad(lat2);
      lon1 = this.deg2Rad(lon1);
      lon2 = this.deg2Rad(lon2);
      const R = 6371;
      const x = (lon2 - lon1) * Math.cos((lat1 + lat2) / 2);
      const y = (lat2 - lat1);
      const d = Math.sqrt(x * x + y * y) * R;
      return d;
    }
    nearestCity = (latitude, longitude) => {
     let mindif = 99999;
     let closest;


     for (let index = 0; index < this.cities.length; index++) {
      const dif = this.pythagorasEquirectangular(latitude, longitude, this.cities[index][1], 
        this.cities[index][2]);
        if (dif < mindif) {
        closest = index;
        mindif = dif;
        }

      }
      this.nearestPlace = closest

    }

Итак, когда вы затем this.nearestCity (yourLat, yourLon), вы найдете результат в this.nearestPlace.

person Joppe Meijers    schedule 02.03.2020

Вы можете просто использовать другой пакет для расчета расстояния, например https://github.com/cmoncrief/geodist.

Затем вы можете рассчитать расстояние между двумя точками по коду

var geodist = require('geodist')

var dist = geodist({lat: 41.85, lon: -87.65}, {lat: 33.7489, lon: -84.3881})
console.log(dist)           
// => 587
person joyqul    schedule 02.03.2020