从 latitudeDelta 和 longitudeDelta 获取 meters/km 中的半径

Getting radius in meters/km from latitudeDelta and longitudeDelta

我正在根据 2 点 latitudelongitude 之间的设定距离从后端 (laravel) 请求数据,例如。 Lat= 78.3232 and Long = 65.3234 and distance = 30 miles/kilometers ,获取 30 英里以内的行。

我遇到的问题是 distance

我正在使用 react-native-maps 并且缩放 in/out 是基于 latitudeDeltalongitudeDelta 我不知道如何计算 radius/distance 其中当用户缩放时 in/out 被发送到后端并根据点和 radius/distance

获取数据

目前,我在客户端有这个功能。确定当用户更改区域时何时获取新数据。但是它有一个硬编码的问题 distance (5.0 KM)

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 值在后端和前端(不应该)硬编码,因为当用户缩放 in/out 时,radius/distance 也应该改变。我无法计算 latitudeDeltalongitudeDelta

的距离

// 后台查询代码(简体)

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;

latitudeDelta 是屏幕上可见的 degrees 的数量。 1 degree 总是等于大约。 69 miles,因此您可以使用此 diameter = latitudeDelta * 69 计算当前可见区域的直径(以英里为单位)。这是假设屏幕处于纵向模式,因此 latitudeDelta 是较大的值。如果不是,请改用 longitudeDelta。希望我正确理解了您的问题,这对您有所帮助。