Получение радиуса в метрах / км от широты и долготы - PullRequest
0 голосов
/ 08 марта 2020

Я запрашиваю данные из бэкэнда (laravel) на основе заданного расстояния между 2 точками latitude и longitude, например. Lat = 78,3232 и Long = 65,3234 и расстояние = 30 миль / км, получите ряды в пределах 30 миль.

У меня проблема с distance.

Я использую react-native-maps, а увеличение / уменьшение основано на latitudeDelta и longitudeDelta, и я не знаю, как рассчитать их радиус / расстояние, когда пользователь увеличивает / для отправки на сервер и получения данных, основанных на точках и радиусе / расстоянии

, в данный момент у меня есть эта функция на стороне клиента. определить, когда извлекать новые данные, когда пользователь меняет регион. но у него есть проблема с жестко заданным кодом distance (5,0 км)

const _onRegionChangeComplete = (onCompletedregion: Region) => {
    if (initialRegion) {
      const KMDistance = helper.distance(         
        initialRegion?.latitude,
        initialRegion?.longitude,
        onCompletedregion.latitude,
        onCompletedregion.longitude,
        "K"
      );

      if (KMDistance > 5.0) {
        props.getNearByReports({   // request backend if distance difference more than 5 kilometers
          latitude: onCompletedregion.latitude,
          longitude: onCompletedregion.longitude
        });
      }
    }
  };

helper.distance // получить разницу в расстоянии между начальными точками и после того, как пользователь завершил изменение региона

function distance(
  lat1: number,
  lon1: number,
  lat2: number,
  lon2: number,
  unit: string
) {
  var radlat1 = (Math.PI * lat1) / 180;
  var radlat2 = (Math.PI * lat2) / 180;
  var theta = lon1 - lon2;
  var radtheta = (Math.PI * theta) / 180;
  var dist =
    Math.sin(radlat1) * Math.sin(radlat2) +
    Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
  dist = Math.acos(dist);
  dist = (dist * 180) / Math.PI;
  dist = dist * 60 * 1.1515;
  if (unit == "K") {
    dist = dist * 1.609344;
  }
  if (unit == "M") {
    dist = dist * 0.8684;
  }
  return dist;
}

Значение distance жестко закодировано в бэкэнде и во внешнем интерфейсе (что не должно быть), потому что когда пользователь увеличивает / уменьшает, радиус / расстояние также должны измениться. Я не могу рассчитать расстояние от latitudeDelta и longitudeDelta

// Код внутреннего запроса (упрощенно)

SELECT
  id, (
    6371 * acos (   
      cos ( radians(78.3232) )
      * cos( radians( lat ) )
      * cos( radians( lng ) - radians(65.3234) )
      + sin ( radians(78.3232) )
      * sin( radians( lat ) )
    )
  ) AS distance
FROM markers
HAVING distance < 5 // hard-coded distance
ORDER BY distance
LIMIT 0 , 20;

1 Ответ

0 голосов
/ 08 марта 2020

latitudeDelta - это количество degrees, которые видны на экране. 1 degree всегда равно ок. 69 miles, поэтому вы можете рассчитать диаметр видимой области в милях с помощью этого diameter = latitudeDelta * 69. Это при условии, что экран находится в портретном режиме, и, следовательно, latitudeDelta является большим значением. Если нет, используйте longitudeDelta. Надеюсь, я правильно понял ваш вопрос, и это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...